Chapter 2: 데이터 모델과 SQL
데이터 모델과 SQL의 이해는 데이터베이스 설계 및 운영에서 핵심적인 역할을 합니다. 이번 장에서는 정규화, 관계와 조인의 이해, 모델이 표현하는 트랜잭션의 이해, NULL 속성의 이해, 반정규화에 대해 다룹니다.
[SQLD] Chapter 2-1 정규화(Normalization)와 반정규화(Denormalization)
데이터 모델링에서 정규화는 데이터 중복을 최소화하고, 데이터 무결성을 유지하는 과정이며, 반정규화는 성능 최적화를 위해 일부 정규화 규칙을 완화하는 과정입니다. 데이터 모델을 설계할 때 이 두 가지 개념을 균형 있게 적용하는 것이 중요합니다.
1. 정규화(Normalization)
1.1 정규화의 개요
정규화는 관계형 데이터베이스에서 데이터 중복을 방지하고, 데이터 무결성을 유지하는 과정입니다. 이를 통해 데이터 저장 공간을 절약하고, 데이터 갱신 시 이상(Anomaly)이 발생하는 것을 방지할 수 있습니다.
1.2 정규화의 단계
정규화는 일반적으로 다음의 단계를 거칩니다:
- 제1정규형(1NF): 모든 속성이 **원자값(Atomic Value)**을 가져야 함
- 제2정규형(2NF): 부분 함수적 종속 제거 (기본 키에 대해 완전 함수적 종속 유지)
- 제3정규형(3NF): 이행적 종속 제거 (기본 키에만 종속되도록 구성)
- BCNF(Boyce-Codd Normal Form): 모든 결정자가 후보 키가 되도록 구성
- 제4정규형(4NF): 다치 종속 제거 (하나의 속성이 두 개 이상의 독립적인 다중 값을 가지지 않도록 함)
- 제5정규형(5NF): 조인 종속 제거 (테이블이 여러 개로 분해되었을 때 데이터 손실 없이 조인 가능하도록 구성)
1.3 정규화 예제
1) 제1정규형(1NF): 원자값(Atomic Value) 적용
비정규형 테이블 (중복 속성 포함)
주문번호 | 주류코드 | 주문수량 | 주류명 |
202501 | A1001 | 2 | 참이슬, 진로 |
202502 | B1002 | 1 | 처음처럼 |
202503 | A1001 | 3 | 참이슬 |
👉 문제점: 주류명이 여러 개의 값을 포함하고 있음 (비원자적 속성 존재)
제1정규형 변환 (속성 분리)
주문번호 | 주류코드 | 주문수량 | 주류명 |
202501 | A1001 | 2 | 참이슬 |
202501 | B1002 | 1 | 진로 |
202502 | B1002 | 1 | 처음처럼 |
202503 | A1001 | 3 | 참이슬 |
👉 해결: 모든 속성이 **단일 값(Atomic Value)**을 가지도록 변환
2) 제2정규형(2NF): 부분 함수 종속 제거
1NF 테이블 (부분 함수 종속 존재)
주문번호 (PK) | 주류코드 | 주문수량 | 주류명 |
202501 | A1001 | 2 | 참이슬 |
202501 | B1002 | 1 | 진로 |
202502 | B1002 | 1 | 처음처럼 |
202503 | A1001 | 3 | 참이슬 |
👉 문제점: 주류명은 주류코드에 종속되어 있음 (부분 함수 종속 발생)
제2정규형 변환 (주류 정보를 별도 테이블로 분리)
주문 테이블
주문번호 (PK) | 주류코드 (FK) | 주문수량 |
202501 | A1001 | 2 |
202501 | B1002 | 1 |
202502 | B1002 | 1 |
202503 | A1001 | 3 |
주류 테이블
주류코드 (PK) | 주류명 |
A1001 | 참이슬 |
B1002 | 진로 |
B1003 | 처음처럼 |
👉 해결: 주류명을 주류코드만 참조하도록 분리하여 데이터 중복을 제거
3) 제3정규형(3NF): 이행적 종속 제거
2NF 테이블 (이행적 종속 존재)
주문번호 (PK) | 고객ID (FK) | 주류코드 (FK) | 주문수량 | 고객명 | 고객연락처 |
202501 | C001 | A1001 | 2 | 홍길동 | 010-1234 |
202501 | C001 | B1002 | 1 | 홍길동 | 010-1234 |
202502 | C002 | B1003 | 1 | 김철수 | 010-5678 |
202503 | C001 | A1001 | 3 | 홍길동 | 010-1234 |
👉 문제점: 고객명과 고객연락처가 고객ID를 통해 유추 가능 (이행적 종속 발생)
제3정규형 변환 (고객 정보를 별도 테이블로 분리)
주문 테이블
주문번호 (PK) | 고객ID (FK) |
202501 | C001 |
202502 | C002 |
202503 | C001 |
고객 테이블
고객ID (PK) | 고객명 | 고객연락처 |
C001 | 홍길동 | 010-1234 |
C002 | 김철수 | 010-5678 |
👉 해결: 고객명과 고객연락처를 고객ID만 참조하도록 분리하여 데이터 중복을 제거
2. 반정규화(Denormalization)
정규화가 데이터 무결성을 유지하고 중복을 방지하는 반면, 반정규화는 성능 최적화를 위해 일부 정규화 규칙을 완화하는 기법입니다. 업무 프로세스상 JOIN 등 연산이 많이 필요한 경우 테이블을 통합하는 것이 성능 측면에서 유리할 경우 고려할 수 있습니다.
2.1 테이블 반정규화
- 여러 개로 분할된 테이블을 하나로 합쳐 조회 성능 향상
- 예: 고객 테이블과 주문 테이블을 합쳐 고객 정보를 빠르게 조회
2.2 컬럼 반정규화
- 자주 조회하는 데이터를 추가 컬럼으로 저장하여 성능 향상
- 예: 고객 테이블에 최근 주문일자 추가하여 빠른 조회 가능
2.3 관계 반정규화 (중복 관계 추가)
- 특정 조인을 줄이기 위해 중복 데이터를 추가하여 성능 개선
- 예: 주문 테이블에 고객명을 직접 저장하여 조인 없이 조회 가능
3. 마무리
이번 장에서는 정규화와 반정규화에 대해 학습했습니다.
- 정규화는 데이터 중복을 방지하고 무결성을 유지하기 위한 과정이며, 1NF, 2NF, 3NF까지 예제를 통해 설명했습니다.
- 반정규화는 성능 향상을 위해 정규화 규칙을 완화하는 방법이며, 테이블 반정규화, 컬럼 반정규화, 관계 반정규화를 포함합니다.
'자격증 > SQLD' 카테고리의 다른 글
[SQLD] Part 3: SQL 기본 (1) | 2025.02.14 |
---|---|
[SQLD] 2-2: 트랜잭션(Transaction)/ 널(NULL) / (0) | 2025.02.14 |
[SQLD ] 1-3: 관계와 식별자 (feat. ERD 표기) (0) | 2025.02.13 |
[SQLD] 1-2: 엔티티(Entity), 속성(Attribute), 인스턴스(Instance) (0) | 2025.02.13 |
[SQLD] 1-1: 데이터 모델의 이해 (1) | 2025.02.13 |