(1) 제1정규화
한 릴레이션 R이 제1정규형을 만족할 필요충분조건
: 릴레이션 R의 모든 애트리뷰트가 원잣값만을 가지면 됩니다.
즉, 릴레이션의 모든 애트리뷰트에 반복 그룹(집합)과 같은 값이 나타나지 않으면 제1정규형을 만족합니다.
'과목번호' 애트리뷰트와 같이 두 개 이상의 값을 가지면 집합에 속한 각 값마다 하나의 투플로 표현하여 제1정규형으로 변환시켜 줍니다.
제1정규형만으로 완전한 릴레이션을 갖기 힘들다. 아래와 같은 문제점들이 있을 수 있습니다.
(2) 제2정규형
한 릴레이션 R이 제2정규형을 만족할 필요충분조건
: 릴레이션 R이 제1정규형을 만족하면서, 어떤 후보 키에도 속하지 않는 모든 애트리뷰트들이 R의 기본 키에 완전하게 함수적으로 종속해야 합니다. (부분 함수적 종속성을 가지면 안 된다.)
위의 릴레이션은 제1정규형을 만족하지만 갱신 이상의 문제점을 가지고 있습니다.
왜냐하면 기본 키에 대한 부분 함수적 종속성을 가지고 있기 때문입니다.
* 수정 이상
: 여러 학생이 소속된 학과의 전화번호가 변경되었을 때 모든 학생들의 투플에서 전화번호를 바꾸어 주지 않으면 일관성이 유지되지 않습니다.
* 삽입 이상
: 예를 들어 신설되는 학과에는 아무 학생도 존재하지 않습니다. 학번이 기본 키이기에 학생이 없는 신설된 학과를 개설할 수 없는 문제가 발생합니다. (엔티티 무결성 제약조건에 따라 기본 키 값에 NULL값을 넣을 수 없습니다.)
* 삭제 이상
: 어떤 학과에 소속된 마지막 학생 투플을 삭제하면 이 학생이 소속된 학과에 관한 정보도 삭제됩니다.
학생 릴레이션에서 부분 함수적 종속성 제거하기
1) 두 릴레이션을 분해합니다.
2) 원래 릴레이션에서 기본 키에 부분적으로 종속되는 애트리뷰트들은 한 릴레이션에 속하도록 합니다.
2-2) 부분적으로 종속됐던 애트리뷰트(학번)가 이 릴레이션의 기본키가 됩니다.
3) 원래 릴레이션의 나머지 애트리뷰트들이 또 다른 릴레이션에 포함되며 학번 애트리뷰트를 외래 키로 포함시킵니다.
(학번1 릴레이션에서 학번은 기본키이며, 수강 릴레이션에서 학번은 외래 키이자 과목 번호와 복합 키로 기본키가 됩니다. '학번' 애트리뷰트를 통해 두 릴레이션을 나중에 다시 조인합니다. / 연관이 있는 두 릴레이션)
(3) 제3정규형
한 릴레이션 R이 제3정규형을 만족할 필요충분조건
: 릴레이션 R이 제2정규형을 만족하면서, 키가 아닌 모든 애트리뷰트가 릴레이션 R의 기본 키에 이행적으로 종속되지 않는 것입니다.
위와 같이 제2정규형을 만족해도 갱신 이상 문제가 발생할 수 있습니다.
왜냐하면 학생1 릴레이션에서 이행적 종속성이 존재하기 때문입니다.
(학번 -> 학과 이름) ^ (학과이름 -> 학과전화번호) => (학번 -> 학과 전화번호)
학과전화번호 애트리뷰트는 기본 키인 학번에 종속되는 동시에 후보 키가 아닌 학과이름 애트리뷰트에도 종속되는 문제를 가지게 됩니다.
(학번에 따라 학과이름과 학과전화번호를 알 수 있습니다. 또한 학과이름을 알면 학과전화번호를 알 수 있습니다.)
학생1 릴레이션에서 이행적 종속성 제거하기
1) 두 릴레이션을 분해한다.
2) 원래 릴레이션에서 기본 키가 아닌 애트리뷰트에 종속되는 애트리뷰트(학과전화번호), 키가 아니면서 다른 애트리뷰트를 결정하는 애트리뷰트(학과이름)를 새로운 릴레이션 속하도록 합니다.
(키가 아니면서 다른 애트리뷰트를 결정하는 애트리뷰트는 새로운 릴레이션에서 기본 키가 됩니다.)
3) 나머지 애트리뷰트들이 또 다른 릴레이션에 포함되며 학과이름 애트리뷰트를 외래 키로 이 릴레이션에 포함시킵니다.
(4) BCNF
한 릴레이션 R이 BCNF를 만족할 필요충분조건
: 릴레이션 R이 제3정규형을 만족하면서, 모든 결정자가 후보 키어야 한다는 것입니다.
키가 아닌 애트리뷰트가 키 애트리뷰트의 결정자인 경우가 존재할 수 있습니다. (BCNF 불만족)
BCNF 정규화하면 아래와 같이 변경됩니다.
1) 키가 아니면서 결정자 역할을 하는 애트리뷰트(C)와 그 결정자에 함수적으로 종속하는 애트리뷰트(B)를 하나의 릴레이션에 둡니다. (C는 결정자이며 B는 C에 종속하기에 C는 기본 키가 됩니다.)
2) 기존 릴레이션에 키가 아니면서 결정자 역할을 한 C를 남겨서 기본 키의 구성요소가 되도록 합니다.
(C는 새로운 릴레이션에 대한 외래 키 역할도 합니다.)
'CS > Database' 카테고리의 다른 글
[Mysql] mysql select 쿼리 실행 순 익히기, 스키마 create&drop (0) | 2023.10.21 |
---|---|
[DB] 데이터베이스의 원칙과 ACID, RDBMS와 NOSQL의 차이점 이해하기 (0) | 2023.10.09 |
[DB] 데이터베이스 논리적 설계 - ER - 관계모델의 릴레이션으로 사상 (0) | 2022.09.28 |
[DB] 데이터베이스 ER모델(2) - 관계와 관계 타입 / 전체 참여, 부분참여, 다중 관계, 순환적 관계란 (0) | 2022.09.27 |
[DB] 데이터베이스 ER모델 (1) - 엔티티, 엔티티 타입, 애트리뷰트 (0) | 2022.09.27 |