[DB 데이터베이스] 정규화(Normalization) 및 이상(Anomaly)
정규화 (Normalization) 란?
데이터베이스의 설계에서 중복을 최소화 할 수 있도록 데이터를 구조화하는 작업을 정규화라고 합니다.
데이터베이스를 잘못 설계하면 이상(Anomaly) 현상이 발생하게 됩니다.
따라서 정규화는 이러한 이상 현상을 방지하고 하나의 릴레이션에 하나의 의미만 존재하도록 릴레이션을 분해하는 과정입니다.
갱신 이상(Update Anomaly) 의 종류
다음과 같은 릴레이션이 있을 경우, 이상 현상이 발생할 수 있습니다.
학번 | 주소 | 과목 | 성적 |
---|---|---|---|
1401 | 서울 | C 프로그래밍 | A- |
1401 | 서울 | C++ 프로그래밍 | A0 |
1402 | 경기 | JAVA 프로그래밍 | B+ |
1501 | 제주 | 컴퓨터구조론 | A+ |
1601 | 강원 | 데이터베이스 | C+ |
1. 수정 이상(Modification Anomaly)
중복된 데이터의 일부가 수정되어 데이터의 불일치가 발생하는 경우
1401번 학생의 주소가 변경되었는데, 2개 데이터 중 1개만 변경을 하게되면 한 학생의 정보가 달라지는 모순이 발생함
2. 삽입 이상(Insertion Anomaly)
어떤 데이터를 저장하기 위해, 불필요한 정보도 함께 저장해야 하는 경우
학생이 듣는 과목 정보를 입력하려 했는데, 시험보기 전이라 성적이 없는데도 해당 데이터를 입력해야 함
3. 삭제 이상(Deletion Anomaly)
필요한 정보를 함께 삭제하지 않으면, 어떤 정보를 삭제하는 것이 불가능한 경우
1501번 학생의 과목을 삭제하게 되면, 1501번 학생의 다른 정보도 같이 삭제되어 학생의 정보가 사라짐
함수 종속성 (Functional Dependency)
릴레이션의 특정 속성 값이 다른 속성의 값을 고유하게 결정하게 하는 것을 의미합니다.
특정 속성 A가 B를 결정할 수 있을 때, B는 A에 함수적으로 종속되어 있다라고 하며 A -> B
라고 표기합니다.
여기서 A는 결정자, B는 종속자라고 합니다.
학번 | 이름 | 과목 |
---|---|---|
1401 | 김나나 | C 프로그래밍 |
1401 | 김나나 | 데이터베이스 |
1501 | 박다다 | C++ 프로그래밍 |
1602 | 이라라 | JAVA 프로그래밍 |
위의 릴레이션에서 학번에 의해 학생 이름이 고유하게 구분되므로 함수 종속 관계에 있다고 할 수 있습니다.
따라서 기호로 표현하면 아래와 같습니다.
학번 -> 이름
정규화 과정
제 1 정규형 (1NF)
- 릴레이션의 각 속성은 모두 원자값이어야 합니다.
- 기본키를 이용하여 각 행 식별이 가능해야 합니다.
- 중복되는 속성이 없어야 합니다.
[수정 전]
학번 | 이름 | 과목 |
---|---|---|
1401 | 김나나 | C프로그래밍, 데이터베이스 |
1501 | 박다다 | C++ 프로그래밍 |
1602 | 이라라 | JAVA 프로그래밍 |
[수정 후]
학번 | 이름 | 과목 |
---|---|---|
1401 | 김나나 | C 프로그래밍 |
1401 | 김나나 | 데이터베이스 |
1501 | 박다다 | C++ 프로그래밍 |
1602 | 이라라 | JAVA 프로그래밍 |
제 2 정규형 (2NF)
- 제 1 정규형을 만족해야 합니다.
- 부분 함수 종속성을 제거해야 합니다.
- 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되면 제 2 정규형입니다.
[수정 전]
학번 | 과목번호 | 학과 | 성적 |
---|---|---|---|
1401 | A11 | 컴퓨터공학과 | A- |
1401 | A12 | 컴퓨터공학과 | A0 |
1402 | B11 | 정보보호학과 | B+ |
1501 | C10 | 기계공학과 | A+ |
1601 | D13 | 수학과 | C+ |
위 릴레이션은 학번 -> 학과로 부분 함수 종속성을 가지고 있습니다.
즉, 현재 기본키가 [학번, 과목번호]로 이루어져 있는데 학번만으로 학과에 대한 결정을 할 수 있어 제 2 정규형을 만족하지 않습니다.
[수정 후]
학번 | 과목번호 | 성적 |
---|---|---|
1401 | A11 | A- |
1401 | A12 | A0 |
1402 | B11 | B+ |
1501 | C10 | A+ |
1601 | D13 | C+ |
학번 | 학과 |
---|---|
1401 | 컴퓨터공학과 |
1401 | 컴퓨터공학과 |
1402 | 정보보호학과 |
1501 | 기계공학과 |
1601 | 수학과 |
학번을 기준으로 릴레이션을 분리하여 제 2 정규형을 만족하게 하였습니다.
제 3 정규형 (3NF)
- 제 2 정규형을 만족해야 합니다.
- 모든 속성이 기본키에 대해서만 의존되어야 합니다.
- 이행 함수 종속성 (X -> Y 이고 Y -> Z이면 X -> Z임) 을 제거`해야 합니다.
[수정 전]
학번 | 학과 | 등록금 |
---|---|---|
1401 | 컴퓨터공학과 | 400 |
1402 | 정보보호학과 | 450 |
1501 | 기계공학과 | 350 |
1601 | 수학과 | 300 |
학번 -> 학과
학과 -> 등록금
학번 -> 등록금
이행적 함수 종속 관계가 나타나기 때문에 두 릴레이션으로 분리해줍니다.
[수정 후]
학번 | 학과 |
---|---|
1401 | 컴퓨터공학과 |
1402 | 정보보호학과 |
1501 | 기계공학과 |
1601 | 수학과 |
학과 | 등록금 |
---|---|
컴퓨터공학과 | 400 |
정보보호학과 | 450 |
기계공학과 | 350 |
수학과 | 300 |
강한 제 3 정규형 (BCNF)
- 제 3 정규형을 만족해야 합니다.
- 모든 결정자가 후보키여야 합니다.
[수정 전]
학번 | 과목번호 | 교수 |
---|---|---|
1401 | A11 | James |
1401 | A12 | Brian |
1402 | B11 | Mina |
1501 | C10 | Lilly |
1601 | D13 | Tom |
[학번, 과목번호] -> 교수
교수 -> 과목번호
BCNF는 모든 결정자가 후보키여야 하는데, 교수는 후보키가 아니므로 이를 만족하지 않습니다.
[수정 후]
학번 | 교수 |
---|---|
1401 | James |
1401 | Brian |
1402 | Mina |
1501 | Lilly |
1601 | Tom |
교수 | 과목번호 |
---|---|
James | A11 |
Brian | A12 |
Mina | B11 |
Lilly | C10 |
Tom | D13 |
Comments powered by Disqus.