관계형 데이터베이스 실전 입문 - 04. 정규화 논리(두 번째) - 결합 종속성

1. 결합 종속성(JD)

함수 종속성을 사용한 정규화는 후보키가 되는 속성을 찾아내는 작업이다. 그리고 이런 숨겨진 후보키가 발견됐을 때에는 릴레이션을 무손실 분해해 릴레이션 내부의 중복을 제거할 수 있었다.

결합 종속성(Join Dependency)

4NF 이후는 결합 종속성에 대한 정규화다.

결합 종속성은 키 자체에 다중성이 포함됐을 때 나타나는 중복을 말한다.

A, B, … C의 제목 중 하나가 R의 제목 전체와 같을 때는 그 결합 종속성이 명백하다 고 발한다.

→ 릴레이션 내에 명백하지 않은 결합 종속성이 있으면 그 릴레이션은 4NF ~ 6NF에 의한 정규화 대상이 된다.

결합 종속성은 무손실 분해가 가능

함수 종속성은 결합 종속성의 일종이다

4NF 이후의 결합 종속성은 특징이 없고 찾기 어렵다.

암시적인 결합 종속성

슈퍼키로 분해할 수 있는 결합 종속성, 즉 공통의 후보키를 갖는 결합 종속성을 암시적인 결합 종속성을 의미.

키가 아닌 속성과 결합 종속성

사실은 4NF 이후의 정규화를 하는 경우는 거의 없다. BCNF까지 정규화를 하면 자동으로 5NF의 조건을 만족하는 경우가 많기 때문이다. 4NF 이후의 정규화를 해야 할지 아닐지를 판단하는 데 있어 중요한 것이 키가 아닌 속성의 유무다.

프로젝션으로 후보키를 나누면 함수 종속성이 사라지므로 무손실 분해를 할 수 없다.

→ 4NF, 5NF가 되도록 정규화하는 작업은 키가 아닌 속성이 존재하지 않는 릴레이션만 대상이 된다.

키가 아닌 속성이 존재하지 않는 릴레이션만 대상이므로 4NF, 5NF로의 정규화는 후보키에 여러 속성이 포함되는 경우인 복합키 일 때만 필요한 작업이다.

BCNF는 자동으로 5NF의 요건을 만족하게 된다.

  • 키가 아닌 속성이 존재할 때
  • 키에 포함되는 속성이 1개뿐일 때

정규화는 원래 그 테이블에 존재하는 자연키를 대상으로 해야 하는 작업이다. DB 설계할 땐 대리키의 존재를 무시할 것.

2. 결합 종속성에 의한 정규화(4NF ~ 6NF)

제4 정규형(4NF)

4NF는 ‘다치 종속성(MultiValued Dependency, MVD)’ 에 의한 정규화이다.

릴레이션이 BCNF이며 MVD가 배제된 상태의 4NF다. MVD는 다른 말로 하면 결합 종속성을 찾기 쉽게 하기 위한 도구라고 할 수 있다.

그러나 MVD는 결합 종속성의 특수한 경우의 하나에 지나지 않는다. 키가 아닌 속성을 갖지 않는 릴레이션을 결합 종속성에 의해 공통의 속성을 포함한 두 개의 릴레이션으로 무손실 분해할 수 있는 것이 MVD다.

image

{이름, 학과} 와 {이름, 수업} 이라는 제목을 가진 두 개의 릴레이션으로 무손실 분해할 수 있다.

제5 정규형

5NF는 마지막 정규형으로 이 이상은 릴레이션을 분해해도 의미가 없다. 5NF에서는 명백하지 않거나 암시적이지 않은 모든 결합 종속성이 제거된 상태를 나타낸다.

image

이 릴레이션은 세 개로 분해가 가능하다.

연결의 함정

