3NF까지 정규화하기
제거되는 이상 현상과 함께 제1, 제2, 제3 정규형을 알아봅니다.
3NF까지 정규화하기은(는) CoddyKit의 무료 SQL Interview Prep 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
면접관은 정규화에 대해 왜 질문할까요
정규화는 데이터베이스 모델링의 기본이며, 면접관은 설계 수준에서 데이터 무결성을 이해하고 있는지 확인하기 위해 정규화를 질문합니다. 질문은 흔히 다음과 같이 들립니다: "정규화란 무엇이며, 왜 중요한가요?"
정규화는 열과 테이블을 구성하여 중복을 줄이고 갱신, 삽입, 삭제 이상을 방지하는 과정입니다. 각 정규형(1NF, 2NF, 3NF)은 더 엄격한 규칙을 추가합니다.
좋은 답변은 교과서적인 정의만 말하는 것이 아니라, 정규화로 제거되는 이상 현상을 언급합니다.
세 가지 이상 현상
정규형을 살펴보기 전에 정규형이 해결하는 문제부터 알아보겠습니다. 모든 정보를 한곳에 저장하는 잘못 설계된 테이블에는 세 가지 이상 현상이 발생합니다:
- 갱신 이상: 같은 사실이 여러 행에 저장되므로 변경할 때 모든 행을 수정해야 하며, 그렇지 않으면 데이터가 일관되지 않게 됩니다.
- 삽입 이상: 관련 없는 데이터도 함께 제공하지 않으면 사실을 추가할 수 없습니다(예: 주문 없이는 상품을 추가할 수 없습니다).
- 삭제 이상: 한 행을 삭제하다가 서로 독립적인 다른 사실까지 실수로 지우게 됩니다.
예시 테이블에서 이러한 이상 현상을 찾아낼 수 있다면, 각 정규화 단계를 모두 정당화할 수 있습니다.
정규화되지 않은 시작 테이블
다음은 전형적인 면접 예시입니다. 주문, 고객, 상품을 하나의 넓은 테이블에 섞어 놓았습니다. 여러 행에 고객 이메일과 상품 가격이 반복되는 것을 확인하세요. 이상 현상이 발생하는 지점입니다.
면접에서는 이 테이블을 3NF까지 단계적으로 정규화하면서 각 분할을 설명해야 합니다.
-- Unnormalized: everything in one table
CREATE TABLE orders_flat (
order_id INT,
customer_id INT,
customer_email VARCHAR(255),
product_id INT,
product_name VARCHAR(100),
unit_price DECIMAL(10,2),
quantity INT
);제1정규형(1NF)
1NF에서는 모든 열이 하나의 원자적 값만 저장하고, 셀 안에 반복 그룹이나 배열이 없어야 합니다.
열에 'phone1, phone2'와 같은 쉼표로 구분된 목록을 저장하거나 product1, product2, product3과 같은 열을 두면 1NF를 위반합니다.
해결 방법은 각 값에 고유한 행을 부여하는 것입니다. 면접관은 "원자적 값, 반복 그룹 없음, 각 행을 식별하는 키"라는 말을 듣고 싶어 합니다.
-- Violates 1NF: a list inside one column
-- phones = '555-1111, 555-2222'
-- 1NF fix: one phone per row
CREATE TABLE customer_phone (
customer_id INT,
phone VARCHAR(20),
PRIMARY KEY (customer_id, phone)
);함수적 종속
2NF와 3NF를 설명하려면 함수적 종속이라는 용어를 사용해야 합니다. A -> B는 "A가 B를 결정한다"는 뜻으로, A의 각 값에 B 값이 정확히 하나씩 대응된다는 의미입니다.
주문 테이블에서:
customer_id -> customer_emailproduct_id -> product_name, unit_priceorder_id, product_id -> quantity
정규화란 사실상 모든 키가 아닌 열이 전체 키에, 그리고 키에만 종속되도록 하는 것입니다.
제2정규형(2NF)
2NF는 기본 키가 복합 키일 때 적용됩니다. 키가 아닌 열이 키의 일부에만 종속되는 것(부분 종속)을 금지합니다.
주문 항목의 키는 (order_id, product_id)입니다. 그러나 product_name과 unit_price는 전체 키가 아니라 product_id에만 종속됩니다. 이것은 부분 종속이므로 2NF를 위반합니다.
해결 방법은 상품 속성을 product_id를 키로 하는 products 테이블로 옮기는 것입니다.
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(100),
unit_price DECIMAL(10,2)
);
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);제3정규형(3NF)
3NF는 이행적 종속을 제거합니다. 이행적 종속이란 키가 아닌 열이 키에 직접 종속되지 않고 다른 키가 아닌 열에 종속되는 경우입니다.
orders 테이블에 customer_id와 customer_email이 있다고 가정해 보겠습니다. 이때 order_id -> customer_id -> customer_email입니다. 이메일은 키에 직접 종속되지 않고 customer_id를 통해서만 종속되므로 이행적 종속입니다.
해결 방법은 고객을 별도의 테이블로 분리하는 것입니다. 그러면 각 테이블의 키가 아닌 열이 해당 테이블의 키에만 종속됩니다.
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
customer_email VARCHAR(255)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);한 줄 암기법
면접관은 3NF를 한 문장으로 요약할 수 있는 지원자를 높이 평가합니다. 전형적인 표현은 다음과 같습니다:
"모든 키가 아닌 열은 키에, 전체 키에, 그리고 키에만 종속되어야 합니다."
- 키 -> 1NF (키가 있고 원자적 값이어야 함).
- 전체 키 -> 2NF (부분 종속이 없음).
- 키에만 -> 3NF (이행적 종속이 없음).
이 한 줄만으로도 필요할 때 세 가지 정규형을 모두 재구성할 수 있습니다.
BCNF: 후속 질문
꼼꼼한 면접관이라면 보이스-코드 정규형(BCNF)에 대해 물을 수 있습니다. BCNF는 3NF보다 더 엄격한 형태입니다.
BCNF에서는 모든 함수적 종속 X -> Y에 대해 X가 반드시 슈퍼키여야 합니다. 3NF는 종속 속성이 후보 키의 일부인 경우 드문 예외를 허용하지만, BCNF에서는 그 예외조차 허용하지 않습니다.
실무에서 BCNF 위반을 자주 보게 되지는 않지만, 이를 언급하고 "BCNF는 프라임 속성에 대한 예외가 없는 3NF입니다"라고 말하면 깊이 있는 이해를 보여 줄 수 있습니다.
정규화하지 않을 때(NOT)
상급자 수준의 답변은 상충 관계를 인정합니다. 정규화는 무결성을 향상시키지만, 쿼리 결과를 얻으려면 더 많은 조인이 필요하므로 읽기 성능이 저하될 수 있습니다.
다음과 같은 경우에는 의도적인 반정규화가 허용됩니다:
- 읽기 작업이 많고 조인이 병목인 경우
- 분석/보고 계층을 구축하는 경우(스타 스키마는 뒤에서 다룹니다)
- 중복 사본을 동기화 상태로 유지할 수 있는 경우(트리거, ETL, 구체화된 뷰)
다음과 같이 말해 보세요: "OLTP 무결성을 위해 정규화하고, OLAP 읽기 속도를 위해 의도적으로 반정규화하십시오."
화이트보드 풀이
이제 한데 모아 보겠습니다. 실제 면접에서 지저분한 테이블이 주어지면:
- 후보 키를 밝히고 함수적 종속을 나열합니다.
- 원자성과 반복 그룹을 확인합니다(1NF).
- 키가 복합 키라면 부분 종속을 확인합니다(2NF).
- 키가 아닌 열끼리의 종속을 확인합니다(3NF).
- 기본 키와 외래 키를 포함한 결과 테이블을 그립니다.
이 단계를 소리 내어 설명하는 것이 바로 면접관이 평가하는 내용입니다.
빠른 확인
정규형에 대한 이해도를 확인해 보세요.
복습: 3NF까지의 정규화
이제 대표적인 정규화 면접 질문에 처음부터 끝까지 답변할 수 있습니다:
- 정규화는 중복을 줄여 갱신, 삽입, 삭제 이상을 제거합니다.
- 1NF: 원자적 값, 반복 그룹 없음
- 2NF: 복합 키에 대한 부분 종속 없음
- 3NF: 이행적 종속(키가 아닌 열에서 다른 키가 아닌 열로 이어지는 종속) 없음
- "키, 전체 키, 그리고 키에만"이라고 요약합니다.
- BCNF는 3NF를 더 엄격하게 만들며, 읽기 작업이 많은 분석을 위해 의도적으로 반정규화합니다.
자주 묻는 질문
“3NF까지 정규화하기” 강의는 무료인가요?
네 — “3NF까지 정규화하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Interview Prep 강의 전체를 잠금 해제할 수 있습니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“3NF까지 정규화하기”에서 뭘 배우나요?
제거되는 이상 현상과 함께 제1, 제2, 제3 정규형을 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“3NF까지 정규화하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.