[DB] 정규화 (Normalization)

Wonjun Seo·2023년 8월 6일
1

정규화(Normalization)

정규화란 데이터의 중복을 최소화하고 무결성을 향상 시키는 등 여러 목적을 달성하기 위해 관계형 데이터베이스를 정규화된 형태로 재디자인하는 것을 말한다.

정규화의 장점

  • 데이터베이스 변경 시 이상 현상(Anomaly)을 제거할수 있다.
  • 데이터의 중복을 없애면서 불필요한 데이터를 최소화 시킬수 있다.
  • 정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장 시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 된다.

정규화의 단점

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

제 1정규화(1NF)

테이블 컬럼이 원자값(하나의 값)을 갖도록 테이블을 분리시키는 것을 말한다.

제 1정규형은 다음과 같은 규칙들을 만족해야 한다.

  • 어떤 릴레이션에 속한 모든 도메인이 원자값으로만 이루어져 있어야 한다.
  • 기본키를 사용하여 관련 데이터의 각 집합을 고유하게 식별할 수 있어야 한다.
  • 하나의 컬럼은 같은 종류나 타입의 값을 가져야 한다.
  • 컬럼의 순서가 상관없어야 한다.

위의 테이블은 전화번호를 여러개 가지고 있어 원자값이 아니다. 따라서 1NF를 만족하기 위해서 다음과 같이 분리할 수 있다.

위와 같이 각 컬럼이 원자 값을 갖도록 테이블을 분해하여 1 정규형을 만족할 수 있다.

제 2정규화(2NF)

제 2정규형은 다음과 같은 규칙들을 만족해야 한다.

  • 제 1정규형을 만족해야 한다.
  • 모든 컬럼에 부분적 종석(Partial Dependency)이 없어야 한다. (테이블의 모든 컬럼이 완전 함수적 종속을 만족해야 한다.)

함수적 종속이란 X의 값에 따라 Y의 값이 결정될 때, 이를 X → Y로 표현하는데, 이를 Y는 X에 대해 함수적 종속이라고 한다.

함수적 종속에서 X의 값이 여러 요소일 경우({X1, X2} → Y일 경우), X1과 X2가 Y의 값을 결정할 때 이를 완전 함수적 종속이라고 하고, X1, X2 중 하나만 Y의 값을 결정할 때 이를 부분 함수적 종속 이라고 한다.

Manufacture과 Model이 키가 되어 Model Full Name을 알 수 있다. ({Model, Manufacturer} → Model Full Name)

반면에, Model과 Manufacturer Country는 아무런 연관관계가 없고 Manufacturer Country는 Manufacturer로 인해 결정된다.

따라서 이를 부분적 함수 종속이라고 하게 되는 것이다.

위에서 부분 함수 종속을 제거하게 되면, 아래와 같은 상태가 된다.

따라서, 부분 함수 종속을 해결하기 위해 다음과 같이 테이블을 분리하여 2NF를 만족시킬 수 있다.

제3 정규화(3NF)

제 3정규형은 다음과 같은 규칙들을 만족해야 한다.

  • 제 2정규형을 만족해야 한다.
  • 기본키를 제외한 속성들 간에 이행적 종속(Transitive Dependency)이 없어야 한다.

이행 종속성이란 A → B, B → C일 때 A → C가 성립하면 이행 종속이라 한다.

위 테이블에서 {Tournament, Year}가 후보키가 된다.

Winner는 이 두 복합키를 통해 결정된다.

하지만, Winner Date of Birth는 기본키가 아닌 속성인 Winner를 거쳐 {Tournament, Year}에 의존하고 있다.

따라서 이는 3NF를 위반한 것이 되고, 테이블을 아래와 같이 분리하여 해결할 수 있다.

BCNF(Boyce-Codd Normal Form)

BCNF는 제 3정규형을 좀 더 강화한 버전으로 다음과 같은 규칙들을 만족해야 한다.

  • 제 3정규형을 만족해야 한다.
  • 모든 결정자가 후보키 집합에 속해야 한다.

References

https://github.com/gyoogle/tech-interview-for-developer/blob/master/Computer%20Science/Database/%EC%A0%95%EA%B7%9C%ED%99%94(Normalization).md

https://code-lab1.tistory.com/48

0개의 댓글