학습(공부)하는 블로그 :: 10. 정규화 - 이상 현상, 함수적 종속성, 정규화 단계
 

 
반응형
블로그 이미지
학습하고 공부한 것을 보고 싶을때 다시 볼려고 요약해서 정리한 블로그입니다. 좋은 정보는 서로 공유합시다. 깨비형
« 2026/7 »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Archive»


Category»

Notice»

Recent Post»

Recent Comment»

Recent Trackback»

07-18 12:46

반응형

 

💡 1분 핵심 요약 (TL;DR)

  • 이상 현상(anomaly) — 데이터 중복 때문에 삽입·갱신·삭제 시 발생하는 부작용 3종류
  • 함수적 종속성(FD) — "X가 Y를 결정한다(X→Y)", 정규화 판단의 핵심 도구
  • 정규화 — 함수 종속성을 기준으로 릴레이션을 무손실 분해해 이상 현상을 없애는 과정
  • 정규형 단계 — 1NF → 2NF → 3NF → BCNF → 4NF → 5NF, 갈수록 제약조건이 엄격해짐

 

테이블을 설계하다 보면 "이 속성들을 굳이 나눠야 하나?" 싶을 때가 있습니다. 하지만 관련 없는 속성을 한 테이블에 몰아넣으면 데이터를 넣고 고치고 지울 때마다 예상치 못한 문제가 생깁니다. 이걸 이상 현상이라 부르고, 이 문제를 체계적으로 해결하는 과정이 정규화입니다. 이번 포스팅에서는 이상 현상의 종류부터 함수적 종속성, 그리고 정규형 1단계부터 5단계까지 전체 흐름을 정리했습니다.

 

 

 

01 정규화란? 이상 현상 3가지

데이터 중복이 만드는 삽입·갱신·삭제의 함정

 

📖 정규화(Normalization)란?
이상(anomaly) 현상을 제거하면서 데이터베이스를 올바르게 설계해나가는 과정입니다. 이상 현상은 불필요한 데이터 중복 때문에 릴레이션에 삽입·수정·삭제 연산을 수행할 때 발생하는 부작용을 말합니다.

 

아래 이벤트 참여 릴레이션을 기준으로 세 가지 이상 현상을 하나씩 살펴보겠습니다. 고객아이디와 등급이 여러 행에 걸쳐 중복 저장되어 있는 게 문제의 씨앗입니다.

 

고객아이디 이벤트번호 당첨여부 고객이름 등급
apple E001 Y 정소화 gold
apple E005 N 정소화 gold
apple E010 Y 정소화 gold
banana E002 N 김선우 vip
banana E005 Y 김선우 vip
carrot E003 Y 고명석 gold
carrot E007 Y 고명석 gold
orange E004 N 김용욱 silver

 

❌ ① 삽입 이상 (insertion anomaly)
새 데이터를 넣으려면 불필요한 데이터도 함께 넣어야 하는 문제입니다. 아직 어떤 이벤트에도 참여하지 않은 신규 고객 melon(성원용, gold)을 위 테이블에 넣으려면 이벤트번호·당첨여부에 실제로 존재하지 않는 임시값(NULL)을 억지로 채워야 합니다. → 삽입 자체가 불가능합니다.

 

❌ ② 갱신 이상 (update anomaly)
중복된 튜플 중 일부만 변경해서 데이터가 서로 어긋나는 문제입니다. apple의 등급을 gold → vip로 바꿔야 하는데 3개 행 중 한두 개만 수정하면, 같은 고객인데 등급이 gold와 vip로 서로 다르게 남는 모순이 생깁니다.

 

❌ ③ 삭제 이상 (deletion anomaly)
튜플을 지우면서 꼭 필요한 다른 데이터까지 함께 사라지는 문제입니다. orange 고객이 이벤트 참여를 취소해 그 행(위 표의 초록색 행)을 삭제하면, 이벤트와 무관한 고객아이디·고객이름·등급 정보까지 통째로 손실됩니다.

 

 

 

 

02 함수적 종속성(FD) — 정규화의 판단 기준

"X가 Y를 결정한다" X→Y

 

