정의 : 

데이터베이스의 설계를 재구성하는 테크닉입니다

정규화를 통해 불필요한 데이터 (redundancy)를 없앨 수 있고, 삽임/갱신/삭제 시 발생할 수 있는 각종 이상현상들을 방지 할 수 있습니다.

 

목적 : 

1. 불필요한 데이터를 제거

2. 데이터 저장을 "논리적"으로 한다.

 

함수적 종속이란?

어떠한 릴레이션에서 속성들의 부분 집합을 X, Y라 할때 특정 튜픙레서 X의 값이 Y의 값을 함수적으로 결정한다면 Y가 X에 함수적으로 종속되었다고 합니다.

 

함수적 종속의 추론 규칙은 아래와 같습니다.

  • 재귀 규칙 : Y가 X의 부분 집합이면 X → Y 이다.
  • 증가 규칙 : X → Y 이면 WX → WY 이고 WX → Y 이다.
  • 이행 규칙 : X → Y 이고 Y → Z 이면 X → Z 이다.
  • 유니온 규칙 : X → Y 이고 X → Z 이면 X → YZ 이다.
  • 분해 규칙 : X → YZ 이면 X → Y와 X → Z 이다.
  • 가이행 규칙 : 만일 W → X 이고 XY → Z 이면 WY → Z 이다.

 

종류 : 

1차 정규화 - 2차 정규화 - 3차 정규화 - BCNF - 4차 정규화 - 5차 정규화

 

실무적으로는 4차까지 가는 경우는 거의없다고 한다.

 

1차정규화

각 로우마다 컬럼의 값이 1개씩만 있어야 합니다. 이를 컬럼이 원자값(Atomic Value)를 갖는다고 한다.

위의 그림처럼 Adam이 2가지 속성을 가지고 있어서 분리해야 한다.

이렇게 되면 데이터 redundancy는 증가하게 된다.

 

2차 정규화

테이블의 모든 컬럼이 완전 함수적 종속을 만족해야 한다.

기본키중에 특정 컬럼에만 종속된 컬럼(부분적 종속)이 없어야 한다.

 

위 테이블의 경우 기본키는 (Student, Subject) 두 개로 볼 수 있습니다. 이 두 개가 합쳐져야 한 로우를 구분할 수가 있습니다. 근데 Age의 경우 이 기본키중에 Student에만 종속되어 있습니다. 즉, Student 컬럼의 값을 알면 Age의 값을 알 수 있습니다. 따라서 Age가 두 번 들어가는 것은 불필요한 것으로 볼 수 있습니다.

 

3차 정규화

기본키를 제외한 속성들 간의 이행적 함수 종속이 없는것

풀어서 말하자면, 기본키 이외의 다른 컬럼이 그 외 다른 컬럼을 결정할 수 없는 것.

2차 정규화와 마찬가지로 테이블을 분리하면서 해결가능

정규화 후

 

BCNF

3차정규형을 만족하면서 모든 결정자가 후보키 집합에 속한 정규형

 

아래와 같은 경우를 생각해보면, 후보키는 수퍼키중에서 최소성을 만족하는 건데, 이 경우 (학생, 과목) 입니다. (학생, 과목)은 그 로우를 유일하게 구분할 수 있습니다. 근데 이 테이블의 경우 교수가 결정자 입니다. (교수가 한 과목만 강의할 수 있다고 가정) 즉, 교수가 정해지면 과목이 결정됩니다. 근데 교수는 후보키가 아닙니다. 따라서 이 경우에 BCNF를 만족하지 못한다고 합니다. 3차 정규형을 만족하면서 BCNF는 만족하지 않는 경우는 언제일까요? 바로 일반 컬럼이 후보키를 결정하는 경우입니다.

학생 과목
교수


학점
 1 AB123
 김인영  A
 2  CS123  Mr.Sim  A
 3  CS123  Mr.Sim
 A

 

 위와 같이 테이블이 구성된 경우에 데이터가 중복되고, 갱신 이상이 발생합니다. 예를 들어 Mr.Sim이 강의하는 과목명이 바뀌었다면 두 개의 로우를 갱신해야합니다. 이를 해결하기 위해서는 마찬가지로 테이블을 분리합니다.

 

교수 테이블

 

교수


과목
 김인영 AB123
 Mr.Sim CS123

 

수강 테이블

 

학생
과목 
학점
 1  AB123   A
 2  CS123   A
 3  CS123   A

 

제4 정규형 :

다치 종속 제거

 

제5 정규형 :

조인 종속성 제거

 


출처 : 

https://nirsa.tistory.com/107

https://mangkyu.tistory.com/110

https://3months.tistory.com/193

'개발합시다. > BackEnd 공부' 카테고리의 다른 글

Swagger란  (0) 2021.08.26
SOAP API 와 REST API  (0) 2021.08.25
OPEN API와 Json (java)  (0) 2021.08.19
ACID란?  (0) 2021.08.18
트랜잭션(Transaction)이란?  (0) 2021.08.18

+ Recent posts