본문 바로가기

Database

데이터 베이스 모델링과 정규화

 

데이터모델링

데이터 모델링이란 구축할 DB 구조를 약속된 표기법에 의해 표현하고 설계해 나가는 과정을 의미

데이터모델링 단계

  1. 개념적 데이터 모델링

추상화된 DB구조를 그리는 것

  1. 논리적 데이터 모델링

각종 ERD 툴을 사용하여 구체적으로 데이터베이스 설계. 각 데이터의 타입, 관계, key등을 지정

  1. 물리적 데이터 모델링

실제 데이터베이스를 만드는 과정이고, SQL 작성이 여기에 해당

테이블들의 참조관계

1:n

n:1

1:1 - 1:1을 보장하기 위해서는 fk에 unique조건을 적용

n:m

만약 여러 author가 하나의 게시글을 수정할 수 있다면 n:m관계

한 게시글에 여러 저자를 저장해야하는데 author_id에 리스트가 들어갈 수 없으므로 문제가 있음

n:m 관계는 정규화에 위반될 가능성이 있음

연결테이블을 만들어 1:n, n:1 관계로 풀어주는 것이 일반적인 해결책

author_post와 같은 교차 테이블(Junction Table) 필요

optional / mandatory

관계가 있는 테이블에서 A 테이블이 있으면 꼭 B테이블이 있어야 하면 mandatory

not null을 사용하여 적용시킴

B테이블이 없어도 되면 optional

1:1 관계 분리 필요성

테이블을 나누면 프로그램도 나누기 때문에 영향도를 줄일 수 있음

→ 도메인의 명확한 분리

→ 유지보수성 상승

 

업그레이드된 board 테이블 설계

 

 

CREATE table author (
id int primary key auto_increment, 
name varchar(255), email varchar(255) not null unique, 
created_time datetime default current_timestamp);

CREATE table post (
id int primary key auto_increment,
title varchar(255) not null,
contents varchar(3000));

CREATE table author_post (
id int primary key auto_increment,
author_id int not null,
post_id int not null,
foreign key(author_id) references author(id) on delete cascade on update cascade,
foreign key(post_id) references post(id) on delete cascade on update cascade) ;

CREATE table author_address (
id int primary key auto_increment,
city varchar(255),
street varchar(255),
author_id int not null unique,
foreign key(author_id) references author(id));

정규화

  • 1차 정규화(도메인 분해)

각 열에는 하나의 값만 있어야 함을 의미→ 하나의 컬럼에 여러 원자값이 존재시, 조회조건을 통한 조회 어려움 발생

  • 2차 정규화(부분종속 제거)

기본키가 아닌 모든 속성이 기본키에 완전 함수 종속된 상태를 의미

사실상 해당 테이블에 어울리지 않는 컬럼 분리 작업

  • 3차 정규화(이행종속(transitive depency)제거)

기본키에 이행적 함수 종속이 되지 않아야 한다는 말은, 기본키가 아닌 다른 속성에 종속적인것이 문제가 되는 것. 이는 사실상 독립된 테이블로 분리되어야 할 성격의 컬럼들임을 의미.

Dump

# local에서 sql 덤프 파일 생성
mysqldump -u root -p  board > dumpfile.sql

# 한글 깨질 때
mysqldump -u root -p  board -r dumpfile.sql

# dump 파일을 github에 업로드
# 리눅스에서 mariadb 설치
sudo apt-get install mariadb-server

# mariadb 서버 시작
sudo systemctl start mariadb

# mariadb 접속 테스트
sudo mariadb -u root -p

# git clone 받기
git clone 리포지토리

# 덤프 파일을 통해 데이터베이스 복원
mysql -u root -p board < dumpfile.sql

'Database' 카테고리의 다른 글

Redis 설치 및 접속하기  (0) 2024.05.24
mariadb 사용자 관리와 프로시저  (1) 2024.05.23
mariadb join, union, subquery, group by  (1) 2024.05.22
트랜잭션의 이해와 JOIN  (0) 2024.05.20
Database 데이터 타입과 제한 조건  (0) 2024.05.17