DB/관계형 DB

정규화 논리 (함수 종속성) #(제 1정규형 ~ 제 3+정규형)

쿠와와 2021. 1. 10. 19:33

1. DB 설계가 중요한 이유

객체지향 프로그래밍에서 적절한 객체가 설계돼 있지 않다면 그에 대한 조작인 멤버함수나 메서드는 복잡해질 것이며 응용프로그램의 로직도 잘 표현할 수 없을 것이다.

RDB도 똑같다. 데이터의 조작인 쿼리는 DB에 포함된 각 테이블이 적절히 설계돼 있지 않으면 깔끔하게 표현할 수 없다. 

그래서 필요한 것이 정규화 이론이다 

 

2. 정규화 ( 관계형 모델을 보완하는 이론 )

사용이유 

1. 변칙을 방지할 수 있다. ( 논리적 모순이 발생하여 답이 나올 수 없는 구조 )

  - 릴레이션의 설계가 상식적이지 않을 때 발생

  - 중복때문에 발생 

 

정규형 (NF)

정규화에는 몇 가지 단계가 있는데 높은 단계로 갈수록 더 좋은 상태가 된다. ( 중복이 적은 상태 ) 

 

함수 종속성( FD )

정의 : 어떤 릴레이션 R이 있고, 제목의 부분집합두 개를 A, B라고 하자. 릴레이션 R의 모든 튜플이 A의 값이 같다면 B의 값도 같은 경우가 있을 수 있다. 이 경우에 한해서 B는 A에 함수 종속한다고 하고, 이라헌 관계성을 A->B라고 기술 한다.

" A의 값을 알면 B의 값을 할 수 있다" 는 의미

이 정의에 의해서 필연적으로 도출되는 함수종속성을 자명한 함수 종속성이라고 한다.

정규화의 의미는 자명하지 않은 함수 종속성을 없애는 것이다. 

 

종류 - 특성  ( 특성 높은 단계의 정규형은 자동으로 낮은 정규형의 조건을 만족 )

◆ 제 1정규형

1NF를 하기 위한 요건은 "릴레이션이어야 할 것"이다. -> SQL의 조건

 

테이블이 1NF가 되기 위한 요건 -> 관계형 DB

  - 행이 위에서 아래로 정렬돼 있지 않다. => 의존하지 않는다는 의미

  - 열이 왼쪽에서 오른쪽으로 정렬돼 있지 않다. => 의존하지 않는다는 의미

  - 중복하는 행이 존재하지 않는다. -> 기본키나 유니크 키를 부여하면 된다.

  - 각 행과 열의 교차점은 도메인에 속하는 요소의 값을 딴 한개만 가진다. 

  - 모든 열의 값은 정의된 것이어야 하고 각 행은 항상 존재한다. (Null 이 있다면 테이블을 나누자)

 

후보키 : 그 릴레이션에 포함된 튜플의 값을 고유하게 하는 속성의 집합 ( 더는 속성을 줄일 수 없는 상태 )

수퍼키 : 후보키에서 추가 속성을 가지는 키 

테이블 예시

◆ 제 2정규형

  후보키의 진부분집함에서 키가 아닌 속성에 함수 종속성을 제거하는 작업. 이때 부분 함수 종속성은 부분집합 중에 원래 자신의 집합을 제외한 것이다. 

  즉 릴레이션이 1NF이며 부분 함수 종속성을 갖지 않으면 그 릴레이션은 2NF가 된다. 

  위의 그림을 보면 각각의 행과 열은 종합적으로는 다르지만 같은 학번에 같은 등록금을 가지는 형태를 볼 수있다. (모순 발생 ) 

  

무손실 분해

한 개의 릴레이션을 여러 개의 릴레이션으로 분해하는 작업 ( 프로젝션 ) 이때 원래 릴레이션의 정보를 잃어버리지 않게 두 개의 릴레이션으로 분해하는 것을 무손실 분해라고 한다. 

 

◆ 제 3정규형

  • 추이 함수 종속성이라는 함수종속성을 제거하는 작업
    • 추이 함수 종속성: 키가 아닌 속성 사이의 함수 종속성으로 아래와 같이 나타낼 수 있다.

추이 함수 종속성

◆ 보이스코드 정규형

  • 자명하지 않은 함수 종속성이 모두 제거된 상태의 정규형

DCNF에서 제거되는 함수 종속성

후보키 내부에 자명하지 않은 함수 종속성은 존재하지 않는가?

자명하지 않은 함수 종속성의 세가지 패턴
- 후보키의 진부분집합 -> 키가 아닌 속성
- 키가 아닌 속성 -> 키가 아닌 속성
- 키가 아닌 속성 -> 후보키의 진부분집합

BCNF까지 진행했다면 자동으로 5NF의 조건을 만족하는 경우가 많고 여기까지의 지식만으로도 충분히 위력을 발휘한다. 
하지만 함수 종속성만으로는 한계에 이른다. 그래서 결합 종속성이라는 개념을 알아야한다. 다음 글에는 결함 종속성과 4~6 NF를 설명하겠다. 

'DB > 관계형 DB' 카테고리의 다른 글

릴레이션 직교성  (0) 2021.01.18
정규화 논리 (결합 종속성) #(제 4정규형 ~ 제 6정규형)  (0) 2021.01.11
procedure  (0) 2020.12.29
mysql - CRUD 작업하기  (0) 2020.12.28
MYSQL 사용법  (0) 2020.12.27