[데이터베이스] 정규화

공혁준·2022년 4월 29일
0

데이터베이스

목록 보기
2/4
post-thumbnail

📌 정규화를 다룹니다.

정규화

정규화 목적

가장 큰 목표는 테이블 간 중복된 데이터를 허용하지 않는 것이다.
중복된 데이터를 만들지 않으면, 무결성을 유지할 수 있고, DB 저장 용량 또한 효율적으로 관리할 수 있다.

  • 데이터의 중복을 없애면서 불필요한 데이터를 최소화시킨다.
  • 무결성을 지키고, 이상 현상을 방지한다.
  • 테이블 구성을 논리적이고 직관적으로 할 수 있다.
  • 데이터베이스 구조를 확장에 용이해진다.

이상(Anomaly) 개념 및 종류

정규화를 거치지 않으면 데이터베이스 내에 데이터들이 불필요하게 중복되어 릴레이션 조작 시 문제가 생기는데, 이를 이상이라고 하며 삽입 이상, 삭제 이상, 갱신 이상이 있다

  • 삽입 이상 (Insertion Anomaly) : 데이터를 삽입할 때 원하지 않은 값들도 함께 삽입되는 현상
  • 갱신 이상 (Update Anomaly) : 데이터를 수정할 때 일부 튜플의 정보만 갱신되어 정보에 모순이 생기는 현상
  • 삭제 이상 (Deletion Anomaly) : 데이터를 삭제할 때 의도와는 상관 없는 값들도 함께 삭제되는 현상

정규화 과정

1NF(제 1 정규형)

테이블의 컬럼이 원자값(하나의 값)을 갖도록 테이블을 분리시키는 것을 말한다.

만족해야 할 조건은 아래와 같다.

  • 어떤 릴레이션에 속한 모든 도메인이 원자값으로만 되어 있어야한다.
  • 모든 속성에 반복되는 그룹이 나타나지 않는다.
  • 기본키를 사용하여 관련 데이터의 각 집합을 고유하게 식별할 수 있어야 한다.

Customer

Customer IDFirst NameSurnameTelephone Number
123PoojaSingh555-861-2025, 192-122-1111
456SanZhang(555)403-1659, 182-929-2929
789JohnDoe555-808-9633

현재 테이블은 전화번호를 여러 개 가지고 있어 원자값이 아니다. 따라서 1NF에 맞추기 위해서는 아래와 같이 분리할 수 있다.

Customer

Customer IDFirst NameSurnameTelephone Number
123PoojaSingh555-861-2025
123PoojaSingh192-122-1111
456SanZhang182-929-2929
456SanZhang(555)403-1659
789JohnDoe555-808-9633

2NF(제 2 정규형)

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

완전 함수적 종속 : 만약 (속성 A, 속성 B) -> 속성 C 일때, A->C, B->C 모두 성립될때 완전 함수적 종속이라 한다
부분 함수적 종속 : 만약 (속성 A, 속성 B) -> 속성 C 일때, A->C, B->C 중 하나만 성립될때(모두 성립 x) 부분 함수적 종속이라 한다

조금 쉽게 말하면, 테이블에서 기본키가 복합키(키1, 키2)로 묵여있을 때, 두 키 중 하나의 키만으로 다른 컬럼을 결정지을 수 있으면 안된다.

기본키의 부분집합 키가 결정자가 되어선 안된다는 것

Electric Toothbrush Models

ManufacturerModelModel Full NameManufacturer Country
ForteX-PrimeForte X-PrimeItaly
ForteUltracleanForte UltracleanItaly
Dent-o-FreshEZbrushDent-o-Fresh EZbrushUSA
KobayashiST-60Kobayashi ST-60Japan
HochToothmasterHoch ToothmasterGermany
HochX-PrimeHoch X-PrimeGermany

ManufactureModel이 키가 되어 Model Full Name을 알 수 있다.
Manufacturer CountryManufacturer로 인해 결정된다. (부분 함수 종속)
따라서, ModelManufacturer Country는 아무런 연관관계가 없는 상황이다.

결국 완전 함수적 종속을 충족시키지 못하고 있는 테이블이다. 부분 함수 종속을 해결하기 위해 테이블을 아래와 같이 나눠서 2NF를 만족할 수 있다.

Electric Toothbrush Manufacturers

