본문 바로가기
Database

[Database] - 정규화 (1NF, 2NF, 3NF, BCNF)

by nam_ji 2024. 11. 8.

정규화 (1NF, 2NF, 3NF, BCNF)

정규화(Normalization)란

  • 정규화란 이상현상이 있는 릴레이션을 분해하여 이상현상을 없애는 과정입니다. 이상현상이 존재하는 릴레이션을 분해하여 여러 개의 릴레이션을 생성하게 됩니다. 이를 구분하여 높아질수록 이상현상은 줄어들게 됩니다.
    즉, 쉽게 말하면 테이블 간에 중복된 데이터를 허용하지 않는다는 것입니다. 중복된 데이터를 허용하지 않음으로써 무결성(Integrity)를 유지할 수 있으며, DB의 저장 용량 역시 줄일 수 있습니다. 이러한 테이블을 분해하는 정규화 단계가 정의되어 있습니다.

정규화의 장단점

1. 정규화 장점

  • 데이터베이스 변경 시 이상 현상(Anomaly)을 제거할 수 있습니다.
  • 정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장 시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 됩니다.
  • 데이터베이스와 연동된 응용 프로그램에 최소한의 영향만을 미치게 되어 응용프로그램의 생명을 연장시킵니다.

2. 정규화 단점

  • 릴레이션의 분해로 인해 릴레이션 간의 JOIN연산이 많아집니다..
  • 질의에 대한 응답 시간이 느려질 수도 있습니다. 데이터의 중복 속성을 제거하고 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화되는 효과가 있습니다. 
  • 따라서 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수도 있습니다.
  • 만약 조인이 많이 발생하여 성능 저하가 나타나면 반정규화(De-normalization)를 적용할 수도 있습니다.

제 1 정규화 (1NF)

  • 제 1 정규화란 테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것입니다.
  • 제 1 정규화는 다음과 같은 규칙들을 만족해야합니다.
    1. 각 컬럼이 하나의 속성만을 가져야합니다.
    2. 하나의 컬럼은 같은 종류나 타입의 값을 가져야합니다.
    3. 각 컬림이 유일한 이름을 가져야합니다.
    4. 컬럼의 순서가 상관없어야합니다.
  • 예시
    이름 나이 수강과목
    홍길동 20 C, C++
    이순신 21 Java
    이산 22 DB, 운영체제
    위와 같은 테이블을
    이름  나이 수강과목
    홍길동 20 C
    홍길동 20 C++
    이순신 21 Java
    이산 22 DB
    이산 22 운영체제

    이렇게 고치겠다는 의미입니다.


제 2 정규화 (2NF)

  • 제 2정규화란 제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것입니다. 여기서 완전 함수 종속이라는 것은 기본키의 부분집합이 결정자가 되어선 안된다는 것을 의미합니다.
  • 제 2정규화는 다음과 같은 규칙을 만족해야합니다.
    1. 제 1정규화를 만족해야합니다.
    2. 모든 컬럼이 부분적 종속(Partial Dependency)이 없어야합니다. 모든 칼럼이 완전 함수 종속을 만족해야합니다.
  • 제 1 정규화 테이블을 이용하여 예시를 들면
    이름  나이 수강과목
    홍길동 20 C
    홍길동 20 C++
    이순신 21 Java
    이산 22 DB
    이산 22 운영체제
    이 테이블을
    이름 나이
    홍길동 20
    이순신 21
    이산 22
    이름 수강과목
    홍길동 C
    홍길동 C++
    이순신 Java
    이산 DB
    이산 운영체제
    이렇게 2개의 테이블로 나누겠다는 의미입니다.

제 3 정규화 (3NF)

  • 제 3정규화란 제 2정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것입니다. 여기서 이행적 종속이라는 것은 A->B, B->C가 성립할 때 A->C가 성립되는 것을 의미합니다.
  • 제 3 정규화는 다음과 같은 규칙을 만족해야 합니다.
    1. 제 2 정규화를 만족해야합니다.
    2. 기본키를 제외한 속성들 간의 이행 종속성(Transitive Dependency)이 없어야합니다.
  • 예시
    학생코드 이름 DOB Street City State ZIP
    학생코드가 기본키이고, 기본키가 하나이므로 2차 정규형은 만족합니다. 하지만 이 데이터의 ZIP컬럼을 알면 Street, ity, State를 결정할 수 있습니다. 또한 여러명의 학생들이 같은 ZIP 코드를 갖는 경우에 ZIP 코드만 알면 Street, City, State가 결정되기 때문이 이 컬럼들에는 중복된 데이터가 생길 가능성이 있습니다.
  • 그러므로 위와 같은 테이블을
    학생코드 이름 DOB ZIP
    ZIP Street City State
  • 이와 같이 나누면 제 3 정규화를 만족합니다.

BCNF (Boyce-codd Normal Form)

  • BCNF는 3차 정규화를 조금 더 강화한 버전입니다. 이는 3차 정규화에서 해결할 수 없는 이상현상을 해결할 수 있습니다. BCNF란 3차 정규화를 만족하면서 모든 결정자가 후보키 집합에 속한 정규형입니다.
  • BCNF는 다음과 같은 규칙을 만족해야합니다.
    1. 제 3 정규화를 만족해야 합니다.
    2. 모든 결정자가 후보키 집합에 속해야 합니다
  • 예시
    학생 과목 교수 학점
    1 AB123 Mrs.Kim A
    2 CS123 Mr.Sim A
    3 CS123 Mr.Sim A
    위와 같은 테이블이 구성된 경우에 데이터가 중복되고, 갱신 이상이 발생합니다.
  • 교수 테이블
    교수 과목
    Mrs.Kim AB123
    Mr.Sim CS123
  • 수강 테이블
    학생 과목 학점
    1 AB123 A
    2 CS123 A
    3 CS123 A
  • 이렇게 2개의 테이블로 분리합니다.

'Database' 카테고리의 다른 글

[Database] - 서브쿼리란  (3) 2024.11.10
[Database] - Join이란  (4) 2024.11.09
[Database] - HeidiSQL 단축키 설정  (0) 2024.10.17
[Database / Redis] - Redis 비밀번호 설정  (0) 2024.04.06
[Database] - 동시성 제어란?  (2) 2024.03.13