📖 함수적 종속성(Functional Dependency)이란?
릴레이션 내의 모든 튜플에서 하나의 X 값에 대한 Y 값이 항상 하나일 때, "X가 Y를 함수적으로 결정한다"고 하며 X → Y로 표현합니다. 이때 X를 결정자, Y를 종속자라 부르고, "Y가 X에 함수적으로 종속되어 있다"와 같은 의미입니다.

 

X (결정자) Y (종속자)

 

 

예) 학생 수강 성적 릴레이션으로 종속 관계를 직접 판단해보겠습니다.

 

학생번호 학생이름 주소 학과 학과사무실 강좌이름 강의실 성적
501 박지성 영국 맨체스터 컴퓨터과 공학관 101 데이터베이스 공학관 110 3.5
401 김연아 대한민국 서울 체육학과 체육관 101 데이터베이스 공학관 110 4.0
402 장미란 대한민국 강원도 체육학과 체육관 101 스포츠경영학 체육관 103 3.5
502 추신수 미국 클리블랜드 컴퓨터과 공학관 101 자료구조 공학관 111 4.0
501 박지성 영국 맨체스터 컴퓨터과 공학관 101 자료구조 공학관 111 3.5

 

이 릴레이션에서 성립하는 함수 종속 관계는 다음과 같습니다.

 

· 학생번호 → 학생이름
· 학생번호 → 주소
· 강좌이름 → 강의실
· 학과 → 학과사무실

※ 학생번호 501이 두 번 등장하지만 학생이름·주소는 항상 같습니다. 반면 성적은 학생번호만으로 결정되지 않으므로(같은 학생도 강좌별로 성적이 다름) 학생번호 → 성적은 성립하지 않습니다.

 

⚠️ 함수 종속 관계 판단 시 유의 사항
· 속성 값 자체가 아니라 속성의 특성과 의미를 기반으로 판단해야 합니다. 현재 릴레이션에 우연히 들어있는 값만 보고 판단하면 안 됩니다.
· 일반적으로 기본키와 후보키는 릴레이션의 다른 모든 속성을 함수적으로 결정합니다.
· 기본키·후보키가 아니어도 다른 속성 값을 유일하게 결정한다면 함수 종속 관계의 결정자가 될 수 있습니다.
· 결정자와 종속자가 같거나 결정자가 종속자를 포함하는 것처럼 당연한 관계는 고려하지 않습니다 (예 : 고객아이디 → 고객아이디).

 

 

 

03 완전 함수 종속 vs 부분 함수 종속

기본키가 여러 속성으로 묶여 있을 때 특히 중요한 구분

 

기본키가 두 개 이상의 속성으로 이루어진 복합키일 때는 종속 관계를 좀 더 세밀하게 봐야 합니다. 다시 이벤트 참여 릴레이션(기본키 = {고객아이디, 이벤트번호})으로 살펴보겠습니다.

 

· 고객아이디 → 고객이름
· {고객아이디, 이벤트번호} → 당첨여부
· {고객아이디, 이벤트번호} → 고객이름

 

✓ 완전 함수 종속 (FFD, Full Functional Dependency)
속성 집합 Y가 속성 집합 X에 함수적으로 종속되어 있지만, X의 일부분에는 종속되지 않는 경우입니다. 일반적으로 "함수 종속"이라고 하면 완전 함수 종속을 의미합니다.
당첨여부는 {고객아이디, 이벤트번호}에 완전 함수 종속됩니다. (고객아이디만으로는, 이벤트번호만으로는 당첨여부를 결정할 수 없음)

 

⚠️ 부분 함수 종속 (PFD, Partial Functional Dependency)
속성 집합 Y가 속성 집합 X의 전체가 아닌 일부분에도 함수적으로 종속되는 경우입니다.
고객이름은 {고객아이디, 이벤트번호}에 부분 함수 종속됩니다. 사실은 고객아이디 하나만으로도 고객이름이 결정되기 때문입니다. 바로 이 부분 함수 종속이 앞서 본 삽입·갱신·삭제 이상의 근본 원인이며, 다음 섹션에서 배울 정규화가 제거하려는 대상입니다.

 

 

 

