개발 블로그
[데이터베이스] 정규화와 함수적 종속성 본문
정규화란?
정규화는 관계형 데이터베이스 설계에서 정보를 보존한 상태로 중복을 최소화하는 방향으로 데이터를 구조화하는 과정이다.
정규화가 필요한 이유는?
처음부터 요구 사항을 잘 확인해 ERD를 설계하고 릴레이션 스키마로 잘 사상했으면 상관없지만, 잘못된 설계로 만들어진 경우 체계적인 단계를 이용하여 설계를 고쳐나가야 한다.
정규화의 종류
잘못된 설계를 체계적으로 구분하고, 단계별로 고쳐나가기 위해 정규형을 만들어 특정 규칙을 만족하면 정규형을 만족한다고 한다.

함수적 종속성 (functional dependency)
X와 Y를 임의의 속성들의 집합이라고 할 때 X의 값이 Y의 값을 고유하게 결정하면, Y는 X에 함수적으로 종속된다고 말하고 X -> Y로 표기한다.
함수적 종속을 기반으로 문제를 파악하고 정규화한다.
함수적 종속성의 예

위의 테이블에서 회원 번호는 이름을 고유하게 결정한다. 예를 들어 회원 번호 2번은 이지혜를 고유하게 결정한다. 하지만 성별은 이름을 고유하게 결정하지 못한다. 즉 함수적으로 종속되지 않는다.
함수적 종속 확인 시 주의할 점
요구 사항이나 속성 간의 관계를 모르는 상황에서 릴레이션의 튜플로만 함수적 종속 성립 여부 판단하기는 어렵다. 예를 들어 위의 테이블만 본다면 이름(X)으로 아이디(Y)를 고유하게 결정하는 것처럼 보이지만, 실제로는 동명이인이 존재할 수 있기 때문에 주의해야 한다.
릴레이션과 함수적 종속성
요구 사항과 릴레이션에 관련된 내용을 보면 각 릴레이션의 함수적 종속을 파악할 수 있다.


주의할 점
X -> Y 존재 유무가 Y -> X 존재 유무를 결정짓는 것은 아니다.
예를 들어 '회원번호 -> 이름'은 가능하지만 '이름 -> 회원번호'는 불가능하다.
제 1 정규형 (1NF: First Normal Form)
속성의 도메인이 오직 원자 값들만 포함되고 튜플의 모든 속상값은 그 속성 도메인에 속하는 하나의 값이어야 한다. 즉 제 1 정규형이 허용하는 속성값의 유일한 형태는 원자값이다.
제 1 정규형 위배
원자값을 저장하는 것이 아닌 릴레이션 상태

회원 릴레이션에 관심사 속성은 원자값이 아닌 다치값을 가진다. 제 1 정규형을 만족하는 릴레이션은 다치값이 아닌 원자값을 가져야 하므로 위의 릴레이션은 제 1 정규형을 위배한다.
제 1 정규형으로 정규화하는 방법은 회원 릴레이션을 두 개의 릴레이션으로 분리한다.

분리하는 과정은, 먼저 기본키와 다치값을 가지는 속성으로 릴레이션을 수평적 분리한다. 그리고 수직적으로 분리하고 릴레이션의 기본키를 '회원번호'와 '관심이름'으로 변경한다. 이렇게 분리된 두 릴레이션은 모두 속성값으로 하나의 값을 가지므로 정상적으로 분리됐다.
관심사 속성이 다치값이고 한 회원은 여러 개의 관심사를 가질 수 있으므로 1:N 관계로 릴레이션을 재설계하면 된다.
제 2 정규형 (2NF: Second Normal Form)
릴레이션 스키마에 있는 비주요 속성(기본키가 아닌 속성)이 릴레이션의 기본키에 완전하게 함수적으로 종속되면 릴레이션은 제 2 정규형을 만족한다. 제 2 정규형을 만족하면 제 1 정규형을 만족한다.
(기본키로 여러 속성을 가지는 릴레이션에 대해, 키가 아닌 속성들은 기본키의 일부분에 함수적으로 종속되서는 안 된다.)
- 주요 속성: 후보키(튜플을 유일하게 식별할 수 있는 단일 또는 그룹의 속성)에 속하는 속성
- 비주요 속성: 후보키가 아닌 속성
완전하게 함수적으로 종속한다 의 의미
함수적 종석성 X -> Y 에서 X의 임의의 속성을 제거했을 때 함수적 종속이 성립하지 않는 것을 말한다. X 자체로 함수적 종속이 성립된다.
예를 들어 한 릴레이션의 기본키가 {A, B}일 때, A 또는 B를 제거했을 때 A -> Y (또는 B -> Y)의 함수적 종속이 성립하지 않는다면 완전하게 함수적 종속한다.
제 2 정규형 위배

