🍙

Normalization for Relational DB - 1


Relational database 디자인은 정보 보존중복 최소화를 함축적인 목표로 가진다.

Relational Database 디자인

  • Bottom-up: 속성을 정의하는 것부터 시작해서 엔티티, 관계를 정의한다. ER 디자인이 여기에 해당한다.

  • Top-down: 하나의 relation에 있는 속성들의 그룹부터 시작해서 작은 relation들로 분리해간다. 이번에 다룰 방법이 이 방식이다.

경험적인 가이드라인

관계형 스키마 다지인의 품질을 확인하는데 사용할 수 있는 몇가지 기준이 있다.

  • 속성의 의미 확인
  • 튜플간 중복 줄이기
  • NULL 값을 최대한 줄이기
  • 비논리적 튜플들의 생성 가능성을 배제하기

각각의 기준들이 독립적이지는 않다.

1) Relation의 속성에 대한 명확한 의미 부여

서로 다른 엔티티의 속성들이 하나의 relation에 포함되어 있으면 안된다.

  • Relation의 각 튜플들은 오직 하나의 entity/relationship instance를 나타내야 한다.
  • 외래 키만이 다른 엔티티를 참조하는데 사용되어야 하고,
  • Entity와 relationship의 속성은 서로 분리되어야 한다.

이것을 지킴으로써 각 relation을 설명하기 쉬운 스키마를 디자인할 수 있고, 속성들의 의미를 쉽게 해석할 수 있게 된다.

2) 튜플 안에 중복되는 정보와 갱신 이상을 최소화

자장소 공간 사용을 최소화 하는 것은 스키마 디자인의 한 목표다.

정보들이 중복 저장된다면 저장공간이 낭비되고 갱신 이상과 같은 추가적인 문제를 야기할 수 있다.

갱신이상(Update Anomaly)

  • 수정 이상(Modification Anomaly): 한 entity에 대한 수정이 다른 entity를 수정하게 함
  • 삽입 이상(Insertion Anomaly): 어떤 두 entity가 서로 의존하게 되어, 서로 없이는 삽입이 불가능함
  • 삭제 이상(Deletion Anomaly): 어떤 entity의 삭제가 다른 entity를 삭제하게 함

3) NULL 값 최소화

속성들의 NULL 값은 최소화하는 것이 좋다. 왜냐하면 NULL은 3가지 의미를 가져서 혼동을 일으킬 수도 있기 때문이다.

NULL의 세가지 의미

  • 적용 불가능(not applicable)
  • 알 수 없음(unknown)
  • 아직 존재하지 않음(not available)

NULL 값을 최소화하는 것이 불가능하다면 새로운 relation으로 따로 빼내는 것도 방법이다.

4) Lossless 조인 상태를 만족하기

관계형 스키마를 디자인해서 lossless 조인 상태를 만족하게 한다. 'Lossless join'은 조인을 했을 때 소실되는 정보가 없게 하는 것이다. 조인을 했을 때 의미있는 결과만이 나오게 보장하게 한다. Relation은 적절하게 연관된 속성쌍(e.g. PK, FK)에 대해 동등 조건(equality condition)으로 결합되어야 한다.

Natural join을 사용해서 튜플을 생성했을 때 가짜 튜플이 생성되면 안된다.

Relation을 분해할 때 두 가지 중요한 특성이 있다.

  • 조인의 non-addictive 혹은 lossless 만족

  • Functional dependency의 보전

첫 번째 조건(lossless join)은 엄청 중요해서 희생되거나 타협될 수 없다. 하지만 두 번째 조건은 덜 엄격해서 성능같은 이유로 희생될 수 있다.