이상현상을 방지하기 위해, 테이블을 잘게 쪼개는 정규화라는 작업을 합니다. 정규화에는 1~5단계가 있으며, 이에 대해 알아보도록 하겠습니다.
[ Contents ]
1. 정규화 (Normalization)
이상현상(Anomaly)을 없애기 위해, 테이블을 잘게 쪼개는 과정
앞서 이상현상을 살펴보았습니다. 이상현상은 삽입, 갱신, 삭제 시 원치 않는 결과를 초래하는 경우를 뜻합니다. PK값이 없어서 삽입할 수 없다던가, 갱신으로 인해 상이한 데이터가 생긴다던가 하는 문제가 있었죠.
2023.04.24 - [Data Engineering] - [DB] 데이터베이스 이상현상(삽입, 삭제, 갱신)과 함수종속성 개념과 예시
이러한 이상현상을 없애기 위해서는 '테이블을 알맞게 쪼개는 작업'이 필요합니다. 이를 정규화라고 합니다.
하지만 너무 테이블을 많이 쪼개면, 성능이나 유지관리 측면에서 어려움이 많습니다. 매번 관련 정보를 찾으려면 여러 테이블을 조인해서 처리해야 하니까요.
그래서 요즘은 2~3 정규형에 그치는 경우도 많으며, 오히려 반정규화를 하는 경우도 있습니다. 그러면 이러한 정규형의 종류에 대해서 알아보겠습니다.
2. 제1정규형 (1NF)
모든 도메인이 원자값(Atomic Value)으로만 구성
원자값은 하나의 속성(칼럼)이 하나의 값만 가지는 걸 말합니다. 이는 대부분의 관계형 데이터베이스에서 만족합니다.
학번 (PK) | 성명 | 학과 | 등록금 | 장학 |
23101322 | 장우영 | 컴퓨터공학과 | 0 | 특별 장학생 |
23121423 | 공한비 | 디자인 학과 | 3,800,000 | NULL |
23141322 | 박정현 | 컴퓨터공학과, 경영학과 | 2,800,000 | NULL |
'박정현' 학생이 컴퓨터공학과와 경영학과를 복수전공한다고 한들, 이렇게 저장하지는 않습니다. 따로 복수전공 테이블이나 칼럼을 만들어서 추가하겠죠.
3. 제2정규형 (2NF)
모든 속성의 부분적 종속 (Partial Dependency)가 없이, 완전 함수 종속을 만족
제n정규형은 그 이전 정규형을 모두 만족합니다. 제2정규형의 경우에는 제1정규형의 조건에 '완전 함수 종속'이라는 조건이 추가된 형태죠.
완전 함수 종속이란 '오로지 기본키(PK)만으로 다른 속성이 결정'되는 것을 말하며, 기본키의 일부만으로도 다른 속성이 결정되어서는 안됩니다.
학기 (PK) | 학번 (PK) | 성명 | 학과 | 등록금 | 장학 |
2023-1 | 23101322 | 장우영 | 컴퓨터공학과 | 0 | 특별 장학생 |
2023-1 | 23121423 | 공한비 | 디자인 학과 | 3,800,000 | NULL |
2023-1 | 23141322 | 박정현 | 컴퓨터공학과 | 2,800,000 | NULL |
위와 같은 등록금 테이블이 있다고 합시다. 기본키는 학기와 학번입니다.
하지만 성명과 학과는 '학번'만으로도 결정될 수 있습니다. 굳이 학기까지 몰라도 됩니다. 이런 경우, 성명과 학과는 부분적 종속되어 있는 속성이라 볼 수 있습니다. 따라서 제2정규형을 만족시키려면 학과 칼럼을 제거하거나, 따로 테이블을 만들어야 합니다.
그렇다면 이런 테이블을 쓴다면 어떤 이상현상이 발생할까요? 학생이 개명이나 전과를 했을 때, 등록금 테이블의 내용은 그대로 변하지 않겠죠. 그러면 데이터 불일치 현상이 생깁니다.
하지만 당시 입금자명이나 등록금을 산정한 학과를 알아야하는 경우에는 이렇게 일부로 부분적 종속을 남기기도 합니다.
4. 제3정규형 (3NF)
기본키를 제외한 속성들 간 이행 종속성(Transitive Dependency)이 없음
이행 종속성이란 'X → Y이고 Y → Z 일 때, X → Z'인 경우를 말합니다.
학기 (PK) | 학번 (PK) | 성명 | 학과 | 기본 등록금 |
2023-1 | 23101322 | 장우영 | 컴퓨터공학과 | 2,800,000 |
2023-1 | 23121423 | 공한비 | 디자인 학과 | 3,800,000 |
2023-1 | 23141322 | 박정현 | 컴퓨터공학과 | 2,800,000 |
학번을 알면 소속된 학과를 알 수 있고, 학과를 알면 기본 등록금을 알 수 있습니다.
즉 '학번 → 학과이고 학과→ 기본 등록금이면 학번 → 기본 등록금' 입니다. 따라서 전과를 하게 되면, 기본 등록금도 같이 변경해줘야 하는 갱신 이상이 생깁니다.
학기 (PK) | 학번 (PK) | 학과 |
2023-1 | 23101322 | 컴퓨터공학과 |
2023-1 | 23121423 | 디자인 학과 |
2023-1 | 23141322 | 컴퓨터공학과 |
학기 (PK) | 학과 (PK) | 기본 등록금 |
2023-1 | 컴퓨터공학과 | 2,800,000 |
2023-1 | 디자인 학과 | 3,800,000 |
2023-1 | 컴퓨터공학과 | 2,800,000 |
제3정규형을 만족하려면, 학과별 기본 등록금 테이블을 따로 분리해야 합니다.
5. 보이스/코드 정규형 (BCNF)
모든 결정자가 후보키일 때, 결정자이면서 후보키가 아닌 것을 제거
6. 제4정규형 (4NF)
다치 종속(MVD) 제거
7. 제5정규형 (5NF)
모든 조인 종속이 후보키를 통해서만 성립 (PJ/NF)
제3정규형 이후로는 거의 사용하지 않습니다. 위 정규형을 만족시키려면 사실상 테이블당 2개 컬럼만 써야 합니다.
그렇게 쪼개서 테이블은 운용하는 곳은 없으며, 이론적으로 좀 더 공부하고 싶으신 분들만 찾아보시면 되겠습니다.
'CS > DB' 카테고리의 다른 글
[DB] 데이터베이스 장애와 회복 기법 (Redo 재실행, Undo 취소) (0) | 2023.04.25 |
---|---|
[DB] 트랜잭션의 특성(ACID, 원자성/일관성/고립성/영속성)과 상태 (0) | 2023.04.24 |
[DB] 데이터베이스 이상현상(삽입, 삭제, 갱신)과 함수종속성 개념과 예시 (0) | 2023.04.24 |
[DB] 가상 테이블, 뷰(VIEW)의 특성과 장단점 (0) | 2023.04.23 |
[DB] 테이블 키의 5가지 종류와 무결성 제약 3가지 종류 (0) | 2023.04.23 |
댓글