1. 정규화
- 이상현상이 있는 릴레이션을 분해하여 이상현상을 없애는 과정
- 따라서 여러 개의 릴레이션을 생성하게 된다.
- 이를 구분하여 정규형이 높아질수록 이상현상은 줄어들게 된다.
- 중복된 데이터를 허용하지 않는 다는 것이며, 정규화를 통해 무결성을 유지할 수 있고, DB의 저장 용량 역시 줄일 수 있다.
2. 정규화의 장단점
1) 장점
- DB 변경 시 이상 현상을 제거할 수 있다.
- 정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장 시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 된다.
- DB와 연동된 응용 프로그램에 최소한의 영향만을 미치게 되어 응용프로그램의 생명을 연장시킨다.
2)단점
- 릴레이션의 분해로 인해 릴레이션 간의 JOIN 연산이 많아진다.
- 질의에 대한 응답 시간이 느려질 수도 있다. 데이터의 중복 속성을 제거하고 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화되는 효과
- 따라서 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수도 있다
- 만약 조인이 많이 발생하여 성능 저하가 나타나면 반정규화(De-normalization)를 적용할 수도 있다
3. 정규화의 단계
1) 제 1 정규화(1NF)
- 테이블의 칼럼이 원자값(하나의 값)을 갖도록 테이블을 분해하는 것
- 다음과 같은 규칙들을 만족해야한다.
- 각 컬럼이 하나의 속성만 가져야한다
- 하나의 컬럼은 같은 종류나 타입의 값을 가져야한다.
- 각 컬럼이 유일한 이름을 가져야한다
- 칼럼의 순서가 상관없어야 한다.
EX)
이름 | 나이 | 수강과목 |
홍길동 | 20 | C,C++ |
이순신 | 21 | Java |
이 산 | 22 | DB, 운영체제 |
위와 같은 테이블을
이름 | 나이 | 수강과목 |
홍길동 | 20 | C |
홍길동 | 20 | C++ |
이순신 | 21 | Java |
이 산 | 22 | DB |
이 산 | 22 | 운영체제 |
으로 고치는 것이다.
2) 제 2 정규화(2NF)
- 제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것
- 완전 함수 종속 : 기본키의 부분 집합이 결정자가 되어선 안된다는 것
- 다음과 같은 규칙들을 만족해야한다.
- 제 1 정규화를 만족
- 모든 컬럼이 부분적 종속(Partial Dependency)이 없어야한다. 모든 칼럼이 완전 함수 종속을 만족해야한다.
학생 이름 | 나이 | 수강과목 |
홍길동 | 20 | C |
홍길동 | 20 | C++ |
이순신 | 21 | Java |
이 산 | 22 | DB |
이 산 | 22 | 운영체제 |
이러한 테이블을
학생 이름 | 나이 |
홍길동 | 20 |
이순신 | 21 |
이 산 | 22 |
학생 이름 | 수강과목 |
홍길동 | C |
홍길동 | C++ |
이순신 | Java |
이 산 | DB |
이 산 | 운영체제 |
이렇게 2개의 테이블로 나누는 것이다.
3) 제 3 정규화(3NF)
- 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것
- 이행적 종속 : A->B, B->C가 성립할 때 A->C가 성립되는 것을 의미
- 다음과 같은 규칙들을 만족해야한다.
- 제 2 정규화를 만족
- 기본키를 제외한 속성들 간의 이행 종속성이 없어야한다.
EX) 이와 같은 테이블이 있다고 가정하자
학생 코드 | 학생이름 | DOB | Street | City | State | ZIP |
학생코드가 기본키이고, 기본키가 하나이므로 2차 정규형은 만족한다. 하지만 이 데이터의 Zip컬럼을 알면 Street, City, State를 결정할 수 있다. 또한 여러명의 학생들이 같은 Zip코드를 갖는 경우에 Zip코드만 알면 Street, City, State가 결정되기 때문이 이 컬럼들에는 중복된 데이터가 생길 가능성이 있다.
그러므로 위와 같은 테이블을
학생 코드 | 학생 이름 | DOB | ZIP |
ZIP | Street | City | State |
이와 같이 나누면 테이블을 2개로 나누면 제 3차 정규화를 만족한다.
4) BCNF(Boyce-codd Normal Form)
- 3차 정규화를 조금 더 강화한 버전
- 3차 정규화에서 해결할 수 없는 이상 현상을 해결할 수 있다.
- 3차 정규화를 만족하면서 모든 결정자가 후보키 집합에 속한 정규형
- 다음과 같은 규칙들을 만족해야한다.
- 제 3 정규화를 만족
- 모든 결정자가 후보키 집합에 속해야한다.
EX)
학생 | 과목 | 교수 |
학점 |
1 | AB123 | 김인영 | A |
2 | CS123 | Mr.Sim | A |
3 | CS123 | Mr.Sim | A |
위와 같이 테이블이 구성된 경우에 데이터가 중복되고, 갱신 이상이 발생한다.
교수 테이블
교수 | 과목 |
김인영 | AB123 |
Mr.Sim | CS123 |
수강 테이블
학생 | 과목 | 학점 |
1 | AB123 | A |
2 | CS123 | A |
3 | CS123 | A |
그래서 2개의 테이블로 분리한다.
5) 제 4 정규화(4NF)
- 다치 종속(Multivalued Dependency)을 제거하는 단계
- 하나의 속성이 두 개 이상의 독립적인 다치 종속 관계를 가질 때 이를 제거
- 예시
- 학생이 동시에 여러 수업을 듣고, 여러 동아리에 가입할 수 있다면 학생-수업, 학생-동아리 간 다치 종속이 발생할 수 있습니다. 이를 분리하여 각각의 테이블로 나누어 관리
6) 제 5 정규화(5NF)
- 조인 종속을 제거하는 단계
- 테이블을 여러개로 나누었을 때 발생할 수 있는 조인에 따른 종속성을 제거
- 매우 복잡한 관계에서 적용되며, 모든 데이터가 조인으로만 구성될 수 있는 경우에 이를 해결하는 정규형
4. 참고
1)정규화 : https://superohinsung.tistory.com/111