정규화
- 데이터 저장을 논리적으로, 효율적으로 하기 위해 테이블을 분리하는 것
- 너무 많이 정규화하면 JOIN 수도 많아져 성능 저하가 생김
제1정규화(1NF)
| 이름 |
메뉴 |
| 김용훈 |
apple, banana, berry |
| 이름 |
메뉴1 |
메뉴2 |
메뉴3 |
| 김용훈 |
apple |
banana |
berry |
- 이런 테이블을 아래와 같이 여러 row로 만들어야 한다. 필요하다면 FK를 사용해 새로운 테이블로 분리해도 된다.
| 이름 |
메뉴 |
| 김용훈 |
apple |
| 김용훈 |
banana |
| 김용훈 |
berry |
제2정규화(2NF)
- 모든 속성은 모든 기본키에 종속되어야 한다.
- 부분 함수적 종속이 있으면 제거해야 한다. (완전함수적 종속을 만든다)
- 기본키가 2개 이상(N개)일 때, N개 미만의 기본키에 종속되는 속성이 있으면 안된다.
| 주문번호(PK) |
userID(PK) |
이름 |
메뉴 |
| 1234 |
1 |
김용훈 |
apple |
| 2345 |
2 |
mike |
banana |
| 3234 |
3 |
sully |
berry |
- 이름 속성은 userID에만 종속되므로 다음과 같이 분리해야한다.
| 주문번호(PK) |
userID(FK) |
메뉴 |
| 1234 |
1 |
apple |
| 2345 |
2 |
banana |
| 3234 |
3 |
berry |
| userID(PK) |
이름 |
| 1 |
김용훈 |
| 2 |
mike |
| 3 |
sully |
제3정규화 (3NF)
- 기본키가 아닌 속성들 간에는 서로 종속관계가 있으면 안된다.
- 이행적 함수 종속을 없앤다.
| 주문번호(PK) |
userID |
이름 |
메뉴 |
| 1234 |
1 |
김용훈 |
apple |
| 2345 |
2 |
mike |
banana |
| 3234 |
3 |
sully |
berry |
- 이 경우 userID와 이름 간 종속관계가 있으므로 아래와 같이 분리한다.
| 주문번호(PK) |
userID(FK) |
메뉴 |
| 1234 |
1 |
apple |
| 2345 |
2 |
banana |
| 3234 |
3 |
berry |
| userID(PK) |
이름 |
| 1 |
김용훈 |
| 2 |
mike |
| 3 |
sully |
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.