04 정규화의 목표와 정규형 종류

무손실 분해 원칙과 7개의 정규형

 

📖 정규화(Normalization)
함수 종속성을 이용해 릴레이션을 연관성 있는 속성들로만 구성되도록 분해해서, 이상 현상이 발생하지 않는 올바른 릴레이션으로 만들어 가는 과정입니다. 기본 목표는 관련 없는 함수 종속성을 별개의 릴레이션으로 분리하는 것입니다.

 

⚠️ 무손실 분해(nonloss decomposition) — 반드시 지켜야 할 원칙
· 릴레이션은 의미상 동등한 릴레이션들로 분해되어야 하며, 분해로 정보 손실이 발생하면 안 됩니다.
· 분해된 릴레이션들을 자연 조인(natural join)하면 분해 전의 릴레이션으로 정확히 복원되어야 합니다.

 

📖 종속성 보존(Dependency Preservation) — 무손실 분해와 함께 지켜야 할 원칙
릴레이션을 분해한 뒤에도 원래 릴레이션에 존재하던 함수적 종속성(FD)들이 분해된 릴레이션들 내부에서 그대로 유지되어야 한다는 원칙입니다. 정규화는 이 두 원칙, 즉 무손실 조인 분해종속성 보존을 함께 만족시키는 것을 이상적인 목표로 합니다.

 

정규형(Normal Form)은 릴레이션이 정규화된 정도를 나타내며, 각 정규형마다 만족해야 하는 제약 조건이 존재합니다. 아래로 갈수록 더 엄격한 조건을 만족합니다.

 

비정규형 릴레이션
└ 제1정규형(1NF)
└ 제2정규형(2NF)
└ 제3정규형(3NF)
└ 보이스/코드 정규형(BCNF)
└ 제4정규형(4NF)
└ 제5정규형(5NF)

※ 안쪽으로 들어갈수록 더 엄격한 정규형을 만족하며, 바깥쪽 정규형의 조건을 모두 포함합니다. 릴레이션의 특성을 고려해서 적합한 정규형을 선택하면 되고, 실무에서는 3NF 또는 BCNF까지 정규화하는 경우가 많습니다.

 

 

 

 

05 제1·2·3 정규형 — 기본 정규형 3단계

원자값 → 완전 함수 종속 → 이행적 함수 종속 제거

 

정규형 만족 조건 위반 시 제거 대상
제1정규형
(1NF)
모든 속성이 더는 분해되지 않는 원자 값(atomic value)만 가짐. 이걸 만족해야 관계형 DB의 릴레이션이 될 자격이 있음 다중 값·복합 값 속성
제2정규형
(2NF)
1NF를 만족하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속 부분 함수 종속
제3정규형
(3NF)
2NF를 만족하고, 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속되지 않음 이행적 함수 종속

 

이행적 함수 종속(transitive FD)은 세 속성 집합 X, Y, Z에서 X→Y와 Y→Z가 성립하면 논리적으로 X→Z도 성립하는데, 이때 Z가 X에 '이행적으로' 종속된 상태를 말합니다.

 

X Y Z

예) 학생번호 → 학과, 학과 → 학과사무실이 성립하면 학생번호 → 학과사무실도 성립. 이때 학과사무실은 학생번호에 이행적으로 종속되어 있으므로, 3NF를 만족하려면 학과·학과사무실을 별도 릴레이션으로 분리해야 합니다.

 

 

 

06 BCNF · 제4·5정규형, 그리고 전체 흐름

후보키가 여러 개일 때 필요한 더 엄격한 정규형

 

📖 보이스/코드 정규형 (BCNF, Boyce/Codd Normal Form)
하나의 릴레이션에 후보키가 여러 개 존재하는 경우, 제3정규형까지 만족해도 이상 현상이 발생할 수 있습니다. 이를 해결하기 위한 강한 제3정규형(strong 3NF)이 BCNF입니다.
→ 릴레이션이 함수 종속 관계에서 모든 결정자가 후보키이면 BCNF에 속합니다.
→ BCNF에 속하는 모든 릴레이션은 3NF에 속하지만, 3NF에 속하는 모든 릴레이션이 BCNF에 속하는 것은 아닙니다.

 

