CS/DB

[DB] 정규화 개요

겜도리도리 2022. 5. 26. 02:57
반응형

릴레이션 정규화

부주의한 데이터베이스 설계는 제어할 수 없는 데이터 중복을 야기하여 여러 가지 갱신 이상을 유발한다.

어떻게 좋은 데이터베이스를 설계할 것인지, 데이터베이스에 어떤 릴레이션들을 생성할 것인지, 각 릴레이션에 어떤 애트리뷰트들을 둘 것인지 고민해야 한다.

정규화(Normalization)는 주어진 릴레이션 스키마를 함수적 종속성과 기본 키를 기반으로 분석하여, 원래의 릴레이션을 분해함으로써 중복과 세 가지 갱신 이상을 최소화한다.

좋은 관계 데이터베이스 스키마를 설계하는 목적

1. 정보의 중복과 갱신 이상이 생기지 않도록 한다.

2. 정보의 손실을 막는다.

3. 실세계를 훌륭하게 나타낸다.

4. 애트리뷰트들 간의 관계가 잘 표현되는 것을 보장한다.

5. 어떤 무결성 제약조건의 시행을 간단하게 한다.

6. 효율성 측면 또한 고려한다.

먼저 갱신 이상이 발생하지 않도록 노력하고, 그 다음에 효율성을 고려한다.

갱신 이상(Update anomaly)

수정 이상(modification anomaly) : 반복된 데이터 중에 일부만 수정하면 데이터의 불일치가 발생하는 경우

삽입 이상(insertion anomaly) : 불필요한 정보를 함께 저장하지 않고는 어떤 정보를 저장하는 것이 불가능한 경우

삭제 이상(deletion anomaly) : 유용한 정보를 함께 삭제하지 않고는 어떤 정보를 삭제하는 것이 불가능한 경우

나쁜 설계의 예시

예시 1 : 각 사원이 두 개의 부서에 속할 수 있는 사원 릴레이션

사원 릴레이션

문제점 1 : 각 사원이 세 개 이상의  부서에 속할 수 있도록 변경할 때, 새로운 애트리뷰트를 추가해야 하거나 새로운 릴레이션으로 변경해야 함. 

문제점 2 : 최대 부서 개수 미만을 가지는 사원일 경우(위에서는 박영권) 널 값이 들어가 기억 장소 낭비 발생

 

예시 2 : 각 사원이 두 개의 부서에 속할 수 있는 사원 릴레이션

사원 릴레이션

예시 1의 문제점은 해결했지만, 또 다른 문제점을 가진다.

문제점 1 : 정보의 중복이 발생한다. 각 사원이 속한 부서 수만큼 동일한 사원의 튜플들이  존재하므로 사원이름, 사원번호, 주소, 전화번호 등이 중복되어 저장 공간이 낭비된다.

문제점 2 : 수정 이상이 발생한다. 예를 들어 부서 이름이 바뀌는 경우 이 부서에 근무하는 일부 사원 튜플에서만 부서 이름을 변경하면 데이터베이스의 불일치 상태에 빠진다.

문제점 3 : 삽입 이상이 발생한다. 어떤 부서가 신설되었을 때, 아직 사원을 한 명도 배정하지 않았다면 이 부서에 관한 정보를 입력할 수 없다.

문제점 4 : 삭제 이상이 발생한다. 어떤 부서에 속한 사원이 단 한 명 있는 경우 이 사원에 관한 튜플을 삭제하면 부서 정보 또한 릴레이션에서 삭제된다.

릴레이션 분해

릴레이션 분해란, 하나의 릴레이션을 두 개 이상의 릴레이션으로 나누는 것을 말한다.

릴레이션 분해는 필요한 경우 분해된 릴레이션들로부터 원래의 릴레이션을 다시 구할 수 있음을 보장해야 한다는 원칙을 기반으로 한다.

분해를 잘못하면 두 릴레이션으로 얻을 수 있는 정보가 원래의 릴레이션이 나타내던 정보보다 적을 수도 있고 많을 수도 있다.

릴레이션 분해는 릴레이션에 존재하는 함수적 종속성에 관한 지식을 기반으로 한다.

릴레이션 분해 예시

사원 릴레이션을 사원1 릴레이션과 부서 릴레이션으로 분해한다.

해결되는 문제점

문제점 2가 해결된다. 어떤 부서에 근무하는 사원이 여러 명 있더라도, 사원1 릴레이션에는 부서 이름이 포함되어 있지 않으므로 수정 이상이 나타나지 않는다.

문제점 3이 해결된다. 어떤 부서에 사원이 한 명도 배정되지 않았더라도, 부서 릴레이션의 기본 키가 부서번호이므로 부서에 관한 정보를 부서 릴레이션에 삽입할 수 있다.

문제점 4가 해결된다. 어느 부서에 속한 유일한 사원에 관한 튜플을 삭제하더라도 이 부서에 관한 정보는 부서 릴레이션에 남아 있다.

정규형(Normal form)의 종류

제1정규형 ~ 제5정규형, BCNF(Boyce-Codd normal form)이 있다.

일반적으로 산업계의 데이터베이스 응용에서 데이터베이스를 설계할 때 BCNF까지만 고려한다.

관계 데이터베이스 설계의 비공식적인 지침

지침 1 : 이해하기 쉽고 명확한 스키마 만들기

여러 엔티티 타입이나 관계 타입에 속한 애트리뷰트들을 하나의 릴레이션에 포함시키지 않기

지침 2 : 널값을 피하기 (널값은 저장 공간의 낭비를 유발한다.)

지침 3 : 가짜 튜플이 생기지 않도록 하기

지침 4 : 스키마 정제하기 (여러가지 갱신 이상을 피해야 한다.)

위와 같은 지침들은 정규화 과정을 통해 만족할 수 있다.

반응형

'CS > DB' 카테고리의 다른 글

[DB] 릴레이션 분해  (0) 2022.05.26
[DB] 함수적 종속성  (0) 2022.05.26
[DB] 다단계 인덱스  (0) 2022.05.20
[DB] 화일 조직  (0) 2022.05.19
[DB] 물리적 데이터베이스 설계  (0) 2022.05.16