미리 알아두면 좋은 개념
키 : 데이터를 기준에 따라 분류(구별)시키는 단위 또는 속성 (column의 개념)
후보키 : 유일성과 최소성을 갖는 키
기본키 : 후보키 중 Main이 될만한 것 (unique, not null, 값이 잘 변하지 않는 속성을 갖는다.)
정규화에는 몇가지 단계가 있다.
제 1 정규형 - 제 2 정규형 - 제 3 정규형 - BC 정규형
=> 정규형은 줄여서 NF로 사용한다 (Normal Form 이라는 뜻)
각각의 정규형에 대한 선요약
1NF : 원자값이 아닌 도메인을 분해 (중복 속성을 원자화 될 때까지 분해)
2NF : 부분함수 종속성 제거
3NF : 이행함수 종속성 제거
BCNF : 결정자가 후보키가 아닌 함수 종속성 제거
정규화를 하는 이유?
데이터를 직관적으로 분류해 데이터의 CRUD를 용이하게 한다.
정규화를 하게 되면?
결정자를 중심으로 종속되는 record가 구분이 된다.
결정자는 무엇?
종속되는 컬럼을 종속자라고 한다.
해당 종속자들이 직접적으로 의존하고 있는 컬럼을 "결정자"라고 한다.
처음 정규화를 하는 단계에서 데이터베이스를 아래의 속성으로 분류한다.
※ 컬럼의 속성이 중복되는 것들도 합친 후 row값을 원자화 한다. (ex> 장비1, 장비2, 장비3 => 장비)
본래의 테이블에 결정자를 남기고 결정자와 종속자로 이루어진 테이블을 분리한다.
이 때 본래의 테이블에 결정자가 남아있으므로 서로 연결되어 있다.
JOIN으로 결정자를 통해 데이터에 연결할 수 있다.
[테이블1] A | B | C | D
A, B가 {A, B}로 이루어진 복합키라고 할 때,
// 복합키 : 기본키 속성을 해당 집합에 포함된 모든 키가 가지만 해당 키들은 복합키이다.
C는 A에, D는 B에 종속되는 종속자이다.
[테이블1] A | B -> 복합키는 놔두고
[테이블2] A | C -> 부분적인 종속자들을 서로 분리시켜준다.
[테이블3] B | D
이렇게 부분적으로 종속성을 분리시켜주는 것이 2NF이다.
※복합키 뿐만이 아니라 기본키가 유일한 테이블에서도 똑같은 개념이다. 혼동해서는 안 된다.
이행함수 종속성이라는 것은 본래 테이블의 기본키 속성이 없는 키가 종속자를 가짐으로서 결정자의 역할을 하는 것을 말한다.
제 3 정규형에서는 이행함수 종속성을 제거하는 것을 목적으로 하는데
이는 기본키에 종속되어 있는 테이블 간에서 이루어진다.
[테이블1] A | B | C | D
A는 기본키 결정자이며 B, C, D는 이에 종속되는 종속자이다.
그리고 D는 A와 C에 종속되는 종속자이다.
이 경우 C는 기본키를 갖지 않지만 결정자의 역할을 하는 이행함수라고 할 수 있다.
[테이블1] A | B | C
[테이블2] C | D
이렇게 이행함수 종속성을 분리시켜주는 것이 3NF이다.
이 개념을 만든 사람이 Boyce와 Codd라고 BCNF이다.
모든 결정자가 후보키가 되도록 분리한다.
제 3정규형과 비슷하지만 좀 더 강력한 분리 개념이다.
BCNF는 후보키가 아닌 속성이 기본키(또는 후보키)나 기본키의 부분집합(복합키 중 하나)를 종속시키는 결정자일 때
해당 속성을 후보키로 만들어 메인 테이블에 분류하고
해당 후보키의 종속되는 기본키(또는 후보키)를 따로 분류한다.
A | B | C
A, B는 복합키 집합 {A, B}에 포함된 속성이며, C는 B를 결정하는 결정자이다.
A | C -> C가 후보키가 된다.
C | B
이렇게 키가 되는 속성들로 분류하여 종속되는 속성들을 각각 분리시켜주는 개념이 BCNF이다.