💡 3NF와 BCNF의 차이가 발생하는 특수 상황
두 정규형의 차이는 릴레이션에 복수의 후보키가 존재하고, 그 후보키들이 여러 속성으로 구성된 복합키일 때 주로 발생합니다. 이때 기본키가 아닌 일반 속성이 복합 후보키의 일부분을 함수적으로 결정해버리는 상황이 생기면, 그 일반 속성은 후보키가 아니면서 결정자가 되어버립니다. 3NF는 이 상황을 걸러내지 못해 통과하지만, BCNF는 "모든 결정자는 후보키여야 한다"는 조건을 위배하므로 탈락합니다.

 

정규형 만족 조건
제4정규형
(4NF)
BCNF를 만족하면서, 함수 종속이 아닌 다치 종속(MVD; Multi Valued Dependency)을 제거
제5정규형
(5NF)
4NF를 만족하면서, 후보키를 통하지 않는 조인 종속(JD; Join Dependency)을 제거

 

지금까지의 내용을 한 흐름으로 이으면, 비정규형 릴레이션이 아래 순서로 다듬어지며 정규화가 진행됩니다.

 

비정규형 원자값
분해 →
1NF 부분종속
제거 →
2NF 이행종속
제거 →
3NF

3NF에서 후보키가 아닌 결정자를 제거하면 BCNF, 다치 종속을 제거하면 4NF, 조인 종속을 제거하면 5NF로 이어집니다.

 

💡 실무 팁 : 반정규화(De-normalization)
정규화가 무조건 정답은 아닙니다. 릴레이션이 너무 많이 분해되면 데이터를 조회할 때마다 여러 테이블을 다시 자연 조인해야 해서 CPU·메모리 부하가 커지고 응답 속도가 떨어질 수 있습니다. 그래서 실무에서는 성능 향상을 위해 중복을 어느 정도 감수하더라도 테이블을 다시 합치는 '반정규화'를 전략적으로 수행하기도 합니다. 정규화가 '정확성'을 위한 이론이라면, 반정규화는 '성능'을 위한 실무적 타협인 셈입니다.

 

 

 

 

📌 핵심 정리

· 이상 현상 3종류 : 삽입 이상(불필요한 데이터도 함께 삽입), 갱신 이상(일부만 수정돼 모순 발생), 삭제 이상(필요한 데이터까지 함께 삭제)
· 함수적 종속성(FD) : X→Y, 하나의 X 값에 대해 Y 값이 항상 하나 (X=결정자, Y=종속자)
· 완전 함수 종속 vs 부분 함수 종속 : 복합키 전체에 종속되면 완전, 일부에만 종속되면 부분 — 부분 종속이 이상 현상의 원인
· 정규화 : 무손실 분해(정보 손실 없이, 자연 조인으로 복원 가능)와 종속성 보존(분해 후에도 원래의 FD가 유지됨)을 함께 만족시키는 것이 이상적
· 정규형 단계 : 1NF(원자값) → 2NF(완전 함수 종속) → 3NF(이행적 함수 종속 제거) → BCNF(모든 결정자가 후보키) → 4NF(다치 종속 제거) → 5NF(조인 종속 제거)
· 3NF vs BCNF : 복합 후보키가 여러 개 있고 일반 속성이 그 일부를 결정할 때 3NF는 통과하지만 BCNF는 위배됨
· 반정규화 : 과도한 분해로 조인 비용이 커지면, 실무에서는 성능을 위해 의도적으로 중복을 허용하는 반정규화를 적용하기도 함

 

 

태그 : 정규화란 이상현상삽입 갱신 삭제 이상함수적 종속성 FD결정자 종속자완전함수종속 부분함수종속이행적 함수 종속제1정규형 제2정규형 제3정규형보이스코드 정규형 BCNF제4정규형 제5정규형무손실 분해종속성 보존3NF BCNF 차이반정규화 De-normalization

반응형
: