正規化理論の復習

参考文献

賛否あるけどこの辺の書籍を参考にしました。

サマリ

  • 正規化理論とは
    • RDBMS のテーブル設計の目標は事実を一か所に記録して、関係を定義すること
    • 事実を複数個所に記録していると(重複していると)、どちらかの更新を忘れると一貫した答えが得られなくなってしまう(矛盾が生じてしまう)
    • 矛盾が生じるのを避けるには重複を許さない設計が必要
    • 正規化理論はそのための設計プロセス
  • テーブル設計のプロセス
    • 繰り返しを排除する(第1正規形)
    • 部分的関数従属性を排除する(第2正規形)
    • 推移的関数従属性を排除する(第3正規形、ボイス―コッド正規形)
    • 多値従属性を排除する(第4正規形)
    • 結合従属性を排除する(第5正規形)

個人的な理解

  • 正規化違反を気にしすぎるのもよくない
    • 「第n正規形に違反しているから」といってデータストアとして機能しないわけじゃない
    • データの一貫性が損なわれるリスクを別の部分で担保しているかもしれない
  • とはいえ、リレーショナルデータベースの機能を活用するには違反しないことが望ましい
    • データ構造を無理矢理リレーショナルモデルに合わせるのではなくドキュメントモデルの利用も検討したほうがいい

繰り返しの排除

  • すべての属性がそれ以上分離できない値で構成されること
    • アプリケーションドメインの属性として使用できる範囲の値のみで構成する
  • 繰り返しグループが存在しないこと
    • ある行の属性に複数の値を埋め込まないこと
    • 同じ意味の属性を複数並べないこと

    1NF 第1正規形

    • 表1.1 例:分解する前提でカンマやタブで連結した値を埋め込むのは NG
    • 表1.2 例:course1、course2、course3、みたいに同じ意味の列を複数並べるのは NG
    • 表1.3 例:繰り返しがなくなったので OK

表1.1: 例:分解する前提でカンマやタブで連結した値を埋め込むのは NG

name course grade
桂小五郎 リレーショナルモデル,Javaプログラミング 2
勝海舟 リレーショナルモデル,Ruby on Rails,コンピューターアーキテクチャ 3
坂本龍馬 リレーショナルモデル,コンピューターアーキテクチャ 1

表1.2: 例:course1、course2、course3、みたいに同じ意味の列を複数並べるのは NG

name course1 course2 course3 grade
桂小五郎 リレーショナルモデル Javaプログラミング   2
勝海舟 リレーショナルモデル Ruby on Rails コンピューターアーキテクチャ 3
坂本龍馬 リレーショナルモデル コンピューターアーキテクチャ   1

表1.3: 例:繰り返しがなくなったので OK

name course grade
桂小五郎 リレーショナルモデル 2
桂小五郎 Javaプログラミング 2
勝海舟 リレーショナルモデル 3
勝海舟 Ruby on Rails 3
勝海舟 コンピューターアーキテクチャ 3
坂本龍馬 リレーショナルモデル 1
坂本龍馬 コンピューターアーキテクチャ 1

関数従属性

  • AB
  • 「AはBを決定する」「BはAに従属する」
  • 1つの属性の値(A)が分かれば他の属性の値(B)を特定できる、という性質
  • 例:社員番号(A)が分かれば社員名(B)がわかる
  • 候補キーの部分集合から候補キーに含まれない属性に対する関数従属性
    • 部分的関数従属性
    • 第2正規形を満たす条件
  • 候補キーに含まれない属性から候補キーに含まれない属性に対する関数従属性
    • 推移的関数従属性
    • 第3正規形を満たす条件
  • 候補キーに含まれない属性から候補キーの部分集合に対する関数従属性
    • 推移的関数従属性
    • ボイス―コッド正規形を満たす条件
候補キー
行を特定する最小限の列の集合。複数存在する可能性もあるから候補。
スーパーキー
候補キーに不要な属性も含んでいるキー。

    2NF 第2正規形

  • 第1正規形を満たしていること
  • すべての候補キーについて、候補キーに含まれない属性を特定できるような部分集合が存在しないこと
    • 部分集合=候補キーを構成する属性の全ての組み合わせ
    • 表1.4 例:部分的関数従属性が存在する
      • 候補キーは {name,course,grade}
      • {name}{grade} に関数従属性がある
    • 表1.5表1.6 例:部分的関数従属性を排除
      • {name,grade} を別のテーブルへ分離して関数従属性を排除した

表1.4: 例:部分的関数従属性が存在する

name course grade
桂小五郎 リレーショナルモデル 2
桂小五郎 Javaプログラミング 2
勝海舟 リレーショナルモデル 3
勝海舟 Ruby on Rails 3
勝海舟 コンピューターアーキテクチャ 3
坂本龍馬 リレーショナルモデル 1
坂本龍馬 コンピューターアーキテクチャ 1

表1.5: 部分的関数従属性を排除(a)

name course
桂小五郎 リレーショナルモデル
桂小五郎 Javaプログラミング
勝海舟 リレーショナルモデル
勝海舟 Ruby on Rails
勝海舟 コンピューターアーキテクチャ
坂本龍馬 リレーショナルモデル
坂本龍馬 コンピューターアーキテクチャ

表1.6: 部分的関数従属性を排除(b)

name grade
桂小五郎 2
勝海舟 3
坂本龍馬 1

    3NF 第3正規形

  • 第2正規形を満たしていること
  • 候補キーに含まれない属性Aから候補キーに含まれない属性Bに対する関数従属性が存在しないこと
    • 候補キーでaddressが特定できる、かつ、addressからzipcodeを特定できる場合、候補キーからzipcodeへの推移的関数従属性が存在する

    BCNF ボイス―コッド正規形

  • 第3正規形を満たしていること
  • 候補キーに含まれない属性から候補キーの部分集合に対する関数従属性が存在しないこと
    • 候補キーが曖昧な場合に生じる

多値従属性

  • AB
  • 「AはBの集合を決定する」
  • 1つの属性の値(A)が分かれば、別の属性の集合(B)が特定できる、という性質
    • 属性集合{A,B,C}について、Aを決めるとBCが独立して決まる状態
    • 例:バンド名(A)が分かればメンバーの一覧(B)がわかる
  • 候補キーの部分集合の属性が、候補キーに含まれない属性へ1対nに対応するのが多値従属性
    • 1対1に対応するのが部分的関数従属性
  • 候補キーの部分集合から候補キーに含まれない属性に対する関数従属性
    • 多値従属性(関数従属性の一種)
    • 第4正規形を満たす条件

    4NF 第4正規形

  • 第3正規形を満たしていること
  • 候補キーの部分集合から候補キーに含まれない属性に対する関数従属性が存在しないこと

結合従属性

  • 複数のテーブルへ分離しても、結合して元のテーブルを復元できる性質
    • 第5正規形を満たす条件

    5NF 第5正規形

  • 第4正規形を満たしていること
  • テーブルに候補キー以外の属性が1つしか存在しないこと