위 릴레이션에서 기본키는 {회원번호, 게시글 번호}이다. 기본키는 함수적 종속된다. 그러나 회원번호를 X로 보면 회원 번호가 이름, 성별, 생년월일을 고유하게 결정한다. 즉 회원번호가 함수적 종속한다. 그리고 게시글 번호를 X로 봤을 때도 함수적 종속이 존재한다. 즉 회원번호에 종속되는 속성과, 게시슬 번호에 종속되는 속성이 있다. 이와 같이 기본키의 일부분에 대해 함수적 종속적이 존재하는 경우를 부분 함수적 종속이라고 하고, 이는 제 2 정규형에 위배된다.
제 2 정규형 위배는 일반적으로 M:N 관계를 잘못 사상하면 발생한다.
제 2 정규형으로 정규화하는 방법
함수적 종속 별로 릴레이션을 분리해 부분 함수적 종속을 제거한다.

함수적 종속을 따라 조회기록의 릴레이션을 분리하는데, 먼저 조회 날짜 시간은 {회원번호, 게시글}에 완전 함수적 종속하므로 세 가지 속성이 하나의 릴레이션으로 분리된다. 그리고 회원번호의 함수적 종속을 따라 회원 릴레이션, 게기슬의 함수적 종속을 따라 게시글 릴레이션으로 분리한다.

제 3 정규형 (3NF: Third Normal Form)
릴레이션의 모든 함수적 종속성 X -> Y에 대해서
X가 릴레이션의 슈퍼키이거나, Y가 릴레이션의 주요 속성이면 제 3 정규형을 만족한다.
즉 릴레이션에서 키가 아닌 속성들이 키가 아닌 다른 속성에 함수적으로 종속하면 안 된다, 이행적으로 종속해서는 안 된다.
이행적 종속(transitive depency)란
Z가 비주요 속성이고 X -> Z, Z -> Y 이면 이행적 종속이라고 한다.
X가 릴레이션의 슈퍼키의 의미

회원번호는 슈퍼키이므로 X(회원번호)가 릴레이션의 슈퍼키이다.
아이디도 슈퍼키이므로 X(아이디)가 릴레이션의 슈퍼키이다.
Y가 릴레이션의 주요 속성의 의미
주요 속성인 회원번호와 아이디에서, 회원번호가 아이디를 고유하게 결정한다. 회원번호 -> 아이디, 아이디 -> 이름, 성별, 생년월일 등 이므로 제 3 정규형을 만족한다.
제 3 정규형 위배 사례
1)

위 릴레이션에서 게시글번호 -> 회원번호, 회원번호 -> 작성자이름으로 이행적 종속이 존재한다. (게시글번호 -> 회원번호 -> 작성자이름, 게시글번호 -> 회원번호 -> 작성자성별). 이때 회원번호는 슈퍼키도 아니고 작성자이름이 주요 속성도 아니므로 제 3 정규형을 위배한다.
이행적으로 종속해서는 안 된다. 그러나 Y가 주요 속성이면 이행적 종속은 상관없다.

게시글번호가 슈퍼키는 아니지만 게시글 번호와 함수적으로 종속되는 '게시글제목'이 있다. 정리하면 '회원번호'와 '게시글번호'는 슈퍼키도 아니고 '작성자이름', '작성자성별', '게시글제목'도 주요 속성이 아니므로 제 3 정규형을 위배한다.
제 3 정규형을 정규화하는 방법
제 2 정규형을 정규화하는 방법과 유사하게 함수적 종속 별로 릴레이션을 분리한다.
게시글 릴레이션에서 함수적 종속 별로 분리하면 게시글 릴레이션과 회원 릴레이션으로 분리된다.

위의 댓글 릴레이션도 동일하게 함수적 종속 별로 분리하면

이행적 함수적 종속을 만들어내는 속성들이 각 릴레이션의 기본키가 된다. 이 결과는 모든 릴레이션의 모든 함수적 종속에 대해 X가 슈퍼키이므로 제 3 정규형을 만족한다.
BCNF (Boyce-Codd Normal Form)
'전공 공부 > 데이터베이스' 카테고리의 다른 글
[데이터베이스]트랜잭션의 동시성과 lock (0) | 2022.12.18 |
---|---|
[데이터베이스] 트랜잭션(transaction)이란?/트랜잭션 개념, 성질 (0) | 2022.12.17 |
[데이터베이스] 릴레이션 분석 지침 (0) | 2022.12.14 |
[데이터베이스] 관계 대수(relational algebra)란? (0) | 2022.12.13 |
[데이터베이스]서브쿼리란?/ 서브쿼리 사용법 (0) | 2022.12.11 |