정규화 (Normalization)
- 정상화, 표준화랑 같은 말
DB의 가장 중요한 특징 중 하나
-> 무결성 (데이터의 중복 없이)
중복을 제거하는 것이 중요!
So, '정규화'란 db의 가장 중요한 덕목 중 하나인 중복을 없애는 방법에 대해 말하는 것
- Atomic Columns (각 컬럼들이 하나하나 atomic 해야한다)
-> 각 컬럼 안에 '하나'의 값만을 가질 것
이 경우에 아래와 같은 식을 사용 불가
SELECT * FROM topic WHERE tag = 'fee';
SELECT * FROM topic ORDER BY tag;
-> 1 정규화을 적용하긴 하였으나, 데이터 중복의 문제 존재
-> 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가 오는 것처럼.
-> 이에 맞추어 테이블을 만들어줌 (컬럼명도 명확하게)
- No partial dependencies (부분 종속성이 없어야 한다)
중복이 발생함
- 이유 : title에만 '부분 종속성'이 있기 때문에
topic 테이블은 title, type, price를 위한 표. 다른 부분은 새롭게 만들어준다.
- No transitive dependencies (이행적 종속성)
author_id는 title에 종속되지만, author_name, author_profile의 경우에는 author_id에 종속됨.
즉, 이행적 종속성이 나타나고 있음. (중복의 향기!)
혹 author_id가 없다고 하더라도, 컬럼명에 prefix가 있는 것을 보고 '독립시킬 가능성이 큰 아이다'라고 무의식적으로 느꼈을 것.
-> 이 경우 따로 테이블 만들어주고 author_id 주어서 연결시켜주면 됨
출처 : https://youtu.be/iu8W0zCiGb8
쿼리식의 결과가 없을 수도 있지. (0) | 2022.03.15 |
---|---|
js) find, map, filter (0) | 2022.02.17 |
mysql) cli를 활용하여 docker 내 mysql 접속하기 (0) | 2022.02.13 |
환경 설정) test run (feat. debug) (0) | 2022.02.09 |
호스팅형 vs 설치형 (feat. Cloud hosting vs Self hosting) (0) | 2022.02.07 |