정규화(Normalization)란 |
테이블 간 데이터 중복을 최소화하여 무결성을 지키고 DB 저장용량을 줄이며, insertion, update, delete anomaly를 최소화하는 행위이다.
데이터 무결성 : 데이터 무결성은 데이터의 정확성, 일관성, 유효성이 유지되는 것을 의미한다.
그리고 정규화는 방식(rule)에 따라 단계로 나뉘어진다.
초기 테이블에서 순차적으로 정규화를 진행하면 되지만, 현업에서는 최대 BCNF 단계 정도만 진행한다고 한다.
경우에 따라서 테이블 JOIN에는 큰 비용이 들 수 있어 정규화를 되돌리는 역정규화 또한 존재한다.
정규화 장, 단점 |
정규화의 장점
- 데이터베이스 설계 시 이상 현상을 제거한다.
- 데이터베이스 확장 시 변화가 최소화된다.
정규화의 단점
- 릴레이션의 분해로 릴레이션 간 JOIN 연산이 많아진다.
Functional Dependency |
제 1 정규화에서BCNF 까지의 정규화는 KEY와 Functional Dependency 로 설명이 가능하다.
Functional Dependency의 개념은 다음과 같이 말할 수 있다.
테이블의 속성들로 이루어진 '집합 X와 집합 Y 사이에 X의 값이 같다면 Y의 값도 같아야 한다.'
다르게 말하면 'X의 값이 유일하다면 그 Y의 값도 유일하게 결정해야한다'고도 볼 수 있다.
이러한 의존관계를 funtional dependency라 부른다.
KEY |
데이터베이스에서의 Key 중엔 super key와 (candidate) key, primary key라는 개념이 있다.
super key : table에서 tuple들을 unique 하게 식별할 수 있는 attributes set
(candidate) key : 어느 한 attribute라도 제거하면 unique 하게 tuples를 식별할 수 없는 super key
primary key : 테이블에서 tuple들을 unique하게 식별하기 위해 선택된 (candidate) key
prime attribute : 임의의 (candidate) key에 속하는 attrubute
제 1 정규화 |
제 1 정규화의 rule: attribute의 value는 반드시 나눠질 수 없는 단일한 값(atomic)이어야 한다.
현재 학번 = 1의 릴레이션에서 과목이 운영체제, 비전으로 두 개의 값을 가진다. 이를 해결하기 위해 다음과 같이 만들 수 있다.
현재 테이블로는 데이터가 중복되기도 하고 만족스럽지 않기에 제 2 정규화로 넘어가겠다.
제 2 정규화 |
제 2 정규화의 rule: 1 정규화를 거친 테이블의 모든 non-prime attribute는 모든 key에 Fully Dependent 해야한다.
그렇기 위해서 Primary key의 부분집합에 의해서 Non prime attributes가 유일하게 식별되어선 안된다.
식별될 경우 모든 non-prime attribute들이 해당 키에 partially dependent하다고 한다.
그렇게 될 경우 테이블을 분리해야한다.
아래 테이블 다음과 같이 partially dependent하다.
다음과 같이 테이블을 분리하게 되면 제 2 정규화를 마칠 수 있다.
제 3 정규화 |
transitive FD 존재 if X -> Y & Y -> Z holds, then X -> Z is transitive FD , Y or Z is Not subset of any key
제 3 정규화 : 모든 non-prime attribute는 어떤 key에도 transitively dependent(이행 종속) 하면 안된다.
non-prime attribute 사이에는 FD가 있음 안된다.
이 경우가 이행 종속이 존재할 때이다.
이 경우 직급과 할인율을 다른 테이블로 분리함으로 해결할 수 있다.
BCNF |
BCNF : 모든 유효한 non-trivial FD X -> Y는 X가 (candidate) key여야 한다
non -trivial : Y가 X의 부분집합이 아닌 경우
(결정자이면서 후보키가 아닌 것을 제거해야한다.)
이러한 경우 담당교수가 (candidate) key가 아님에도 불구하고 과목을 결정하고 있다.
다음과 같이 테이블을 나눌 수 있는데 이번엔 학번에서 데이터의 중복이 일어나며 다치 종속이 나타난다.
다치 종속 제 4 정규화에서 다룬다.
참고자료
https://www.youtube.com/watch?v=5QhkZkrqFL4&ab_channel=%EC%89%AC%EC%9A%B4%EC%BD%94%EB%93%9C
https://code-lab1.tistory.com/270
정리 |
2NF는 key가 composite key 가 아니라면 2NF는 자동적으로 만족한다. 보통은 그렇지만 해당 속성의 값이 하나로 고정된 경우 공집합이 결정자인 경우 FD가 존재해서 위배된다. 이 경우 따로 테이블을 하나 만들어야한다.
앞서 말한듯 논리를 정연히 하고 중복을 줄여 무결성의 이점이 있는 정규화지만 과도한 JOIN 쿼리로 인해 성능에서 trade off가 있을 수 있으니 이 점을 유의하며 설계하기바랍니다.
긴 글 읽어주셔서 감사합니다.
부족한 점이 있다면 부디 알려주시면 감사하겠습니다.
'CS > 데이터베이스' 카테고리의 다른 글
[DB] 외래키는 꼭 설정해야할까? (0) | 2023.07.19 |
---|---|
[DB] 데이터베이스 종류와 장단점 (0) | 2023.07.18 |
[DB] 릴레이션, 튜플, 속성, 도메인 (0) | 2023.07.18 |
[DB] 이상 현상(Anomaly) (0) | 2023.07.18 |
댓글