이 글은 데이터베이스 정규화를 공부하고 내 맘대로 정리한 글이다. 보통 현업에선 3NF 까지 정규화를 진행한다고 하여서 우선은 3NF까지 정리한다. 추후 BCNF를 업데이트 한후 여유가 된다면 6NF까지 진행할 생각이다.
각 테이블의 도메인 값은 원자적으로 이루어져야한다.
학번 | 이름 | 학과 | 학년 | 과동아리 |
---|---|---|---|---|
1 | 김추추 | 컴퓨터공학과 | 3 | 에니악,해커킹 |
1 | 김추추 | 문헌정보학과 | 3 | 책벌레 |
2 | 김다루 | 기계공학과 | 2 | 메카니즘,유체산책 |
3 | 김설화 | 전자공학과 | 4 | 쇼크 |
4 | 김기추 | 전기공학과 | 1 | 쇼크 |
위 테이블에서 1번 김추추의 과동아리 도메인의 값이 에니악,해커킹이다.
이 에니악,해커킹은 쉼표를 기준으로 2개의 의미있는 값으로 쪼갤 수 있음으로 도메인 값이 원자적이지 않다고 볼 수 있다.
1NF을 만족시키기 위해선 아래와 같이 도메인 값을 원자적으로 이루어질 때 까지 쪼개여야한다.
학번 | 이름 | 학과 | 학년 | 과동아리 |
---|---|---|---|---|
1 | 김추추 | 컴퓨터공학과 | 3 | 에니악 |
1 | 김추추 | 컴퓨터공학과 | 3 | 해커킹 |
1 | 김추추 | 문헌정보학과 | 3 | 책벌레 |
2 | 김다루 | 기계공학과 | 2 | 메카니즘 |
2 | 김다루 | 기계공학과 | 2 | 유체산책 |
3 | 김설화 | 전자공학과 | 4 | 쇼크 |
4 | 김기추 | 전기공학과 | 1 | 쇼크 |
1NF에서는 삽입 이상, 갱신 이상, 삭제 이상 문제점이 여전히 남아있다는 문제점을 가지고 있다.
테이블내 속성들이 기본키에 대해서 완전 함수적 종속을 이루어야한다.
학번 | 이름 | 학과 | 학년 | 과동아리 |
---|---|---|---|---|
1 | 김추추 | 컴퓨터공학과 | 3 | 에니악 |
1 | 김추추 | 컴퓨터공학과 | 3 | 해커킹 |
1 | 김추추 | 문헌정보학과 | 3 | 책벌레 |
2 | 김다루 | 기계공학과 | 2 | 메카니즘 |
2 | 김다루 | 기계공학과 | 2 | 유체산책 |
3 | 김설화 | 전자공학과 | 4 | 쇼크 |
4 | 김기추 | 전기공학과 | 1 | 쇼크 |
위 테이블의 경우 기본키는 <학번,과동아리> 조합이 기본키이다.
이제 기본키을 통해서 함수적 종속성을 한번 축출해보자
<학번,과동아리> -> 이름
<학번,과동아리> -> 학년
<학번,과동아리> -> 학과
<학번> -> 이름
<학번> -> 학년
<과동아리> -> 학과
와 같은 함수적 종속성을 찾을 수 있다.
이제 테이블을 완전 함수적 종속을 만족시키기 위해 테이블을 분리해야한다.
학번 | 이름 | 학년 |
---|---|---|
1 | 김추추 | 3 |
2 | 김다루 | 2 |
3 | 김설화 | 4 |
4 | 김기추 | 1 |
과동아리 | 학과 |
---|---|
에니악 | 컴퓨터공학과 |
해커킹 | 컴퓨터공학과 |
책벌레 | 문헌정보학과 |
메카니즘 | 기계공학과 |
쇼크 | 전자공학과 |
학번 | 과동아리 |
---|---|
1 | 에니악 |
1 | 해커킹 |
1 | 책벌레 |
2 | 메카니즘 |
2 | 유체산책 |
3 | 쇼크 |
4 | 김기추 |
기본키가 아닌 모든 속성이 이행적 함수 종속을 이루지 않아야 한다.
X,Y,Z 에 대해
X->Y
Y->Z 이면
X->Z 가 성립된다.
이행적 종속은 삼단논법과 비슷하다.
X->Y->Z 가 성립할경우 이를
[X,Y] | [Y,Z] 테이블로 분리하여 이행적 함수 종속을 없애는 것을 3NF라고 부른다.
위 테이블에서는 학생테이블에 3NF를 적용할 수 있다.
(학번)->이름
(이름)->학년
(학번)->학년 이 성립한다.
학번 | 이름 |
---|---|
1 | 김추추 |
2 | 김다루 |
3 | 김설화 |
4 | 김기추 |
이름 | 학년 |
---|---|
김추추 | 3 |
김다루 | 2 |
김설화 | 4 |
김기추 | 1 |
예제가 조금 이상하여 현실성이 떨어진 정규화였지만 3NF을 적용할 수 있었다.