ManufacturerManufacturer Country
ForteItaly
Dent-o-FreshUSA
KobayashiJapan
HochGermany

Electric Toothbrush Models

ManufacturerModelModel Full Name
ForteX-PrimeForte X-Prime
ForteUltracleanForte Ultraclean
Dent-o-FreshEZbrushDent-o-Fresh EZbrush
KobayashiST-60Kobayashi ST-60
HochToothmasterHoch Toothmaster
HochX-PrimeHoch X-Prime

3NF(제 3 정규형)

2NF가 진행된 테이블에서 이행적 종속을 없애기 위해 테이블을 분리하는 것이다.

이행적 종속 : A -> B, B -> C 의 종속관계에서 A -> C를 만족하는 관계를 의미한다

아래 두가지 조건을 만족시켜야 한다.

  • 릴레이션이 2NF에 만족한다.
  • 기본키가 아닌 속성들은 기본키에 의존한다.

Tournament Winners

TournamentYearWinnerWinner Date of Birth
Indiana Invitational1998Al Fredrickson21 July 1975
Cleveland Open1999Bob Albertson28 September 1968
Des Moines Masters1999Al Fredrickson21 July 1975
Indiana Invitational1999Chip Masterson14 March 1977

현재 테이블에서는 TournamentYear이 기본키다.
Winner는 이 두 복합키를 통해 결정된다.
하지만 Winner Date of Birth는 기본키가 아닌 Winner에 의해 결정되고 있다.
따라서 이는 3NF를 위반하고 있으므로 아래와 같이 분리해야 한다.

Tournament Winners

TournamentYearWinner
Indiana Invitational1998Al Fredrickson
Cleveland Open1999Bob Albertson
Des Moines Masters1999Al Fredrickson
Indiana Invitational1999Chip Masterson

Winner Dates of Birth

WinnerDate of Birth
Bob Albertson28 September 1968
Al Fredrickson21 July 1975
Chip Masterson14 March 1977

BCNF(Boyce-Codd 정규형)

결정자가 모두 후보키인 정규형이다.(후보키가 아닌 결정자를 제거하는 정규형이다)

[BCNF의 제약 조건]

  • 키가 아닌 모든 속성은 각 키에 대하여 완전 종속해야 한다
  • 키가 아닌 모든 속성은 그 자신이 부분적으로 들어가 있지 않은 모든 키에 대해 완전 종속해야 한다
  • 어떤 속성도 키가 아닌 속성에 대해서는 완전 종속 할 수 없다
결정자 : 다른 속성을 고유하게 결정하는 하나 이상의 속성 (속성 간의 종속성을 규명할 때 기준이 되는 값)
종속자 : 결정자의 값에 의해 정해지는 값
후보키 : 테이블에서 각 행을 유일하게 식별할 수 있는 최소한의 속성들의 집합  

4NF(제 4 정규형)

다치 종속을 제거하는 정규형이다.

다치 종속 : 속성 A -> (속성 B, 속성 C) 일때, A->B를 만족하고, **B와 C가 무관**할때 B는 A에 다치종속 관계라고 하며, A->>B 라고 한다. 

다치종속을 제거하지 않으면 A->>B 상황에서 C값이 중복될수 있다.
예를들어,

(회원번호)-> (이름, 주문번호) 인 테이블에서
(회원번호 ->> 주문번호) 일때,

홍길동 고객이 책을 두번 주문하면 홍길동 이름이 불필요하게 두번 중복된다.
이를 해결하기 위해서는 (회원번호->이름), (회원번호->주문번호)로 쪼개주는것이 제 4정규형이다.

5NF(제 5 정규형)

릴레이션 R의 모든 조인종속이 R의 후보키를 통해서만 성립되는 정규형이다.

한 테이블을 분해했다가 분해된 결과들을 다시 조인하면 당연히 원래의 테이블로 복원된다고 기대하지만 그렇지 못한 경우가 있다.
다시 조인하면 예상하지 못했던 튜플들이 생성되는 경우가 발생한다.

조인 종속 :  테이블을 분해한 결과를 다시 조인했을 때 원래의 테이블과 동일하게 복원되는 제약조건이다.

참고

https://github.com/ksundong/backend-interview-question
https://github.com/gyoogle/tech-interview-for-developer

profile
몰입을 즐기는 개발자입니다.

0개의 댓글