티스토리 뷰
반응형
2026.05.13 - [데이터베이스] - 데이터베이스 제1정규화
2026.05.13 - [데이터베이스] - 데이터베이스 제2정규화
2026.05.13 - [데이터베이스] - 데이터베이스 제3정규화
데이터베이스 정규화의 상위 단계이자, 실무에서 '엄격한' 데이터 무결성을 요구할 때 반드시 검토하는 보이스-코드 정규화(BCNF: Boyce-Codd Normal Form)에 대해 상세히 정리해 드립니다.
BCNF는 제3정규화(3NF)를 조금 더 강화한 버전으로, "강한 제3정규형"이라고도 불립니다.
1. BCNF의 정의와 성립 조건
정의
BCNF란 "제3정규형을 만족하면서, 모든 결정자(Determinant)가 후보키(Candidate Key)여야 한다"는 원칙입니다. 3NF에서는 허용되었던 '후보키가 아닌 결정자'로 인해 발생하는 이상 현상을 해결하기 위한 단계입니다.
- 성립 조건 1: 테이블이 제3정규형(3NF)을 만족해야 합니다.
- 성립 조건 2 (결정자 규칙): 테이블 내의 모든 함수적 종속 관계 $X \to Y$에 대하여, $X$는 반드시 해당 테이블의 후보키(Candidate Key)여야 합니다.
- 역사: 1974년 레이먼드 보이스(Raymond Boyce)와 에드거 F. 커드(E.F. Codd)에 의해 정의되었습니다. 3NF만으로는 복합키 내의 속성이 일반 속성에 의해 결정되는 특수한 경우를 처리할 수 없었기 때문입니다.
2. BCNF가 필요한 특수 상황
보통의 테이블은 3NF만으로도 충분하지만, 다음 3가지 조건이 동시에 충족될 때 BCNF 위반 가능성이 생깁니다.
- 기본키가 여러 컬럼으로 구성된 복합키이다.
- 후보키가 여러 개 존재한다.
- 후보키를 구성하는 속성 중 일부가 일반 속성(비후보키)에 의해 결정된다.
3. 실전 예제 분석: 학원 수강 관리 테이블
[Scenario]
- 한 학생은 여러 과목을 수강할 수 있다.
- 각 교수는 하나의 과목만 담당한다.
- 한 과목은 여러 교수가 가르칠 수 있다. (단, 학생-교수 조합은 유일함)
정규화 이전 (3NF는 만족하지만 BCNF 위반)
기본키는 (학생, 과목)입니다. (교수는 과목에 따라 결정되므로)
| 학생 (PK) | 과목 (PK) | 교수 |
| 김철수 | 알고리즘 | 이교수 |
| 이영희 | 알고리즘 | 최교수 |
| 김철수 | 데이터베이스 | 박교수 |
| 박지민 | 데이터베이스 | 박교수 |
- 함수 종속 관계 분석:
- (학생, 과목) $\to$ 교수 : (완전 함수 종속 - 2NF, 3NF OK)
- 교수 $\to$ 과목 : (문제 발생) 교수가 과목을 결정하지만, '교수'는 이 테이블의 후보키가 아닙니다.
BCNF 위반으로 인한 이상 현상
- 삽입 이상: 새로운 교수(정교수)가 '운영체제'를 맡기로 했으나, 아직 수강생(학생)이 없으면 정보를 입력할 수 없음.
- 삭제 이상: '이영희' 학생이 '알고리즘' 수강을 취소하면, '최교수'가 '알고리즘' 담당이라는 정보가 사라짐.
- 갱신 이상: '박교수'가 담당 과목을 변경하면, 박교수 수업을 듣는 모든 학생의 행을 수정해야 함.
[Step 2] BCNF 적용 (테이블 분리)
결정자인 '교수'를 기준으로 테이블을 쪼갭니다.
1. 교수-과목 테이블
| 교수 (PK) | 과목 |
| 이교수 | 알고리즘 |
| 최교수 | 알고리즘 |
| 박교수 | 데이터베이스 |
2. 학생-교수 테이블
| 학생 (PK) | 교수 (PK) |
| 김철수 | 이교수 |
| 이영희 | 최교수 |
| 김철수 | 박교수 |
| 박지민 | 박교수 |
반응형
4. SQL 구현 예제
SQL
-- 1. 교수별 담당 과목 테이블
CREATE TABLE ProfessorSubjects (
ProfessorName VARCHAR(50) PRIMARY KEY,
SubjectName VARCHAR(50) NOT NULL
);
-- 2. 학생별 담당 교수 테이블 (BCNF 준수)
CREATE TABLE StudentProfessors (
StudentName VARCHAR(50),
ProfessorName VARCHAR(50),
PRIMARY KEY (StudentName, ProfessorName),
FOREIGN KEY (ProfessorName) REFERENCES ProfessorSubjects(ProfessorName)
);
5. 3NF vs BCNF 요약 비교
| 구분 | 제3정규형 (3NF) | BCNF (강한 3NF) |
| 핵심 타겟 | 이행적 종속성 제거 | 후보키가 아닌 결정자 제거 |
| 종속성 기준 | 일반 속성 $\to$ 일반 속성 (금지) | 비후보키 $\to$ 후보키 속성 (금지) |
| 강도 | 상대적으로 약함 | 상대적으로 강하고 엄격함 |
| 분리 기준 | $A \to B \to C$ 관계 끊기 | $X \to Y$에서 X가 후보키가 아니면 끊기 |
#데이터베이스 #BCNF #보이스코드정규화 #정규화 #Normalization #DB설계 #데이터모델링 #SQL #RDBMS #데이터무결성 #후보키 #결정자 #백엔드개발 #기술면접 #정보처리기사 #DB기초 #데이터베이스이론 #고급DB설계
'데이터베이스' 카테고리의 다른 글
| DB 파티셔닝(Partitioning)과 샤딩(Sharding) 원리 및 알고리즘 (0) | 2026.06.07 |
|---|---|
| DB 인덱스(Index) 원리부터 B-Tree 구조, 복합 인덱스 설정 기준 완벽 정리 (0) | 2026.06.05 |
| JPA N+1 문제 원인 및 해결 방법: Fetch Join과 Batch Size 완벽 정리 (0) | 2026.06.04 |
| SQL JOIN 종류 및 예제 (0) | 2026.05.24 |
| 데이터베이스 제3정규화 (0) | 2026.05.17 |
| 데이터베이스 제2정규화 (0) | 2026.05.17 |
| 데이터베이스 제1정규화 (0) | 2026.05.17 |
| 가장 많이 사용된 데이터베이스(DBMS) TOP10 - 2026 최신버전 (0) | 2026.05.07 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- C++
- DB연동
- 클래스
- 자바
- 문자열
- OpenCV
- 아두이노
- 벡터
- C++ 클래스
- Java
- 리스트
- String
- 자료구조
- 배열
- 블루투스
- C
- C언어
- Class
- 데이터베이스
- 정보처리기사
- Android
- 안드로이드
- html
- 파일처리
- MySQL
- 상속
- 알고리즘
- 파이썬
- c#
- 문제풀이
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함
반응형