위 릴레이션은 결합 종속성에 의해 세 개로 분해됐다. 이처럼 세 개 이상의 릴레이션으로 분해되는 결합 종속성을 연결의 함정(Connection Trap) 이라고 한다.

  1. 오민혁은 데이터베이스 학과에 소속돼 있고 [어떤 수업] 을 수강한다.
  2. 오민혁은 [어떤 학과]에 소속돼 있고 관계형 모델의 수업을 수강한다.
  3. [어떤 학생]은 데이터베이스 학과에 소속돼 있고 관계형 모델의 수업을 수강한다.
  4. 오민혁은 데이터베이스 학과에 소속돼 있고 관계형 모델의 수업을 수강한다.

논리학에서는 1 ~ 3의 명제가 참이더라도 4의 명제가 도출되지는 않는다. 이처럼 분해 후의 릴레이션이 원래의 릴레이션과 같은 사실을 나타내고 있지 않은 것처럼 보이는 현상을 연결의 함정이라고 한다.

곱집합과 결합 종속성

5NF는 MVD에서도 암시적이지 않은 결합 종속성을 다루지만 결합 종속성 중에 가장 단순한 것은 각각 한 개의 속성밖에 가지지 않는 두 릴레이션의 곱집합일 것이다. 두 개의 속성밖에 포함하지 않고 키가 아닌 속성이 없는 릴레이션이 무손실 분해가 가능한 경우는 한 개의 속성밖에 가지지 않는 릴레이션 사이의 곱집합인 경우만 가능하다.

결합 종속성을 발견하기 어렵다?

함수 종속성의 경우 그리고 무손실 분해를 하는 경우는 반드시 키가 아닌 속성이 포함된다는 특징이 있다. 키가 아닌 속성은 후보키에 함수 종속성이 있어서 비대칭적인 관계라고 할 수 있다.

비대칭성은 눈에 잘 띄므로 함수 종속성은 비교적 발견하기 쉽다고 할 수 있다.

그러나, 4NF, 5NF에서 다루는 함수 종속성은 양쪽 모두 키가 아닌 속성을 가지지 않는 릴레이션끼리 결합(JOIN)한 상태의 것이다.

→ 무손실 분해를 하면 함수 종속성처럼 키가 아닌 속성을 포함한 릴레이션이 생성되는 것이 아니라 릴레이션에 포함되는 속성이 대칭 관계성을 갖게 된다.

결합 종속성이 존재하는지 아닌지를 판별하는 방법은 실제로 프로젝션을 해 다시 결합해보는 방법이 있다. 결합한 다음에 릴레이션이 원래의 릴레이션과 같다면 결합 종속성이 존재할 가능성이 있다.

SQL에서 프로젝션하는 방법은 SELECT DISTINCT를 사용한다. FROM 절의 서브쿼리를 사용해도 되고 INSERT … SELECT 문을 사용해 다른 테이블에 데이터를 저장해 놓고 다시 JOIN을 해도 된다.

제6 정규형(6NF)

6NF는 명백한 결합 종속성(즉, 릴레이션 자신을 포함한 결합 종속성)만 남을 때까지 가능한 한 모든 결합 종속성을 제외한 상태의 정규형이다.

극한까지 키가 아닌 속성의 개수가 0 또는 1이 될 때까지 무손실 분해가 된 상태가 6NF이다.

6NF까지 분해된 릴레이션은 불필요한 결합이 많고 실용적이지 않으므로 실제의 DB 설계에서는 6NF를 목표로 정규화를 수행하지 않는다.

DB 설계는 일반적으로 5NF까지 한다.

요약

“무손실 분해를 할 수 있는 상태”를 나타내는 결합 종속성. 함수 종속성은 결합 종속성의 일종이다. 함수 종속성 이외의 명백하지도 암시적이지도 않은 결합 종속성을 제거하는 것이 4NF, 5NF의 정규화에 필요한 작업이다.

BCNF까지 도달한 릴레이션은 후보키가 단일 속성으로 구성돼 있거나 키가 아닌 속성이 존재하지 않은 경우 자동으로 5NF의 요건을 만족하게 된다.

→ 4NF, 5NF까지 정규화할 일은 별로 없다.


Written by@Sunny Son
개발자는 오늘도 뚠뚠

GitHubFacebook