데이터베이스 설계에서 "정규화(Normalization)"는 가장 중요한 개념 중 하나다. 정규화는 데이터의 중복을 최소화하고, 데이터 일관성을 보장하며, 데이터 모델을 더 유연하게 만들기 위한 과정이다. 한마디로, 잘 설계된 데이터베이스를 만들기 위한 체계적인 절차라고 할 수 있다.
우리는 앞에서 이미 잘 설계된 member, product, orders, order_item 테이블을 만들었다. 하지만 왜 테이블을 그렇게 여러 개로 나누어야만 했을까? 모든 데이터를 그냥 하나의 큰 테이블에 저장하면 더 편하지 않을까? 이 질문에 답하기 위해, 일부러 잘못 설계된 테이블에서부터 시작해서 점차적으로 개선해 나가는 과정을 밟아볼 것이다. 이 과정을 통해 정규화의 필요성을 몸소 체감하게 될 것이다.
정규화
정규화(Normalization)라는 용어는 관계형 데이터베이스 모델의 창시자인 에드거 F. 커드(Edgar F.Codd)가 처음 제안했다. 이 개념은 수학과 논리학에서 사용되는 정규형(Normal Form)에서 영감을 받은 것이다. 수학에서 정규형이란 어떤 대상을 가장 단순하고 표준적인 형태로 변환한 것을 의미한다.
예를 들어, 분수 "2/4"와 "1/2"은 같은 값을 나타내지만, "1/2"이 가장 단순하고 명확한 형태이므로 이를 대표로 둔다. 이것이 바로 정규형이다. 데이터베이스에서의 정규화도 비슷한 맥락이다.
정규화(Normalization)란 데이터를 정규형(Normal Form)이라는 규칙에 맞추어 변환하는 과정이다. 이렇게 하면 데이터가 중복되지 않고, 일관성과 무결성을 유지하며, 이상 현상(Anomaly)을 방지할 수 있다.
따라서 "정규"라는 말은 정규형의 조건을 만족하는 이상적 상태를 의미한다.
문제 상황 제시: 하나의 거대한 테이블
disaster_orders (재앙적인 주문 테이블)

- 갱신 이상 (Update Anomaly)
- 만약 "션" 회원의 주소가 "부산시 해운대구"로 변경된다면 어떻게 될까?
- 이 회원이 주문한 모든 주문 데이터(1001번, 1003번)를 찾아서 주소를 일일이 수정해야 한다.
- 만약 하나라도 빠뜨린다면 데이터의 일관성이 깨진다.
- 만약 "션" 회원의 주소가 "부산시 해운대구"로 변경된다면 어떻게 될까?
- 삽입 이상 (Insertion Anomaly)
- 아직 한 번도 주문하지 않은 새로운 회원을 시스템에 등록하고 싶다면?
- 이 테이블 구조에서는 주문 정보(order_id)가 없으면 회원 정보를 추가할 수 없다.
- 마찬가지로, 아직 아무도 주문하지 않은 새로운 상품을 등록하는 것도 불가능하다.
- 아직 한 번도 주문하지 않은 새로운 회원을 시스템에 등록하고 싶다면?
- 삭제 이상 (Deletion Anomaly)
- 만약 1002번 주문을 취소해서 해당 데이터를 삭제했다고 가정해 보자.
- 이 주문이 "네이트" 회원의 유일한 주문이었다면, "네이트"라는 회원 정보 자체가 데이터베이스에서 사라져 버린다.
이러한 문제들을 해결하기 위해 데이터베이스 이론가들이 만들어낸 것이 바로 "정규화"다. 정규화는 몇 가지 단계를 거치는데, 각 단계를 "정규형(Normal Form)"이라고 부른다.
함수 종속성 (Functional Dependency)
함수 종속성이란, 테이블에서 컬럼의 값들이 다른 컬럼의 값을 유일하게 결정하는 관계를 의미한다. 기호로는 "X -> Y"와 같이 표기하며, "X가 Y를 함수적으로 결정한다"라고 읽는다. 여기서 X를 결정자(Determinant), Y를 종속자(Dependent)라고 한다. 쉽게 말해, X 값이 Y 값을 유일하게 결정한다는 뜻이다.
- member_id → member_name : "member_id"가 "1"이면 "member_name"은 항상 "션"이다.
- member_id → member_address : "member_id"가 "1"이면 "member_address"는 항상 "서울시 송파구"다.
정규화는 바로 이 함수 종속성 관계를 분석해서, 잘못된 종속 관계를 찾아내고 테이블을 분리하여 올바른 종속 관계로 만들어가는 과정이다.
용어
정규화에서는 다음과 같은 용어를 주로 사용한다.
- 테이블 대신에 릴레이션
- 행 대신에 튜플
- 컬럼 대신에 애트리뷰트(속성)
'데이터 베이스 > 설계 1편, 현대적 데이터 모델링 완전 정복' 카테고리의 다른 글
| Ch10. 물리적 모델링 - 날짜와 시간 타입 (0) | 2026.07.01 |
|---|---|
| Ch10. 물리적 모델링 - 문자, 숫자, PK 타입 (0) | 2026.07.01 |
| Ch08. 논리적 모델링 - ERD 작성 (0) | 2026.06.28 |
| Ch08. 논리적 모델링 - 실습 준비 (0) | 2026.06.28 |
| Ch07. 논리적 모델링(4) - 현대적인 설계 트랜드 (0) | 2026.06.27 |