상세 컨텐츠

본문 제목

db) 정규화

TIL (Today I Learned)

by NayC 2022. 3. 6. 09:39

본문

728x90
정규화 (Normalization) 
- 정상화, 표준화랑 같은 말
 
DB의 가장 중요한 특징 중 하나 
-> 무결성 (데이터의 중복 없이)
 
중복을 제거하는 것이 중요! 
So, '정규화'란 db의 가장 중요한 덕목 중 하나인 중복을 없애는 방법에 대해 말하는 것

 

1  정규화

- Atomic Columns (각 컬럼들이 하나하나 atomic 해야한다) 

-> 각 컬럼 안에 '하나'의 값만을 가질 것

 

이 경우에 아래와 같은 식을 사용 불가

SELECT * FROM topic WHERE tag = 'fee';
SELECT * FROM topic ORDER BY tag;

 


 

문제 1 

 

-> 1 정규화을 적용하긴 하였으나, 데이터 중복의 문제 존재

 

 

문제 2 

 

-> 1 정규화 적용 & 데이터 중복 문제를 해결하였으나, 

     1) 테이블 구조를 바꾼 문제

     2) 만약에 tag가 하나밖에 없다면 새로 만들어준 공간이 낭비가 됨 

 

해결 

topic 과 tag 테이블을 쪼갠다. 

topic m n tag
  (rdb를 보면 알 수 있듯) 하나의 tag는 여러개의 topic을 가질 수 있음 하나의 topic이 여러개의 tag를 가질 수 있으므로  

-> n:m 관계 (다대다 관계) 

 

n:m 관계는 테이블을 쪼개는 것을 넘어서 mapping 테이블을 만들어 주어야 함. 

 

 

1) tag 테이블을 따로 만들어준다. 

- rdb, free, commercial

 

2) topic과 tag의 관계를 나타내는 테이블을 추가로 만들어 준다.

- 위에 정규화되지 않은 식을 보면, tag는 topic의 title에 따라 나뉘는 것을 확인 가능 

   예를 들어서 MYSQL이면 rdb, free가 오는 것처럼. 

-> 이에 맞추어 테이블을 만들어줌 (컬럼명도 명확하게)

 


 

2 정규화 

- No partial dependencies (부분 종속성이 없어야 한다)

 

 

중복이 발생함

- 이유 : title에만 '부분 종속성'이 있기 때문에 

topic 테이블은 title, type, price를 위한 표. 다른 부분은 새롭게 만들어준다. 

 


 

해결

 


 

3 정규화 

- No transitive dependencies (이행적 종속성)

 

 

author_id는 title에 종속되지만, author_name, author_profile의 경우에는 author_id에 종속됨.

즉, 이행적 종속성이 나타나고 있음. (중복의 향기!) 

 

혹 author_id가 없다고 하더라도, 컬럼명에 prefix가 있는 것을 보고 '독립시킬 가능성이 큰 아이다'라고 무의식적으로 느꼈을 것. 

-> 이 경우 따로 테이블 만들어주고 author_id 주어서 연결시켜주면 됨

 


 

해결

 

 

 

 

 출처 : https://youtu.be/iu8W0zCiGb8

 

728x90
반응형

관련글 더보기