Theory
Database
데이터베이스 정규화

이상현상

불필요한 데이터 중복으로 인해 릴레이션에 대한 데이터 삽입, 수정, 삭제 연산을 수행할 때 발생할 수 있는 부작용

삽입 이상

릴레이션에 새 데이터를 삽입하려면 불필요한 데이터도 함께 삽입해야 하는 문제


👆 이벤트 참여를 하지 않은 경우에 이벤트 릴레이션에 삽입이 불가능하게 되는 문제를 일으킬 수 있다.

갱신 이상

릴레이션의 중복도니 투플들 중 일부만 수정하여 데이터가 불일치하게 되는 모순이 발생하는 문제


👆 분명 같은 고객아이디인데 등급이 다르다는 데이터 불일치 현상이 생길 수 있다.

삭제 이상현상

릴레이션에서 투플을 삭제하면 꼭 필요한 데이터까지 연쇄 삭제 되는 현상


👆 고객이 이벤트 참여를 취소했을뿐인데 고객 정보까지 날아가는 현상이 생긴다.

함수적 종속성

FD; Functional Dependency

함수 종속

X가 Y를 함수적으로 결정한다. == Y가 X에 함수적으로 종속되어 있다.


ℹ️

함수
X -> Y 하나의 X 값에 대해서 Y 값이 항상 하나만 존재해야 한다.

예시


함수 종속 다이어그램 👇


완전 함수 종속


완전 함수 종속(FDD; Full Functional Dependency)

  • 릴레이션에서 속성 집합 Y가 속성 집합 X에 함수적으로 종속되어 있지만, 속성 집합 X의 전체가 아닌 일부분에 종속되지 않음을 의미
  • 👇 아래 그림에서보면 당첨 여부는 {고객 아이디, 이벤트 번호}라는 속성 그룹에 완전 함수 종속되어 있음
  • 하지만, 고객이름은 고객 아이디에만 종속이 되어 있으므로 완전 함수 종속이 아님

부분 함수 종속

부분 함수 종속(PFD; Partial Functional Dependency)

  • 릴레이션에서 속성 집합 Y가 속성 집합 X의 전체가 아닌 일부분에도 함수적으로 종속됨을 의미
  • 👇 아래 그림에서보면 고객이름은 {고객아이디, 이벤트번호}에 부분 함수 종속됨

이행적 함수 종속

이행적 함수 종속(transitive FD; Transitive Functional Dependency)

  • 릴레이션을 구성하는 세 개의 속성 집합 X, Y, Z에 대해서 함수 종속 관계 X 👉 Y와 Y 👉 Z가 존재하면 논리적으로 X 👉 Z가 성립되는데, 이것을 Z가 X에 이행적으로 함수 종속되었다고 함

정규화

  • 이상현상이 발생하지 않도록, 릴레이션을 관련 있는 속성들로만 구성하기 위해 릴레이션을 분해(decomposition)하는 과정
  • 함수적 종속성을 판단하여 정규화를 수행한다.
  • 정규화를 통해 릴레이션은 무손실 분해(nonloss decomposition)되어야 한다.
    • 릴레이션은 의미적으로 동등한 릴레이션들로 분해되어야 하고 분해로 인한 정보의 손실이 발생하지 않아야 한다.
    • 분해된 릴레이션들을 자연 조인하면 분해 전의 릴레이션으로 복원 가능해야 한다.
  • 총 6가지 정규형이 있을 수 있다.
    • 기본 정규형 : 제 1 ~ 3 정규형, 보이스/코드 정규형
    • 고급 정규형 : 제 4 ~ 5 정규형

제 1정규형

릴레이션에 속한 모든 속성의 도메인이 원자값(atomic value)으로만 구성되어 있으면 제 1정규형에 속한다.
👉 쉽게 말해서 하나의 컬럼에는 하나의 값만 들어와야 한다.

👇 제 1 정규형이 지켜지지 않은 예시


제 2정규형

릴레이션이 제 1 정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속이 되어 있으면 제 2정규형에 속한다.

예를 들어서, 아래와 같은 테이블이 있다고 가정할 때 등급과 할인율은 (고객 아이디, 이벤트 번호)에 대해서 부분 함수 종속 관계이다.
그래서 이 테이블은 제 2 정규형이 아니다.

고객아이디이벤트번호당첨여부등급할인율
appleE001Ygold10%
appleE002Ngold10%
appleE010Ygold10%
bananaE002Nvip20%
bananaE005Yvip20%
carrolE003Ygold10%
carrolE007Ygold10%
orangeE004Nsilver5%

👆 위의 테이블을 제 2 정규형을 적용시키면

고객아이디등급할인율
applegold10%
bananavip20%
carrolgold10%
orangesilver5%

위와 같은 유저 테이블과

고객아이디이벤트번호당첨여부
appleE001Y
appleE002N
appleE010Y
bananaE002N
bananaE005Y
carrolE003Y
carrolE007Y
orangeE004N

위와 같은 이벤트 참여 릴레이션으로 분리시킬 수 있다.

제 3정규형

이행적 함수 종속 관계를 제거한 릴레이션을 제 3 정규형이라고 한다.
위에서 살펴보았던 유저 테이블은 제 3정규형이 아니다. 왜냐면 고객 아이디에 의해 등급이 결정되고, 등급에 의해 할인율이 결정되기 때문이다.

고객아이디등급할인율
applegold10%
bananavip20%
carrolgold10%
orangesilver5%

👆 테이블을 제 3정규형을 적용을 시켜보면 아래와 같은 등급 테이블과

등급할인율
gold10%
vip20%
silver5%

아래와 같은 유저 테이블로 분리시킬 수 있다.

고객아이디등급
applegold
bananavip
carrolgold
orangesilver

역정규화

  • 정규화된 릴레이션을 다시 합치는 과정
  • 하는 이유 : 매번 조회가 되는 테이블 관계가 있을 때 매번 조인을 하게되면 성능상의 문제가 발생할 수 있으므로 이를 해결하기 위해서 다시 테이블 두 개를 합치는 과정을 의미한다.

참고 블로그 (opens in a new tab)

Reference

http://www.kocw.net/home/search/kemView.do?kemId=1163794 (opens in a new tab)