Home [CS] DB: 정규화란?
포스트
취소

[CS] DB: 정규화란?

정규화

정규화란, 관계형 데이터베이스의 설계에서 중복을 최소화하고, 독립적인 관계를 가진 속성을 분리시켜 데이터를 구조화하는 작업을 말한다.

정규화의 기본 목표는 관련이 없는 함수 종속성은 별개의 릴레이션으로 표현하는 것이다.

  • 함수적 종속이란, 어떤 릴레이션 R의 속성 X와 Y에 대해, X의 값을 알면 Y의 값을 바로 식별할 수 있고, X의 값에 Y의 값이 달라질 때, Y는 X에 함수적 종속이라고 한다. 학번을 알면 학생의 이름을 알 수 있는 것.

정규형

제1정규형

릴레이션의 모든 도메인이 더 이상 분해될 수 없는 원자 값(Atomic value)만으로 구성되어 있어 반복 그룹이 없는 상태를 말한다. 즉, 하나의 기본키에 두 개 이상의 값을 가지는 속성 집합이 있어서는 안된다는 것이다.

학번이름과목 번호
231701석규(AP010, AP011)
231702상범(AP010, AP120)

위 테이블은 과목 번호에 반복 그룹이 있기 때문에 제1정규형을 만족하지 못한 상태이다.

제1정규형을 만족시키려면 아래와 같이 수정해주면 된다.

학번이름과목 번호
231701석규AP010
231701석규AP011
231702상범AP010
231702상범AP120

제2정규형

릴레이션이 제1정규형을 만족하고, 부분 함수의 종속성이 제거된 형태를 말한다. 즉, 기본키가 아닌 모든 속성이 기본키에 함수 종속적이라는 것이다.

학번과목 번호지도 교수성적
231701AP010현성100
231701AP011수현70
231702AP010현성90
231702AP120정희80

위 테이블에서 학생의 성적을 알기 위해 학생번호 + 과목이 필요하지만, 과목의 지도 교수를 알기 위해선 과목 번호만 알고 있으면 된다. 따라서 지도 교수는 과목에만 종속 되어 있는 부분적 종속을 가지고 있으므로, 제2정규형을 만족하지 못한 상태이다.

제2정규형을 만족시키려면 아래와 같이 수정해야 한다.

학번과목 번호성적
231701AP010100
231701AP01170
231702AP01090
231702AP12080
과목 번호지도 교수
AP010현성
AP011수현
AP010현성
AP120정희

제3정규형

릴레이션이 제2정규형을 만족하고, 기본키가 아닌 모든 속성이 이행적 함수 종속이 없는 상태를 말한다.

  • 이행적 함수 종속이란, A -> B 와 B -> C 일때, A -> C 가 성립하는 것을 말한다.
학번식권 ID가격
231701A16000
231702B110000
231703A16000
231704A28000

위 테이블에서 각 학생은 1개의 식권만 선택할 수 있다고 할 때, 학번을 알면 선택한 식권을 알 수 있고, 식권을 알면 지불해야할 금액을 알 수 있기 때문에, 학번을 알면 학생이 지불해야할 금액을 알 수 있게 된다. 따라서 제3정규형을 만족하지 못한 상태이다.

제3정규형을 만족시키려면 아래와 같이 수정해야 한다.

학번식권 ID
231701A1
231702B1
231703A1
231704A2
식권 ID가격
A16000
B110000
A16000
A28000

보이스/코드 정규형

보이스/코드 정규형(BCNF)은 릴레이션이 제3정규형이고, 모든 결정자가 후보키인 상태를 말한다.

  • 결정자란, 함수 종속 관계에서 특정 종속자를 결정짓는 요소를 말한다. X -> Y일 때 X가 결정자, Y는 종속자이다.
학번지도 교수강의명
231701현성DB
231701수현운영체제
231702상호DB
231702정희인간과 사회

한 학생은 한 교수의 강의만 수강할 수 있고, 한 교수는 한 강의만 담당하고, 한 강의를 여러 교수가 맡을 수 있다고 할 때, (학번, 강의명) 또는 (학번, 지도 교수) 가 후보키가 되며, 이 때 새로운 교수가 새로운 강의를 맡는다고 할 때, 학번은 NULL이 되는 문제점이 발생한다. 즉, 지도 교수 속성이 결정자이지만 후보키가 아니므로, 지도 교수 속성을 분리해야 한다.

학번지도 교수
231701현성
231701수현
231702상호
231702정희
지도 교수강의명
현성DB
수현운영체제
상호DB
정희인간과 사회

참고 자료

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

[CS] DB: 키의 종류

[Springboot] 페이징 + Fetch Join 쿼리로 OneToMany 할 때, 모든 엔티티를 불러오는 문제를 해결해보자