데이터베이스 정규화에 대해 공부해보자 ❕
정규화는 이상현상이 있는 릴레이션을 분해하여 중복을 없애고 구조화하는 과정이다. 정규화 과정을 통해 삽입/갱신/삭제 시 발생할 수 있는 이상현상들을 방지할 수 있으며 데이터를 효율적으로 관리할 수 있다.
1. 이상현상(Anomaly)
- 삭제 이상 : 데이터 삭제 시 원하지 않는 값들이 연쇄적으로 삭제되는 현상
- 삽입 이상 : 데이터 삽입 시 원하지 않는 값들이 삽입되는 현상
- 수정 이상 : 데이터 수정 시 데이터의 일부만 수정되는 현상
학생정보 테이블에 학번, 이름, 학과, 강의명, 강의실 컬럼이 존재한다. 지금처럼 정규화되지 않은 테이블에서는 다음과 같은 이상현상이 발생한다.
(삭제 이상) 학생과 관련된 데이터를 제거하려고 한다면, 강의명과 강의실에 대한 데이터도 제거된다. 따라서 원하지 않는 값들도 함께 제거되는 문제가 발생한다.
(수정 이상) A학생과 B학생이 같은 강의를 듣는데, 강의실이 변경되어 A학생의 강의실 데이터를 변경했다. 이 경우 B학생의 강의실 데이터는 변경되지 않아, 데이터의 일부만 변경되는 문제가 발생한다.
(삽입 이상) 새로운 강의가 열려 강의와 관련된 데이터를 추가하려고 한다면, 학번과 이름 같은 컬럼의 데이터는 null 값으로 채워지는 문제가 발생한다.
이 경우 학생정보와 강의정보 테이블을 분리해 이상현상을 없앨 수 있다.
이제 학생정보를 제거해도 강의정보는 남아있게 되고, 강의실이 변경되었을 때 강의정보 테이블만 변경하면 해당 강의를 듣는 학생들의 강의실 정보가 모두 변경된다. 새로운 강의가 열렸을 때는 강의정보 데이터만 삽입하면 된다.
2. 정규화 법칙
테이블을 분해하는 정규화 단계는 높아질수록 이상현상이 줄어든다. 실무에서 사용하는 정규화는 제1정규화 ~ 5정규화까지 있다. 하지만 대부분의 릴레이션에는 BCNF까지 정규화하면 이상현상이 없어지기 때문에 4, 5정규화까지 하는 경우는 드물다.
- 제1정규화 (1NF)
- 제2정규화 (2NF)
- 제3정규화 (3NF)
- BCNF (Boyce-codd Normal Form)
- 제4정규화 (4NF)
- 제5정규화 (5NF)
제 1 정규형 (1NF)
모든 속성값이 원자값을 갖도록 한다.
왼쪽 테이블에서 학생A는 학과 데이터에 (수학과, 통계학과)가 저장되어 있다. 이는 원자값이 아니므로 제1정규형을 만족하지 못한 것이다. 제1정규화를 통해 오른쪽 테이블처럼 분리할 수 있다. 오른쪽 테이블은 모든 속성값이 원자값을 가지므로 1NF를 만족한다.
제 2 정규형 (2NF)
제 1 정규형를 만족하고, 기본키가 아닌 속성이 기본키에 완전 함수 종속하도록 해야 한다.
복합키가 기본키일 때, ^기본키의 부분집합이 다른 데이터 값을 결정하는 부분 함수 종속하면 안된다.^
복합키(학번, 강의명)가 기본키이고, (학번, 강의명)으로 (성적)을 결정한다. 근데 여기서 (강의명) 단일 값으로 (강의실)을 결정할 수 있다. (강의실)이 기본키의 부분집합인 (강의명)에게 부분 함수 종속되고 있으므로 제2정규화를 만족하지 않는 상태이다. 아래와 같이 테이블을 분리한다면 2NF를 만족하게 된다.
제 3 정규형 (3NF)
제 2 정규형를 만족하고, 기본키가 아닌 속성이 기본키에 대해 이행적 종속(Transitive Dependency)이 없도록 해야 한다.
^이행적 종속이란 A → B, B → C가 성립할 때 A → C가 성립되는 함수 종속성을 의미한다.^
학생이 수강하는 강의의 데이터를 저장하는 테이블이 있다. (학번)은 (강의명)을 결정하고 (강의명)은 (지도교수)를 결정한다. 이 경우 (학번)이 (지도교수)를 결정하게 되는 ^이행적 종속이 발생^한다. 이 때 1번 학생의 (강의명)을 '자료구조'로 변경해도 (지도교수)는 여전히 '김교수'로 남아있게 되는 문제가 발생한다.
이런 경우 이행적 종속이 발생하는 컬럼들을 분리해준다면 3NF를 만족하게 된다. 다음과 같이 테이블을 분리하면 학번이 1인 학생의 (강의명)을 '자료구조'로 변경하면 (지도교수)는 '이교수'로 조회된다.
BCNF (Boyce-codd Normal Form)
제 3 정규형를 만족하고, 모든 결정자가 *후보키 집합에 속해야 한다.
학생이 수강하는 강의의 데이터를 저장하는 테이블에서 기본키는 (학번, 강의명)이다. 후보키인 (학번, 강의명)이 (지도교수)를 결정하고, 후보키가 아닌 (지도교수)도 (강의명)을 결정하고 있다. (지도교수)는 다른 값을 결정하는 결정자이지만, 후보키가 아니다. 다음과 같이 테이블을 분리하면 BCNF를 만족하게 된다.
* 슈퍼키(Super Key), 후보키(Candidate Key) ?
- 슈퍼키 : 테이블에서 각 튜플을 유일하게 식별할 수 있는 하나 또는 그 이상의 속성들의 집합. 슈퍼키는 유일성만 만족하면 슈퍼키가 될 수 있다.
- 후보키 : 테이블에서 각 튜플을 유일하게 식별할 수 있는 최소한의 속성들의 집합. 후보키는 기본키가 될 수 있는 후보들이며 유일성과 최소성을 동시에 만족한다.
학과 테이블에 (학번, 이름, 주민번호, 전화번호) 컬럼이 존재한다면
(학번), (주민번호), (이름, 전화번호)는 슈퍼키가 될 수 있다.
(학번), (주민번호)는 후보키가 될 수 있지만 (이름, 전화번호)는 후보키가 될 수 없다.
제 4 정규형 (4NF)
BCNF를 만족하고, 다치 종속(Multi-valued Dependency)이 없어야 한다.
다치 종속은 다음 조건들을 만족한다.
- A → B 일 때, 하나의 A에 대해 여러 B가 존재한다면 B는 A에 다치 종속이다. (A ↠ B)
- 최소 3개의 컬럼이 존재한다.
- B가 A에게 다치종속될 때, B와 C가 독립적인 관계이다.
위 테이블에서 (학번)은 (강의명)과 (취미)를 결정한다. 하나의 (학번)에 대해 여러 (취미)가 종속되고 따라서 여러 (강의명)도 종속된다. (강의명)과 (취미)는 서로 독립적인 관계이므로 다치 종속되고 있다. 만약 1번 학생의 취미를 하나 더 추가하는 경우, 2개의 튜플이 추가되는 문제가 있다.
다음과 같이 테이블을 분리하면 4NF를 만족하게 된다.
제 5 정규형 (PJ / NF. Projection-Join Normal Form)
제 4 정규형를 만족하고, 조인 종속이 없어야 한다.
^조인 종속은 하나의 릴레이션을 여러 개의 릴레이션으로 분리했다가, 다시 조인했을 때 데이터 손실은 없지만 불필요한 데이터가 생기는 것을 말한다.^
(예시 생략)
만약 5정규형까지 만족하도록 정규화한다면 테이블마다 컬럼 개수는 작게 구성될 것이며, 오히려 조인하는 비용이 커질 수도 있다.
3. 정규화 장단점
정규화를 통해 데이터 중복을 최소화하고 일관성, 무결성을 보장할 수 있게 된다. 따라서 데이터베이스의 성능을 향상시키고 데이터 효율적으로 관리할 수 있게 된다. 하지만 정규화를 과도하게 진행한 경우, 분해된 테이블 간의 조인 연산이 많아지게 되고 질의에 대한 응답 시간이 느려질 수 있기 때문에 적절한 정규화를 통해 데이터베이스를 관리해야 한다.
참고자료 😃
https://mangkyu.tistory.com/28
https://code-lab1.tistory.com/48
https://code-lab1.tistory.com/270
https://blog.naver.com/cmw1728/221270636239
'DB' 카테고리의 다른 글
[DB] B-Tree, B+Tree - DB Index (0) | 2024.04.18 |
---|---|
[DB] NoSQL (NotOnly SQL) (1) | 2024.03.28 |
[DB] 트랜잭션 격리수준 (Transaction Isolation) (0) | 2024.03.15 |
[DB] 트랜잭션 (Transaction) (0) | 2024.03.10 |
[DB] 인덱스 (index) (1) | 2024.03.10 |