<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://dbstudy.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=%EB%8D%B0%EC%9D%B4%ED%84%B0_%EB%AA%A8%EB%8D%B8%EB%A7%81_%EC%A0%95%EA%B7%9C%ED%99%94_%EC%8B%AC%ED%99%94</id>
	<title>데이터 모델링 정규화 심화 - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://dbstudy.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=%EB%8D%B0%EC%9D%B4%ED%84%B0_%EB%AA%A8%EB%8D%B8%EB%A7%81_%EC%A0%95%EA%B7%9C%ED%99%94_%EC%8B%AC%ED%99%94"/>
	<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EB%8D%B0%EC%9D%B4%ED%84%B0_%EB%AA%A8%EB%8D%B8%EB%A7%81_%EC%A0%95%EA%B7%9C%ED%99%94_%EC%8B%AC%ED%99%94&amp;action=history"/>
	<updated>2026-11-04T06:37:12Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EB%8D%B0%EC%9D%B4%ED%84%B0_%EB%AA%A8%EB%8D%B8%EB%A7%81_%EC%A0%95%EA%B7%9C%ED%99%94_%EC%8B%AC%ED%99%94&amp;diff=1971&amp;oldid=prev</id>
		<title>Dbstudy: 새 문서: &lt;div style=&quot;background:linear-gradient(135deg,#7a3e0c 0%,#c0620f 55%,#e67e22 100%);color:#ffffff;padding:30px 36px;border-radius:14px;margin-bottom:24px;box-shadow:0 4px 14px rgba(122,62,12,0.25);&quot;&gt; &lt;div style=&quot;font-size:12px;letter-spacing:3px;opacity:0.8;margin-bottom:6px;&quot;&gt;DATA MODELING · STEP 3 DEEP DIVE&lt;/div&gt; &lt;div style=&quot;font-size:28px;font-weight:700;line-height:1.3;&quot;&gt;정규화 심화&lt;/div&gt; &lt;div style=&quot;font-size:15px;opacity:0.92;margin-top:10px;line-height:1.7;&quot;&gt;함수...</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EB%8D%B0%EC%9D%B4%ED%84%B0_%EB%AA%A8%EB%8D%B8%EB%A7%81_%EC%A0%95%EA%B7%9C%ED%99%94_%EC%8B%AC%ED%99%94&amp;diff=1971&amp;oldid=prev"/>
		<updated>2026-11-04T03:35:38Z</updated>

		<summary type="html">&lt;p&gt;새 문서: &amp;lt;div style=&amp;quot;background:linear-gradient(135deg,#7a3e0c 0%,#c0620f 55%,#e67e22 100%);color:#ffffff;padding:30px 36px;border-radius:14px;margin-bottom:24px;box-shadow:0 4px 14px rgba(122,62,12,0.25);&amp;quot;&amp;gt; &amp;lt;div style=&amp;quot;font-size:12px;letter-spacing:3px;opacity:0.8;margin-bottom:6px;&amp;quot;&amp;gt;DATA MODELING · STEP 3 DEEP DIVE&amp;lt;/div&amp;gt; &amp;lt;div style=&amp;quot;font-size:28px;font-weight:700;line-height:1.3;&amp;quot;&amp;gt;정규화 심화&amp;lt;/div&amp;gt; &amp;lt;div style=&amp;quot;font-size:15px;opacity:0.92;margin-top:10px;line-height:1.7;&amp;quot;&amp;gt;함수...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;div style=&amp;quot;background:linear-gradient(135deg,#7a3e0c 0%,#c0620f 55%,#e67e22 100%);color:#ffffff;padding:30px 36px;border-radius:14px;margin-bottom:24px;box-shadow:0 4px 14px rgba(122,62,12,0.25);&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:12px;letter-spacing:3px;opacity:0.8;margin-bottom:6px;&amp;quot;&amp;gt;DATA MODELING · STEP 3 DEEP DIVE&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:28px;font-weight:700;line-height:1.3;&amp;quot;&amp;gt;정규화 심화&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:15px;opacity:0.92;margin-top:10px;line-height:1.7;&amp;quot;&amp;gt;함수 종속성 이론부터 BCNF · 4NF · 5NF, 그리고 실무에서의 판단 기준까지&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-top:16px;display:flex;flex-wrap:wrap;gap:8px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;background:rgba(255,255,255,0.18);border:1px solid rgba(255,255,255,0.35);padding:4px 12px;border-radius:20px;font-size:12px;&amp;quot;&amp;gt;선수 학습 · [[데이터 모델링 입문]] 5장&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;background:rgba(255,255,255,0.18);border:1px solid rgba(255,255,255,0.35);padding:4px 12px;border-radius:20px;font-size:12px;&amp;quot;&amp;gt;커리큘럼 · 7~8주차&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;background:rgba(255,255,255,0.18);border:1px solid rgba(255,255,255,0.35);padding:4px 12px;border-radius:20px;font-size:12px;&amp;quot;&amp;gt;난이도 · 중급&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== 1. 정규화를 다시 보다 ==&lt;br /&gt;
정규화는 &amp;quot;테이블을 쪼개는 기술&amp;quot;이 아니라 &amp;#039;&amp;#039;&amp;#039;하나의 사실(Fact)을 한 곳에만 저장하도록 만드는 원칙&amp;#039;&amp;#039;&amp;#039;이다. 쪼개는 것은 결과일 뿐이며, 기준은 언제나 &amp;#039;&amp;#039;&amp;#039;함수 종속성&amp;#039;&amp;#039;&amp;#039;이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:5px solid #e67e22;background:#fff6ec;padding:14px 20px;margin:16px 0;border-radius:0 8px 8px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;핵심 문장&amp;#039;&amp;#039;&amp;#039; — &amp;quot;모든 비키 속성은 &amp;#039;&amp;#039;&amp;#039;키&amp;#039;&amp;#039;&amp;#039;에, &amp;#039;&amp;#039;&amp;#039;키 전체&amp;#039;&amp;#039;&amp;#039;에, 그리고 &amp;#039;&amp;#039;&amp;#039;키 외에는 아무것에도&amp;#039;&amp;#039;&amp;#039; 종속되지 않아야 한다.&amp;quot;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size:13px;color:#6b5a4a;&amp;quot;&amp;gt;(The key, the whole key, and nothing but the key) — 각각 1NF · 2NF · 3NF에 대응&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. 함수 종속성 이론 ==&lt;br /&gt;
=== 2.1 기본 용어 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#7a3e0c;color:#fff;&amp;quot;&lt;br /&gt;
! 용어 !! 표기 !! 설명&lt;br /&gt;
|-&lt;br /&gt;
| 함수 종속 || X → Y || X 값이 같으면 Y 값도 반드시 같다&lt;br /&gt;
|-&lt;br /&gt;
| 완전 함수 종속 || X ⇒ Y || Y가 X 전체에 종속, X의 진부분집합에는 종속되지 않음&lt;br /&gt;
|-&lt;br /&gt;
| 부분 함수 종속 || (A,B) → C, A → C || 복합키의 일부만으로 C가 결정됨&lt;br /&gt;
|-&lt;br /&gt;
| 이행 함수 종속 || A → B, B → C ⟹ A → C || 키가 아닌 속성을 거쳐 간접 결정&lt;br /&gt;
|-&lt;br /&gt;
| 다치 종속 (MVD) || X ↠ Y || X 값 하나에 Y 값의 &amp;#039;&amp;#039;&amp;#039;집합&amp;#039;&amp;#039;&amp;#039;이 독립적으로 대응&lt;br /&gt;
|-&lt;br /&gt;
| 조인 종속 (JD) || *(R1, R2, …, Rn) || 분해한 릴레이션들을 조인하면 원래 릴레이션이 복원됨&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.2 암스트롱 공리 (Armstrong&amp;#039;s Axioms) ===&lt;br /&gt;
함수 종속으로부터 새로운 종속을 추론하는 규칙. 후보키 도출과 정규형 판정의 근거가 된다.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#fbeee0;&amp;quot;&lt;br /&gt;
! 구분 !! 규칙 !! 내용&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | 기본 규칙&lt;br /&gt;
| 반사 (Reflexivity) || Y ⊆ X 이면 X → Y&lt;br /&gt;
|-&lt;br /&gt;
| 첨가 (Augmentation) || X → Y 이면 XZ → YZ&lt;br /&gt;
|-&lt;br /&gt;
| 이행 (Transitivity) || X → Y, Y → Z 이면 X → Z&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | 유도 규칙&lt;br /&gt;
| 합집합 (Union) || X → Y, X → Z 이면 X → YZ&lt;br /&gt;
|-&lt;br /&gt;
| 분해 (Decomposition) || X → YZ 이면 X → Y, X → Z&lt;br /&gt;
|-&lt;br /&gt;
| 의사이행 (Pseudo-transitivity) || X → Y, WY → Z 이면 WX → Z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.3 속성 폐포(Closure)로 후보키 찾기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
릴레이션 R(A, B, C, D, E)&lt;br /&gt;
FD = { A → B,  B → C,  CD → E }&lt;br /&gt;
&lt;br /&gt;
{A}+   = {A, B, C}            → 후보키 아님&lt;br /&gt;
{A,D}+ = {A, D, B, C, E}      → 모든 속성 포함 ⇒ 후보키&lt;br /&gt;
{B,D}+ = {B, D, C, E}         → A 미포함&lt;br /&gt;
&lt;br /&gt;
∴ 후보키 = {A, D}&lt;br /&gt;
   - 2NF 위반: A → B (키의 일부에 종속)&lt;br /&gt;
   - 3NF 위반: B → C (비키 → 비키)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #f0d9b5;background:#fffaf0;padding:12px 18px;border-radius:8px;margin:14px 0;&amp;quot;&amp;gt;&lt;br /&gt;
💡 &amp;#039;&amp;#039;&amp;#039;요령&amp;#039;&amp;#039;&amp;#039; — FD의 &amp;#039;&amp;#039;&amp;#039;오른쪽에 한 번도 나오지 않는 속성&amp;#039;&amp;#039;&amp;#039;은 반드시 후보키에 포함된다. 위 예에서 A와 D가 그렇다.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. 정규형 상세 ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:flex;flex-wrap:wrap;gap:8px;margin:14px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex:1 1 120px;background:#2b7bb9;color:#fff;border-radius:8px;padding:10px;text-align:center;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;1NF&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&amp;lt;span style=&amp;quot;font-size:12px;&amp;quot;&amp;gt;원자값&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex:1 1 120px;background:#16a085;color:#fff;border-radius:8px;padding:10px;text-align:center;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;2NF&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&amp;lt;span style=&amp;quot;font-size:12px;&amp;quot;&amp;gt;부분 종속 ✕&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex:1 1 120px;background:#e67e22;color:#fff;border-radius:8px;padding:10px;text-align:center;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;3NF&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&amp;lt;span style=&amp;quot;font-size:12px;&amp;quot;&amp;gt;이행 종속 ✕&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex:1 1 120px;background:#8e44ad;color:#fff;border-radius:8px;padding:10px;text-align:center;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;BCNF&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&amp;lt;span style=&amp;quot;font-size:12px;&amp;quot;&amp;gt;결정자 = 후보키&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex:1 1 120px;background:#5d6d7e;color:#fff;border-radius:8px;padding:10px;text-align:center;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;4NF&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&amp;lt;span style=&amp;quot;font-size:12px;&amp;quot;&amp;gt;다치 종속 ✕&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex:1 1 120px;background:#34495e;color:#fff;border-radius:8px;padding:10px;text-align:center;&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;5NF&amp;#039;&amp;#039;&amp;#039;&amp;lt;br/&amp;gt;&amp;lt;span style=&amp;quot;font-size:12px;&amp;quot;&amp;gt;조인 종속 ✕&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.1 제1정규형 (1NF) — 흔한 위반 패턴 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#fbeee0;&amp;quot;&lt;br /&gt;
! 위반 패턴 !! 예 !! 해결&lt;br /&gt;
|-&lt;br /&gt;
| 다중값 컬럼 || &amp;lt;code&amp;gt;전화번호 = &amp;#039;010-1111, 02-2222&amp;#039;&amp;lt;/code&amp;gt; || 고객연락처 엔터티로 분리&lt;br /&gt;
|-&lt;br /&gt;
| 반복 컬럼 || &amp;lt;code&amp;gt;전화1, 전화2, 전화3&amp;lt;/code&amp;gt; || 행으로 전환 (연락처유형코드 + 번호)&lt;br /&gt;
|-&lt;br /&gt;
| 복합 의미 컬럼 || &amp;lt;code&amp;gt;주소 = &amp;#039;서울시 강남구 …&amp;#039;&amp;lt;/code&amp;gt;를 시·구 단위로 조회 || 업무상 조회 단위라면 분리&lt;br /&gt;
|-&lt;br /&gt;
| JSON/CSV 저장 || &amp;lt;code&amp;gt;태그 = &amp;#039;DB,ORACLE,RAC&amp;#039;&amp;lt;/code&amp;gt; || 태그 매핑 엔터티 (M:N 해소)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3.2 제2정규형 (2NF) ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;조건&amp;#039;&amp;#039;&amp;#039; 1NF이며 모든 비키 속성이 기본키에 &amp;#039;&amp;#039;&amp;#039;완전 함수 종속&amp;#039;&amp;#039;&amp;#039;.&amp;lt;br/&amp;gt;&lt;br /&gt;
단일 컬럼 PK인 테이블은 1NF만 만족하면 자동으로 2NF이다. 2NF 문제는 &amp;#039;&amp;#039;&amp;#039;복합키&amp;#039;&amp;#039;&amp;#039;에서만 발생한다.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;font-size:13px;&amp;quot;&lt;br /&gt;
|+ 수강 (위반)&lt;br /&gt;
|- style=&amp;quot;background:#fdecea;&amp;quot;&lt;br /&gt;
! &amp;lt;u&amp;gt;학번&amp;lt;/u&amp;gt; !! &amp;lt;u&amp;gt;과목코드&amp;lt;/u&amp;gt; !! 성적 !! 과목명 !! 학점수&lt;br /&gt;
|-&lt;br /&gt;
| S01 || DB101 || A || 데이터베이스 || 3&lt;br /&gt;
|}&lt;br /&gt;
→ &amp;lt;code&amp;gt;과목코드 → 과목명, 학점수&amp;lt;/code&amp;gt; (부분 종속) ⟹ &amp;#039;&amp;#039;&amp;#039;수강(학번, 과목코드, 성적)&amp;#039;&amp;#039;&amp;#039; + &amp;#039;&amp;#039;&amp;#039;과목(과목코드, 과목명, 학점수)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== 3.3 제3정규형 (3NF) ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;조건&amp;#039;&amp;#039;&amp;#039; 2NF이며 비키 속성 간 &amp;#039;&amp;#039;&amp;#039;이행 종속&amp;#039;&amp;#039;&amp;#039;이 없음.&amp;lt;br/&amp;gt;&lt;br /&gt;
형식적 정의: 모든 비자명 FD X → A 에 대해 &amp;#039;&amp;#039;&amp;#039;X가 슈퍼키&amp;#039;&amp;#039;&amp;#039;이거나 &amp;#039;&amp;#039;&amp;#039;A가 주요 속성(후보키의 일부)&amp;#039;&amp;#039;&amp;#039;이다.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;font-size:13px;&amp;quot;&lt;br /&gt;
|+ 사원 (위반)&lt;br /&gt;
|- style=&amp;quot;background:#fdecea;&amp;quot;&lt;br /&gt;
! &amp;lt;u&amp;gt;사원번호&amp;lt;/u&amp;gt; !! 사원명 !! 부서코드 !! 부서명 !! 부서위치&lt;br /&gt;
|-&lt;br /&gt;
| E01 || 홍길동 || D10 || 개발팀 || 판교&lt;br /&gt;
|}&lt;br /&gt;
→ &amp;lt;code&amp;gt;사원번호 → 부서코드 → 부서명, 부서위치&amp;lt;/code&amp;gt; ⟹ &amp;#039;&amp;#039;&amp;#039;사원&amp;#039;&amp;#039;&amp;#039; + &amp;#039;&amp;#039;&amp;#039;부서&amp;#039;&amp;#039;&amp;#039; 분리&lt;br /&gt;
&lt;br /&gt;
=== 3.4 BCNF (Boyce-Codd Normal Form) ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;조건&amp;#039;&amp;#039;&amp;#039; 모든 결정자가 &amp;#039;&amp;#039;&amp;#039;후보키&amp;#039;&amp;#039;&amp;#039;이다. 3NF에서 &amp;quot;A가 주요 속성이면 허용&amp;quot;하던 예외를 없앤 강화된 형태.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;대표 예제 — 특강 신청&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 업무 규칙: 학생은 과목별로 한 교수에게만 수강한다. &amp;#039;&amp;#039;&amp;#039;교수는 한 과목만 담당&amp;#039;&amp;#039;&amp;#039;한다.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;font-size:13px;&amp;quot;&lt;br /&gt;
|+ 특강신청 — PK(학번, 과목)&lt;br /&gt;
|- style=&amp;quot;background:#fdecea;&amp;quot;&lt;br /&gt;
! &amp;lt;u&amp;gt;학번&amp;lt;/u&amp;gt; !! &amp;lt;u&amp;gt;과목&amp;lt;/u&amp;gt; !! 교수&lt;br /&gt;
|-&lt;br /&gt;
| S01 || 데이터베이스 || 김교수&lt;br /&gt;
|-&lt;br /&gt;
| S02 || 데이터베이스 || 이교수&lt;br /&gt;
|-&lt;br /&gt;
| S01 || 운영체제 || 박교수&lt;br /&gt;
|}&lt;br /&gt;
* FD: (학번, 과목) → 교수, &amp;#039;&amp;#039;&amp;#039;교수 → 과목&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 교수는 결정자인데 후보키가 아님 → &amp;#039;&amp;#039;&amp;#039;BCNF 위반&amp;#039;&amp;#039;&amp;#039; (3NF는 만족: 과목이 주요 속성이므로)&lt;br /&gt;
* 이상현상: 김교수가 담당 과목을 바꾸면 여러 행 수정 필요, 신청자가 없는 교수의 담당 과목 기록 불가&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;분해 결과&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:flex;flex-wrap:wrap;gap:12px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex:1 1 200px;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;font-size:13px;&amp;quot;&lt;br /&gt;
|+ 수강교수&lt;br /&gt;
|- style=&amp;quot;background:#f5eefa;&amp;quot;&lt;br /&gt;
! &amp;lt;u&amp;gt;학번&amp;lt;/u&amp;gt; !! &amp;lt;u&amp;gt;교수&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| S01 || 김교수&lt;br /&gt;
|-&lt;br /&gt;
| S02 || 이교수&lt;br /&gt;
|-&lt;br /&gt;
| S01 || 박교수&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;flex:1 1 200px;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;font-size:13px;&amp;quot;&lt;br /&gt;
|+ 교수과목&lt;br /&gt;
|- style=&amp;quot;background:#f5eefa;&amp;quot;&lt;br /&gt;
! &amp;lt;u&amp;gt;교수&amp;lt;/u&amp;gt; !! 과목&lt;br /&gt;
|-&lt;br /&gt;
| 김교수 || 데이터베이스&lt;br /&gt;
|-&lt;br /&gt;
| 이교수 || 데이터베이스&lt;br /&gt;
|-&lt;br /&gt;
| 박교수 || 운영체제&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:5px solid #c0392b;background:#fdf1ef;padding:12px 18px;margin:14px 0;border-radius:0 8px 8px 0;&amp;quot;&amp;gt;&lt;br /&gt;
⚠ &amp;#039;&amp;#039;&amp;#039;BCNF 분해의 대가&amp;#039;&amp;#039;&amp;#039; — 위 분해에서는 &amp;quot;학생은 과목별로 한 교수에게만 수강&amp;quot;이라는 FD (학번, 과목) → 교수가 &amp;#039;&amp;#039;&amp;#039;어느 한 테이블에서도 키로 보장되지 않는다&amp;#039;&amp;#039;&amp;#039;. 즉 BCNF 분해는 &amp;#039;&amp;#039;&amp;#039;종속성 보존&amp;#039;&amp;#039;&amp;#039;을 잃을 수 있다. 실무에서는 3NF에서 멈추고 제약조건(트리거·애플리케이션)으로 보완하는 선택도 흔하다.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.5 제4정규형 (4NF) — 다치 종속 ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;조건&amp;#039;&amp;#039;&amp;#039; BCNF이며 자명하지 않은 다치 종속 X ↠ Y가 있다면 X는 슈퍼키이다.&amp;lt;br/&amp;gt;&lt;br /&gt;
서로 &amp;#039;&amp;#039;&amp;#039;독립적인 다중값 사실 두 개&amp;#039;&amp;#039;&amp;#039;를 한 테이블에 넣으면 발생한다.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;font-size:13px;&amp;quot;&lt;br /&gt;
|+ 사원역량 (위반) — 보유기술과 사용언어는 서로 무관&lt;br /&gt;
|- style=&amp;quot;background:#fdecea;&amp;quot;&lt;br /&gt;
! &amp;lt;u&amp;gt;사원&amp;lt;/u&amp;gt; !! &amp;lt;u&amp;gt;기술&amp;lt;/u&amp;gt; !! &amp;lt;u&amp;gt;언어&amp;lt;/u&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 홍길동 || Oracle || 한국어&lt;br /&gt;
|-&lt;br /&gt;
| 홍길동 || Oracle || 영어&lt;br /&gt;
|-&lt;br /&gt;
| 홍길동 || Python || 한국어&lt;br /&gt;
|-&lt;br /&gt;
| 홍길동 || Python || 영어&lt;br /&gt;
|}&lt;br /&gt;
→ 사원 ↠ 기술, 사원 ↠ 언어. 기술 하나 추가 시 언어 수만큼 행 추가 ⟹ &amp;#039;&amp;#039;&amp;#039;사원기술(사원, 기술)&amp;#039;&amp;#039;&amp;#039; + &amp;#039;&amp;#039;&amp;#039;사원언어(사원, 언어)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== 3.6 제5정규형 (5NF / PJNF) — 조인 종속 ===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;조건&amp;#039;&amp;#039;&amp;#039; 모든 조인 종속이 후보키에 의해서만 함축된다.&amp;lt;br/&amp;gt;&lt;br /&gt;
3개 이상의 엔터티가 &amp;#039;&amp;#039;&amp;#039;순환적 업무 규칙&amp;#039;&amp;#039;&amp;#039;으로 묶일 때 문제가 된다.&lt;br /&gt;
&lt;br /&gt;
* 예: &amp;quot;공급업체 S가 부품 P를 공급하고, 프로젝트 J가 부품 P를 사용하며, S가 J에 납품한다면 → S는 J에 P를 공급한다&amp;quot; 라는 규칙이 성립하는 경우&lt;br /&gt;
* 이 경우 (S, P, J) 3원 테이블은 &amp;#039;&amp;#039;&amp;#039;(S,P), (P,J), (S,J)&amp;#039;&amp;#039;&amp;#039; 세 개로 분해 후 조인해도 정확히 복원된다 → 분해 대상&lt;br /&gt;
* 규칙이 성립하지 않으면 3원 관계 자체가 의미 있는 사실이므로 분해하면 &amp;#039;&amp;#039;&amp;#039;거짓 튜플(Spurious Tuple)&amp;#039;&amp;#039;&amp;#039;이 생긴다&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #f0d9b5;background:#fffaf0;padding:12px 18px;border-radius:8px;margin:14px 0;&amp;quot;&amp;gt;&lt;br /&gt;
💡 &amp;#039;&amp;#039;&amp;#039;실무 감각&amp;#039;&amp;#039;&amp;#039; — 현업 모델에서 4NF·5NF 위반은 대부분 &amp;quot;M:N 관계 두 개를 하나의 교차 엔터티에 몰아넣은 경우&amp;quot;다. 교차 엔터티를 만들 때 &amp;#039;&amp;#039;&amp;#039;&amp;quot;이 세 속성은 동시에 하나의 사실인가?&amp;quot;&amp;#039;&amp;#039;&amp;#039;를 질문하면 대부분 예방된다.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. 분해의 두 가지 원칙 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background:#7a3e0c;color:#fff;&amp;quot;&lt;br /&gt;
! 원칙 !! 의미 !! 위반 시&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;무손실 조인&amp;#039;&amp;#039;&amp;#039; (Lossless Join) || 분해된 테이블을 조인하면 원래 데이터가 정확히 복원된다. 공통 속성이 한쪽의 키여야 한다 || 거짓 튜플 발생 — &amp;#039;&amp;#039;&amp;#039;절대 위반 불가&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;종속성 보존&amp;#039;&amp;#039;&amp;#039; (Dependency Preservation) || 원래의 모든 FD가 분해된 어느 테이블 안에서 검사 가능하다 || 업무 규칙을 조인·트리거로 검증해야 함&lt;br /&gt;
|}&lt;br /&gt;
* 3NF까지는 두 원칙을 &amp;#039;&amp;#039;&amp;#039;항상 동시에&amp;#039;&amp;#039;&amp;#039; 만족하는 분해가 존재한다.&lt;br /&gt;
* BCNF는 무손실은 보장되지만 종속성 보존은 보장되지 않는다.&lt;br /&gt;
&lt;br /&gt;
== 5. 실무에서 정규화 판단하기 ==&lt;br /&gt;
=== 5.1 정규화가 성능을 높이는 경우 ===&lt;br /&gt;
* 갱신 대상 행 수 감소 → &amp;#039;&amp;#039;&amp;#039;Redo/Undo 감소&amp;#039;&amp;#039;&amp;#039;, 락 범위 축소&lt;br /&gt;
* 테이블 폭이 줄어 블록당 행 수 증가 → &amp;#039;&amp;#039;&amp;#039;Buffer Cache 효율&amp;#039;&amp;#039;&amp;#039; 향상, Full Scan 비용 감소&lt;br /&gt;
* 중복 컬럼 동기화 트리거·배치 제거&lt;br /&gt;
&lt;br /&gt;
=== 5.2 정규화가 성능을 떨어뜨리는 경우 ===&lt;br /&gt;
* 조회 시 다단계 조인이 필수인 대량 범위 조회 (통계·리포트)&lt;br /&gt;
* 조인 키 분포가 나빠 NL 조인 랜덤 I/O가 폭증하는 경우&lt;br /&gt;
&lt;br /&gt;
=== 5.3 판단 순서 ===&lt;br /&gt;
# 먼저 &amp;#039;&amp;#039;&amp;#039;3NF까지 정규화&amp;#039;&amp;#039;&amp;#039;한 논리 모델을 만든다. (반정규화는 정규화된 모델에서만 의미가 있다)&lt;br /&gt;
# 핵심 SQL과 처리량(TPS, 일 건수, 조회 범위)을 정의한다.&lt;br /&gt;
# 인덱스·파티션·Materialized View·클러스터로 해결 가능한지 검토한다.&lt;br /&gt;
# 그래도 부족하면 반정규화하고 &amp;#039;&amp;#039;&amp;#039;정합성 유지 방안을 문서화&amp;#039;&amp;#039;&amp;#039;한다.&lt;br /&gt;
&lt;br /&gt;
== 6. 연습 문제 ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #f0d9b5;border-radius:10px;padding:12px 18px;margin-bottom:12px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;문제 1.&amp;#039;&amp;#039;&amp;#039; R(학번, 이름, 학과코드, 학과명, 과목코드, 성적), FD = {학번 → 이름, 학과코드 / 학과코드 → 학과명 / (학번, 과목코드) → 성적}. 3NF로 분해하라.&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot; style=&amp;quot;margin-top:8px;color:#5a4a3a;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;해설&amp;#039;&amp;#039;&amp;#039; 후보키 (학번, 과목코드).&lt;br /&gt;
* 부분 종속 제거 → 학생(&amp;lt;u&amp;gt;학번&amp;lt;/u&amp;gt;, 이름, 학과코드), 성적(&amp;lt;u&amp;gt;학번&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;과목코드&amp;lt;/u&amp;gt;, 성적)&lt;br /&gt;
* 이행 종속 제거 → 학생(&amp;lt;u&amp;gt;학번&amp;lt;/u&amp;gt;, 이름, 학과코드), 학과(&amp;lt;u&amp;gt;학과코드&amp;lt;/u&amp;gt;, 학과명)&lt;br /&gt;
* 최종: &amp;#039;&amp;#039;&amp;#039;학생, 학과, 성적&amp;#039;&amp;#039;&amp;#039; 3개&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #f0d9b5;border-radius:10px;padding:12px 18px;margin-bottom:12px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;문제 2.&amp;#039;&amp;#039;&amp;#039; R(A, B, C), FD = {AB → C, C → B}. 이 릴레이션은 3NF인가? BCNF인가?&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot; style=&amp;quot;margin-top:8px;color:#5a4a3a;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;해설&amp;#039;&amp;#039;&amp;#039; 후보키 {A,B}, {A,C}. B, C 모두 주요 속성.&lt;br /&gt;
* C → B: C는 슈퍼키가 아니지만 B가 주요 속성 → &amp;#039;&amp;#039;&amp;#039;3NF 만족&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* 결정자 C가 후보키가 아님 → &amp;#039;&amp;#039;&amp;#039;BCNF 위반&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #f0d9b5;border-radius:10px;padding:12px 18px;margin-bottom:12px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;문제 3.&amp;#039;&amp;#039;&amp;#039; 상품(상품코드, 색상, 사이즈)에서 색상과 사이즈는 상품별로 독립적으로 제공된다. 어떤 정규형 위반이며 어떻게 분해하는가?&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot; style=&amp;quot;margin-top:8px;color:#5a4a3a;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;해설&amp;#039;&amp;#039;&amp;#039; 상품 ↠ 색상, 상품 ↠ 사이즈 → &amp;#039;&amp;#039;&amp;#039;4NF 위반&amp;#039;&amp;#039;&amp;#039;. 상품색상(&amp;lt;u&amp;gt;상품코드&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;색상&amp;lt;/u&amp;gt;), 상품사이즈(&amp;lt;u&amp;gt;상품코드&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;사이즈&amp;lt;/u&amp;gt;)로 분해. 단, 실제 재고가 색상×사이즈 조합(SKU) 단위로 관리된다면 3원 관계 자체가 사실이므로 분해하지 않는다.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-top:30px;padding:14px 20px;border-top:3px solid #7a3e0c;background:#fdf7f1;border-radius:0 0 10px 10px;font-size:13px;color:#5a4a3a;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;이전&amp;#039;&amp;#039;&amp;#039; ← [[데이터 모델링 입문]] &amp;amp;nbsp;|&amp;amp;nbsp; &amp;#039;&amp;#039;&amp;#039;다음&amp;#039;&amp;#039;&amp;#039; → [[ERD 작성 실습]] · [[Oracle 물리 설계]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[분류:데이터 모델링]]&lt;br /&gt;
[[분류:데이터 모델링 정규화]]&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
</feed>