01. 정규화(Normalization)
테이블간 중복된 데이터를 없애기 위해, 데이터를 분해하는 과정
- 데이터 중복을 허용하지 않음으로써, 무결성을 유지할 수 있고, 또 DB 저장공간을 줄일 수 있다.
02. 정규화 장단점
- 장점
- DB 변경시 이상 현상을 방지할 수 있다.
이상 현상
: 테이블을 잘못 설계하여, 데이터를 삽입, 수정, 삭제할 때 논리적으로 생기는 오류삽입이상
: 자료를 삽입할 때, 의도하지 않은 자료까지 삽입해야만 테이블에 자료가 추가 가능한 현상갱신이상
: 중복된 데이터 중 일부만 수정되어, 데이터 모순이 일어나는 현상삭제 이상
: 어떤 정보를 삭제하면, 의도하지 않은 다른 정보까지 삭제되는 현상
- 정규화된 DB에서는 새로운 데이터 형의 추가로 인한 테이블 수정 과정에서, 비교적 조금만 수정해도 된다.
- DB 변경시 이상 현상을 방지할 수 있다.
- 단점
- 릴레이션 분해로인해, JOIN 연산이 많아져, 성능이 떨어질 수 있다.
- 이런 경우 역정규화(DeNormalization)을 통해 릴레이션을 합치는 경우도 있다.
03. 정규화 과정
제1 정규형(1NF)
- 각 컬럼이 하나의 속성만을 가져야 한다.
- 하나의 컬럼은 같은 종류나 타입(type)의 값을 가져야 한다.
- 각 컬럼이 유일한(unique) 이름을 가져야 한다.
- 칼럼의 순서가 상관없어야 한다.
제2 정규형(2NF)
- 1정규형을 만족해야 한다.
- 모든 컬럼이 부분적 종속(Partial Dependency)이 없어야 한다.
부분적 종속
: 기본키 중, 일부 키에만 종속되는 값이 없어야 함- ex). 학생번호/나이/수강과목/성적
- 위 테이블에서 기본키는 (학생번호, 수강과목)로 다중 기본키를 가진다.
- 하지만
나이
칼럼은,학생번호
에 종속되기 때문에, 기본키 일부에 다른 칼럼이 종속되는 상황이 발생 - 때문에 제 2정규형을 위배한다. 이를 위해 테이블을 (학생번호/나이), (학생번호/수강과목/성적) 으로 분해해야 한다.
- ex). 학생번호/나이/수강과목/성적
제3 정규형(3NF)
- 2 정규형을 만족해야 한다.
- 기본키를 제외한 속성들 간의 이행 종속성 (Transitive Dependency)이 없어야 한다.
이행 종속성
: X->Y, Y->Z 일때, X->Z 를 만족하는 상황- ex) (고객번호, 등급, 할인률)
- 고객번호를 알면 등급 유추 가능
- 등급을 알면 할인률 유추 가능
- 즉 고객번호를 알면 할인률 유추 가능
- 제3 정규형 위배
- (고객번호, 등급), (등급, 할인률) 로 테이블 분해 가능
BCNF(Boyce-Codd Normal Form)
- 3정규형을 만족해야 한다.
- 모든 결정자가 후보키 집합에 속해야 한다.
- ex) 테이블 (학생번호, 과목, 지도교수) 의 경우
- 지도교수는 과목에 종속
- 후보키 집합이 아닌 컬럼이 결정자임
- BCNF 위배
보통 BCNF까지의 정규화만 하는 경우가 많기 때문에, 4, 5 정규형은 패스하겠다.
01. 정규화(Normalization)
테이블간 중복된 데이터를 없애기 위해, 데이터를 분해하는 과정
- 데이터 중복을 허용하지 않음으로써, 무결성을 유지할 수 있고, 또 DB 저장공간을 줄일 수 있다.
02. 정규화 장단점
- 장점
- DB 변경시 이상 현상을 방지할 수 있다.
이상 현상
: 테이블을 잘못 설계하여, 데이터를 삽입, 수정, 삭제할 때 논리적으로 생기는 오류삽입이상
: 자료를 삽입할 때, 의도하지 않은 자료까지 삽입해야만 테이블에 자료가 추가 가능한 현상갱신이상
: 중복된 데이터 중 일부만 수정되어, 데이터 모순이 일어나는 현상삭제 이상
: 어떤 정보를 삭제하면, 의도하지 않은 다른 정보까지 삭제되는 현상
- 정규화된 DB에서는 새로운 데이터 형의 추가로 인한 테이블 수정 과정에서, 비교적 조금만 수정해도 된다.
- DB 변경시 이상 현상을 방지할 수 있다.
- 단점
- 릴레이션 분해로인해, JOIN 연산이 많아져, 성능이 떨어질 수 있다.
- 이런 경우 역정규화(DeNormalization)을 통해 릴레이션을 합치는 경우도 있다.
03. 정규화 과정
제1 정규형(1NF)
- 각 컬럼이 하나의 속성만을 가져야 한다.
- 하나의 컬럼은 같은 종류나 타입(type)의 값을 가져야 한다.
- 각 컬럼이 유일한(unique) 이름을 가져야 한다.
- 칼럼의 순서가 상관없어야 한다.
제2 정규형(2NF)
- 1정규형을 만족해야 한다.
- 모든 컬럼이 부분적 종속(Partial Dependency)이 없어야 한다.
부분적 종속
: 기본키 중, 일부 키에만 종속되는 값이 없어야 함- ex). 학생번호/나이/수강과목/성적
- 위 테이블에서 기본키는 (학생번호, 수강과목)로 다중 기본키를 가진다.
- 하지만
나이
칼럼은,학생번호
에 종속되기 때문에, 기본키 일부에 다른 칼럼이 종속되는 상황이 발생 - 때문에 제 2정규형을 위배한다. 이를 위해 테이블을 (학생번호/나이), (학생번호/수강과목/성적) 으로 분해해야 한다.
- ex). 학생번호/나이/수강과목/성적
제3 정규형(3NF)
- 2 정규형을 만족해야 한다.
- 기본키를 제외한 속성들 간의 이행 종속성 (Transitive Dependency)이 없어야 한다.
이행 종속성
: X->Y, Y->Z 일때, X->Z 를 만족하는 상황- ex) (고객번호, 등급, 할인률)
- 고객번호를 알면 등급 유추 가능
- 등급을 알면 할인률 유추 가능
- 즉 고객번호를 알면 할인률 유추 가능
- 제3 정규형 위배
- (고객번호, 등급), (등급, 할인률) 로 테이블 분해 가능
BCNF(Boyce-Codd Normal Form)
- 3정규형을 만족해야 한다.
- 모든 결정자가 후보키 집합에 속해야 한다.
- ex) 테이블 (학생번호, 과목, 지도교수) 의 경우
- 지도교수는 과목에 종속
- 후보키 집합이 아닌 컬럼이 결정자임
- BCNF 위배
보통 BCNF까지의 정규화만 하는 경우가 많기 때문에, 4, 5 정규형은 패스하겠다.