함수 종속성으로 중복과 이상 현상을 찾고, 1NF(원자값) → 2NF(부분 종속 제거) → 3NF(이행 종속 제거) → BCNF 순서로 테이블을 나눕니다.
출제기출 11회분 중 16문항 · 많이 나온 주제: 정규화(15), 반정규화(3)
학습 목표
함수 종속성으로 중복과 이상 현상을 찾고, 1NF(원자값) → 2NF(부분 종속 제거) → 3NF(이행 종속 제거) → BCNF 순서로 테이블을 나눕니다.
01
함수 종속성과 데이터 이상
함수 종속성 X→Y는 X 값이 정해지면 Y 값이 하나로 결정된다는 의미입니다. X는 결정자, Y는 종속자이며 후보키가 어떤 속성을 결정하는지 파악하면 속성을 알맞은 릴레이션에 배치할 수 있습니다.
중복 데이터는 삽입·갱신·삭제 이상을 만듭니다. 정규화는 데이터의 의미와 함수 종속성을 분석해 중복을 줄이고 무결성을 유지하는 방향으로 테이블을 분해합니다.
중복 데이터가 만드는 세 가지 이상 현상
이상
발생하는 문제
주문 데이터 예시
삽입 이상
다른 정보가 없으면 필요한 사실을 추가할 수 없음
주문 전에는 새 상품 정보를 등록할 수 없음
갱신 이상
중복된 값 일부만 바뀌어 서로 다른 값이 남음
같은 상품명이 여러 주문 행에서 다르게 수정됨
삭제 이상
한 사실을 지우면서 필요한 다른 사실도 사라짐
마지막 주문을 삭제하자 상품 정보도 함께 사라짐
정규화의 핵심은 테이블을 많이 만드는 것이 아니라 서로 다른 사실을 알맞은 테이블에 배치하는 것입니다. 아래 섹션들은 캠핑 장비 대여 서비스를 예로 듭니다. 대여 기록 한 줄에 고객, 대여소 이름, 장비 이름, 수량을 모두 넣으면 같은 고객·대여소·장비 정보가 여러 줄에 반복되고, 대여소 이름을 바꾸거나 새 장비를 등록할 때 위의 이상 현상이 생깁니다.
예를 들어 장비번호가 장비 이름을 유일하게 결정한다면 장비번호 → 장비이름입니다. 정규화는 이처럼 어떤 속성이 무엇에 의해 결정되는가를 확인하면서 진행합니다. 판단 근거는 테이블의 모양이 아니라 함수 종속과 업무 규칙입니다.
02
제1·제2·제3정규형과 BCNF
정규화는 앞 단계의 조건을 만족한 상태에서 다음 종속 문제를 제거하는 순서로 진행합니다.
테이블을 분해할 때는 원래 정보를 조인으로 복원할 수 있는 무손실 분해인지, 필요한 함수 종속성을 유지할 수 있는지도 함께 확인합니다.
중복을 종속성에 따라 분리하기하나의 주문표가 세 엔터티로 나뉘는 과정
2NF → 3NF
정규화 전
주문
상품
상품명
고객
등급
O1
P1
노트북
C1
GOLD
O2
P1
노트북
C1
GOLD
O3
P2
마우스
C2
SILVER
부분 종속이행 종속
분해→
정규화 후
주문
PK주문번호
FK상품번호
FK고객번호
상품
PK상품번호
상품명
고객
PK고객번호
고객등급
결과상품명과 고객등급을 한 곳에서만 관리해 갱신 이상을 줄이고, 키로 다시 결합합니다.
정규형별 제거 대상
정규형
핵심 조건
대표 점검
제1정규형
각 속성이 하나의 원자값을 가짐
한 칸에 전화번호 여러 개를 넣지 않음
제2정규형
부분 함수 종속 제거
복합키 일부만으로 결정되는 속성을 분리
제3정규형
이행 함수 종속 제거
키가 아닌 속성이 다른 일반 속성을 결정하지 않게 분리
BCNF
모든 결정자가 후보키
후보키가 아닌 결정자가 남아 있는지 확인
정규화 순서 — 앞 단계를 만족해야 다음 단계
제거 대상
1NF 다중값·반복 그룹→
2NF 부분 함수 종속→
3NF 이행 함수 종속→
BCNF 후보키 아닌 결정자
기출에서 가장 많이 묻는 것은 3NF = 이행 함수 종속 제거입니다. 1NF·2NF·BCNF는 키를 기준으로 정의되고, 3NF만 일반 속성끼리의 종속을 봅니다.
03
제1정규형(1NF): 한 칸에 한 값
제1정규형(1NF)은 모든 속성이 원자값(더 나눌 수 없는 하나의 값)을 갖도록 합니다. 한 칸에 텐트, 랜턴처럼 여러 값을 쉼표로 넣거나, 장비1·장비2·장비3처럼 같은 의미의 열을 반복하는 구조가 1NF 위반입니다.
다중값 속성은 값 하나가 행 하나가 되도록 별도 엔터티(테이블)로 분리하고 원래 엔터티와 관계를 맺습니다. 열을 여러 개 만들면 값의 최대 개수가 구조에 고정되고, 구분자로 이어 붙이면 검색·수정·제약 검사가 어려워집니다.
1NF: 한 칸의 여러 장비를 행으로 나누기
비정규 — 장비 칸에 값이 여러 개
대여번호
장비
801
텐트, 랜턴
802
랜턴
803
텐트
1NF→원자값
1NF — 장비 하나에 한 행
대여번호
장비
801
텐트
801
랜턴
802
랜턴
803
텐트
801이 두 행으로 늘어난 것은 정상입니다. 1NF는 중복 전체를 없애는 단계가 아니라 한 칸에 한 값만 두는 단계입니다.
행으로 풀어 썼다고 정규화가 끝난 것은 아닙니다. 대여번호와 장비번호를 합쳐 대여 명세를 식별하면, 대여일은 대여번호만으로, 장비 이름은 장비번호만으로 결정됩니다. 이렇게 복합키 일부에만 의존하는 속성이 남아 있으면 2NF를 검토합니다.
04
제2정규형(2NF): 부분 함수 종속 제거
제2정규형(2NF)은 1NF를 만족하면서 기본키(후보키)의 일부에만 종속되는 일반 속성이 없도록 합니다. 그래서 2NF 문제는 거의 항상 복합키가 있는 테이블에서 나옵니다. 키가 하나의 속성뿐이면 '일부'가 없으므로 부분 함수 종속도 생기지 않습니다.
대여 명세를 (대여번호, 장비번호) 복합키로 식별한다고 해 봅시다. 대여번호 → 대여일, 장비번호 → 장비명이므로 두 속성은 키의 일부만 알아도 결정되는 부분 함수 종속입니다. 반면 수량은 대여번호와 장비번호를 함께 알아야 결정되므로 명세에 남습니다.
2NF: 키 일부에 종속된 속성을 떼어 내기
1NF 대여명세 — PK (대여번호, 장비번호)
대여번호
장비번호
대여일
장비명
수량
801
G11
10-03
텐트
1
801
G12
10-03
랜턴
2
802
G12
10-04
랜턴
1
803
G11
10-06
텐트
1
2NF→부분 종속 분리
대여
대여번호
대여일
801
10-03
802
10-04
803
10-06
+
장비
장비번호
장비명
G11
텐트
G12
랜턴
+
대여명세
대여번호
장비번호
수량
801
G11
1
801
G12
2
802
G12
1
803
G11
1
색칠한 칸은 같은 사실이 반복 저장된 곳입니다. 분해 후에는 대여일이 대여마다, 장비명이 장비마다 한 번씩만 저장됩니다.
분해한 세 테이블은 대여번호·장비번호로 다시 조인하면 원래 명세를 그대로 복원할 수 있습니다(무손실 분해). 대여 테이블에는 대여소 정보도 있지만, 그림에서는 생략하고 다음 3NF에서 다룹니다.
05
제3정규형(3NF): 이행 함수 종속 제거
제3정규형(3NF)은 2NF를 만족한 뒤 이행 함수 종속을 제거합니다. 이행 함수 종속은 A → B이고 B → C라서 결국 A → C가 되는 관계입니다. 시험에서는 기본키 → 일반 속성 B → 일반 속성 C 형태를 주고, C를 B 기준의 별도 테이블로 옮기는 단계를 묻습니다.
대여 테이블에 대여소번호와 대여소명이 함께 있다고 합시다. 대여번호 → 대여소번호이고 대여소번호 → 대여소명이므로 대여번호 → 대여소번호 → 대여소명의 이행 종속이 생깁니다. 같은 대여소에서 여러 건을 빌리면 대여소명이 반복되고, 이름을 바꿀 때 일부 행만 고쳐지는 갱신 이상이 생길 수 있습니다.
없애는 대상은 기본키가 일반 속성을 결정하는 관계 자체가 아닙니다. 그것은 정상입니다. 문제는 키가 아닌 일반 속성끼리의 종속이 한 테이블에 남아 중복을 만드는 경우입니다. 그래서 3NF는 정규형 가운데 주식별자와 직접 관련이 가장 적은 단계로 출제됩니다.
06
BCNF: 모든 결정자가 후보키
BCNF(Boyce–Codd Normal Form)는 3NF를 더 엄격하게 만든 정규형으로, 모든 결정자가 후보키여야 합니다. 3NF를 만족해도 후보키가 아닌 속성이 다른 속성을 결정하면 BCNF 위반입니다. 시험에서는 'BCNF = 모든 결정자가 후보키'로 답합니다. (참고: 이론서에서는 같은 조건을 '모든 결정자가 슈퍼키'로 엄밀하게 적기도 합니다.)
캠핑 대여소의 정비 배치표를 봅시다. 대여소마다 장비유형별 담당 정비사가 정확히 한 명이고, 정비사 한 명은 장비유형 한 가지만 전문으로 한다고 가정하면 (대여소번호, 장비유형) → 정비사번호, 정비사번호 → 장비유형이 성립합니다.
TABLE3NF를 만족하지만 BCNF를 위반하는 정비 배치표4행
대여소번호
장비유형
정비사번호
D01
텐트
T01
D01
랜턴
T02
D02
텐트
T01
D02
랜턴
T03
이 표의 후보키는 (대여소번호, 장비유형)과 (대여소번호, 정비사번호) 두 개입니다. 세 속성 모두 어느 후보키에 포함되므로 3NF는 만족합니다. 그러나 정비사번호 → 장비유형에서 정비사번호는 후보키가 아닌 결정자이므로 BCNF를 위반합니다.
이렇게 나누면 정비사의 전문 유형을 한 곳에서 관리할 수 있습니다. 다만 원래의 '대여소·장비유형별 담당자는 한 명'이라는 업무 제약은 따로 보존·검증해야 할 수 있습니다. BCNF 분해가 모든 제약을 자동으로 지켜 주지는 않습니다.
07
반정규화와 성능의 균형
반정규화는 정규화된 구조에 의도적으로 중복·통합·분리를 적용해 조회 성능이나 운영 단순성을 높이는 기법입니다. 조회 빈도, 데이터량, 갱신 비용과 무결성 위험을 함께 평가합니다.
정규화가 항상 조회를 느리게 하거나 반정규화가 항상 빠르게 하지는 않습니다. 실제 접근 경로와 트랜잭션을 분석하고 인덱스·파티션 등 대안과 비교한 뒤 적용합니다.
예를 들어 대여 목록에 대여소 이름을 함께 저장하면 조회가 단순해질 수 있지만, 대여소 이름이 바뀔 때 중복된 값의 정합성 관리가 필요해집니다.
반정규화 대표 기법 (참고)
대상
기법
예
테이블
병합 · 분할(수직·수평) · 중복 테이블 추가
자주 함께 읽는 1:1 테이블 병합
컬럼
중복 컬럼 · 파생 컬럼 추가
대여에 대여소명 중복, 주문에 합계 금액
관계
중복 관계 추가
조인 경로를 줄이는 지름길 관계
수직 분할은 컬럼 단위로, 수평 분할은 행 단위로 테이블을 나눕니다. 현재 SQLD 출제 범위에서 반정규화의 세부 기법은 비중이 낮으므로, 시험에서는 '성능을 위해 의도적으로 중복을 허용하고, 대신 정합성 관리 비용이 생긴다'는 점을 먼저 기억합니다.
보충 실습여기부터는 테이블을 직접 만들어 보는 긴 SQL 실습입니다. 처음 공부할 때는 건너뛰고, 위 내용을 이해한 뒤 돌아와도 됩니다.
08
SQL 실전: 정규화 후 조회
보충 실습
대여 데이터를 최종적으로 고객·대여소·장비·대여·대여명세 다섯 테이블로 나눴습니다. 고객 이름은 고객번호, 대여소 이름은 대여소번호, 장비 이름은 장비번호로 관리하고, 대여명세는 복합키 (대여번호, 장비번호)와 수량으로 구성합니다. 아래는 Oracle에서 테이블을 만들고 예시 데이터를 넣은 뒤 조인으로 조회하는 순서입니다.
결과에는 고객·대여소·장비 이름이 여러 행에 보이지만 원본 데이터는 각 기준 테이블에 한 번씩만 저장되어 있습니다. 화면에 필요한 모양은 네 번의 JOIN으로 만들었습니다. 즉 저장은 분리하고 조회할 때 결합합니다. 조회 결과에 값이 반복된다는 것만으로 정규화 위반이라고 판단하지 않습니다.