sql 개념 (정규화)

개발자되고싶은데·2025년 11월 12일

데이터베이스 설계의 핵심, SQL 정규화 (Normalization) 개념 정리

SQL 정규화(Normalization)는 데이터베이스 테이블을 설계할 때 데이터의 중복을 최소화하고, 데이터의 일관성과 무결성을 보장하기 위해 테이블을 체계적으로 분리하는 과정임.

쉽게 말해, 하나의 거대한 테이블에 모든 정보를 다 담는 게 아니라, 관련 있는 데이터끼리 묶어서 여러 개의 작은 테이블로 나누는 '데이터 정리정돈' 규칙이라 보면 됨.


정규화

만약 정규화를 무시하고 하나의 큰 테이블에 모든 데이터를 저장하면, '데이터 이상(Anomaly)' 현상이 발생함. 이는 데이터를 관리(삽입, 수정, 삭제)할 때 의도치 않은 심각한 문제가 생기는 것을 의미함.

  • 삽입 이상 (Insertion Anomaly)

    • 문제: 불필요한 데이터 없이는 새 데이터를 추가할 수 없는 현상.
    • 예시: '학생'과 '수강 과목' 정보가 한 테이블에 있을 때, 아직 과목을 신청하지 않은 신입생 정보를 추가할 수 없는 상황. (수강 과목 컬럼이 비어있으면 안 될 경우)
  • 갱신 이상 (Update Anomaly)

    • 문제: 중복된 데이터 중 일부만 수정되어 데이터의 일관성이 깨지는 현상.
    • 예시: 한 학생이 여러 과목을 수강할 때, 학생의 '주소'가 여러 행에 중복 저장됨. 이 학생이 이사해서 주소를 바꿀 때, 일부 행만 수정하고 누락하면 데이터가 불일치하게 됨.
  • 삭제 이상 (Deletion Anomaly)

    • 문제: 특정 데이터를 삭제할 때, 의도하지 않은 다른 유용한 정보까지 함께 날아가는 현상.
    • 예시: 한 학생이 '데이터베이스' 과목 하나만 수강 중이었음. 이 학생이 자퇴해서 학생 정보를 삭제했더니, '데이터베이스'라는 과목 정보까지 DB에서 사라져 버리는 상황.

정규화는 바로 이 '이상 현상'을 방지하여 데이터의 신뢰도를 높이는 것이 핵심 목표임.


정규화 단계별 규칙 (주요 정규형)

정규화는 단계별로 규칙을 적용하며, 각 단계를 '정규형'이라고 부름. 실무에서는 보통 제3정규형(3NF)까지 만족시키는 것을 목표로 함.

1. 제1정규형 (1NF - First Normal Form)

"모든 컬럼(속성)의 값은 '원자값(Atomic Value)'이어야 한다."

  • 의미: 테이블의 한 칸(셀)에는 오직 하나의 값만 들어가야 함.
  • 예시: '수강 과목' 컬럼에 "데이터베이스, 운영체제"처럼 쉼표로 구분된 여러 값을 한꺼번에 넣으면 안 됨. 이 경우, 행을 나누거나 테이블을 분리해야 1NF를 만족함.

2. 제2정규형 (2NF - Second Normal Form)

"1NF를 만족하고, '부분 함수 종속'을 제거해야 한다."

  • 의미: 기본 키(Primary Key)가 여러 개의 컬럼(복합 키)으로 구성될 때, 테이블의 모든 일반 컬럼은 기본 키 '전체'에 의존해야 함. 기본 키의 '일부'에만 의존(종속)해서는 안 됨.
  • 예시: (학생ID, 과목ID)가 복합 기본 키인 테이블에 학생이름 컬럼이 있다고 가정해 보자. 학생이름은 학생ID에만 의존함 (과목ID와는 상관없음). 이것이 '부분 함수 종속'임.
  • 해결: 이 경우 (학생ID, 학생이름)을 '학생 테이블'로 따로 분리해야 함.

3. 제3정규형 (3NF - Third Normal Form)

"2NF를 만족하고, '이행 함수 종속'을 제거해야 한다."

  • 의미: 기본 키가 아닌 일반 컬럼이 다른 일반 컬럼에 종속되어서는 안 됨. (A → B → C 관계 금지)
  • 예시: '학생 테이블'에 (학생ID, 학과명, 학과사무실_전화번호)가 있다고 가정해 보자. 학과사무실_전화번호는 학과명에 의해 결정됨. (학생ID → 학과명 → 학과사무실_전화번호). 이것이 '이행 함수 종속'임.
  • 해결: (학과명, 학과사무실_전화번호)를 '학과 테이블'로 따로 분리해야 함.

정규화의 장점과 단점

장점 👍단점 👎
데이터 중복 최소화 (저장 공간 효율)테이블이 많이 분리되어 구조가 복잡해짐
데이터 무결성 및 일관성 보장데이터를 조회(SELECT)할 때 JOIN 연산이 많아짐
'데이터 이상 현상' 원천 방지JOIN이 많아지면 조회 성능이 저하될 수 있음
데이터 구조가 명확해져 유지보수 용이

요약

정규화는 데이터의 일관성을 지키기 위한 매우 중요한 설계 원칙임. 하지만 과도한 정규화는 오히려 성능을 저하시킬 수 있음.

따라서 실제 시스템 설계 시에는 데이터의 성격과 성능 요구사항을 고려하여, 의도적으로 정규화 수준을 낮추는 '반정규화(Denormalization)'를 통해 성능과 데이터 일관성 사이의 균형을 맞추는 전략이 필요함.

느낀점

정규화는 아주 헷갈리는 개념이다. 그래서 까먹지 말고 반복적으로 외워야겠다.

0개의 댓글