데이터 정규화란 데이터 중복을 줄이고 데이터 무결성을 높이기 위한 데이터 베이스 설계과정을 말합니다.
데이터 정규화는 다양하지만 해당 글에서는 bcnf까지 다루게 됩니다.
제 1 정규형의 조건은
1. 열에는 위-아래의 순서가 없다.
2. 행에는 좌-우의 순서가 없다.
3. 중복되는 열이 없다.
4. 모든 열과 행의 중복지점에는 (열과 행의)해당되는 분야에서 한 개의 값을 가진다.
5. 모든 행은 규칙적이다.
로 이뤄져 있으나 대게 rdbms에서는 1, 2, 3, 5번 조건을 충족하기에 4번을 중점적으로 이야기합니다.
쉽게 말하자만 한 컬럼에는 하나의 값이 있어야 한다는 뜻으로
이름 | 전화번호 |
---|---|
존 | 010-1234-1234;02-1234-1234 |
위의 예시와 같이 하나의 컬럼에 두개의 값을 넣기 보다는
이름 | 전화번호 |
---|---|
존 | 010-1234-1234 |
존 | 02-1234-1234 |
다음과 같이 수정한다면 제 1정규형 조건을 만족하게 됩니다.
제 2 정규형는 테이블이 제 1정규형이고 기본키가 아닌 속성이 기본키에 완전 함수 종속성일 때 제 2 정규화의 조건을 만족한 것이라고 할 수 있습니다.
여기서 함수 종속성은 속성들간 종속 관계를 말하는 것이며
한 테이블 R에 존재하는 필드의 부분 집합을 x와 y할 때 x의 한 값이 y에 속한 하나의 값에만 매핑 될 겅유 y는 x에 함수 종속적이라고 하며 x->y라고 표기합니다.
완전 함수 종속성 : x->y종속성이 성립할 때 y가 x의 속성 전체에 함수 종속하고 부분 집합 속성에 함수 종속하지 않을 경우 완전함수 종속이라고 한다.
완정 함수 종속성을 충족하기 위해서 기본키를 이루는 부분집합이 결정자인 경우 테이블을 분리하여 종속성을 제거 하면 됩니다.
id, 강의, 강의실, 성적으로 이뤄진 수강강좌 테이블이 있습니다.
|id|강의 | 강의실 | 성적|
|-|-|-|
|1|db|101호|a|
|2|db|101호|b|
|3|cs|102호|a|
|...|...|...|...|
해당 테이블에서 id와 강의는 기본키로 성적을 결정하고 있습니다. 하지만 기본키의 부분집합인 강의가 강의실을 결정하고 있기 때문에 완전 함수 종속을 충족하고 있지 않습니다.
이를 해결하기 위해 강의 정보라는 테이블을 만들어 완전함수 종속을 충족하면 제 2정규형을 만족할 수 있습니다.
<수강강좌>
id | 강의 | 성적 |
---|---|---|
1 | db | a |
2 | db | b |
3 | cs | a |
... | ... | ... |
<강의 정보>
강의 | 강의실 |
---|---|
db | 101호 |
cs | 102호 |
... | ... |
제 3정규형은 제 2정규형을 만족하는 상태에서 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속이 되지 않으면 제 3정규형을 만족할 수 있습니다.
이행적 함수 종속이란 컬럼 a, b, c가 주어졌을 때 c가 이행적으로 a에 종속한다는 의미로 a -> b, b->c와 같은 관계를 갖기 때문에 발생합니다.
<계절학기>
id | 강좌 | 수강료 |
---|---|---|
a | db | 1000 |
b | db | 1000 |
c | cs}2000 | |
... | ... | ... |
위의 예시에서 테이블에서 id는 강좌를 결정하고, 강좌는 수강료를 결정하는 이행적 함수 종속을 만족합니다. 위 테이블을 계절 수강 테이블과 수강료 테이블로 나눈다면 제 3정규형을 만족할 수 있습니다.
<계절수강>
id | 강좌 |
---|---|
a | db |
b | db |
c | cs |
... | ... |
<수강료>
강좌 | 수강료 |
---|---|
db | 1000 |
db | 1000 |
cs | 2000 |
... | ... |
제 3 정규형의 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것을 의미합니다.
<강좌>
id | 강좌 | 교수 |
---|---|---|
a | db | 김교수 |
d | db | 김교수 |
c | cs | 박교수 |
... | ... | ... |
예시와 같은 테이블이 있을 때 id는 강좌의 결정자지만 교수 역시 강좌에 대한 결정자이기 때문에
해당 테이블은 BCNF를 만족하지 못한다.
다음과 같이 수강 내역과 강좌 정보 테이블로 분리한다면 bcnf를 만족할 수 있다.
<수강내역>
id | 강좌 |
---|---|
a | db |
d | db |
c | cs |
... | ... |
<강좌>
교수 | 강좌 |
---|---|
김교수 | db |
박교수 | cs |
이교수 | h/w |
... | ... |
참고 링크
https://yaboong.github.io/database/2018/03/10/database-normalization-2/
https://mangkyu.tistory.com/110
https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%EC%A0%95%EA%B7%9C%ED%99%94