정규화

  • 데이터 저장을 논리적으로, 효율적으로 하기 위해 테이블을 분리하는 것
  • 너무 많이 정규화하면 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