Log to grow

[rdbms] DB schema 설계시 주의할 점 2가지(확장성, 정규화) 본문

BE/rdb

[rdbms] DB schema 설계시 주의할 점 2가지(확장성, 정규화)

kkkrrr 2020. 11. 8. 10:06

 

DB를 설계할 때 쉽게 실수할 수 있는 부분이 2가지 있다.

바로 확장성을 고려하지 않는 것과 정규화를 하지 않는 것이다.

이 경우, 데이터의 구조가 변했을 때 쉽게 설계를 수정할 수 없고, 중복 레코드를 발생시킨다.

 

1. 확장성

1.1 Primary key에 의미를 부여하지 말자.

primary key는 just index로서의 역할만할 뿐, 의미를 부여하는 순간 확장성이 무너진다. 

 

1.2 NULL을 허용해야 하는지 고려하자.

- 반드시 속성의 값이 존재해야 하는지 꼭 고려해야 한다.

ex) 학교에서의 특수반 -> 특수반은 모든 학년이 포함될 수 있으므로 학년 ID(FK)가 NULL일 수 있음

student_id (PK) student_name grade (FK) class  
1 김철수 1 1  
2 박영희 2 3  
3 바둑이 NULL 특수반  

 

- NULL은 수집되지 못한 데이터를 뜻하기도 한다.

만약 어떤 속성에 NULL을 허용하지 않았다면, 이 속성이 수집되지 않았을 때 표현할 수 있는 방법이 없다.

이 경우 수집되지 않은 데이터에 대한 처리를 위해 가능성이 있다면 반드시 NULL을 허용해야 한다.

 

1.3 고정관념으로 column을 생략하지 말자.

위와 똑같은 예제로 설명할 수 있다.
어차피 반은 1,2,3반이니 class 속성을 int로 정의하고 class_name을 생략한다고 하면 특수반을 고려할 수 없다.

또한, 어떤 학교는 반에 이름을 붙여 표시한다면 (우반, 열반) 이 경우 표현할 수 없다.

student_id (PK) student_name grade (FK) class_id(FK) class_name
1 김철수 1 1 NULL
2 박영희 2 3 NULL
3 바둑이 NULL 10 특수반

 

 

 

2. 정규화

2.1. 속성은 반드시 하나의 값을 가져야 한다. (제 1 정규화)

- 정규화 되지 않은 table

user_id user_name device
1 김철수 아이폰 12, 갤럭시s20

device 칼럼에 두 개의 값이 포함되어 있으므로 정규화에 어긋난다.

따라서, 두 개의 테이블로 나눠 정규화한다.

 

- user 테이블

user_id user_name
1 김철수

- device 테이블

id user_id device
1 1 아이폰 12
2 1 갤럭시s 20

 

Comments