プログラミングしたり。

HTML/CSS/JavaScript/PHPを中心にWebサイト作ったり。Webサービス作ったり。

正規化について

達人に学ぶDB設計徹底指南書を読んだので、 正規化(第3正規化まで)についてまとめておく。

正規化とは、関数従属性を満たすように整理していくこと。 入力Xに対して、出力Yが一つに決まることをYはXに従属すると呼び、 {X}→{Y} と表現する。

以下、正規化のポイント

  • 更新時の不整合を排除するために行う
  • 従属性を見抜くことで可能になる
  • 正規形はいつでも非正規形に戻せる
  • 第3正規形までは原則行う。
  • 関連エンティティが存在する場合は関連とエンティティが1対1に対応するよう注意する
  • テーブルの持つ意味が明確になる
  • テーブル数が増え、SQL文で結合処理が増えるため、パフォーマンスが悪化する

第1正規形

第1正規化の定義は「一つのセルの中には一つの値しか含まない」、スカラ値であることを指す。

一つのセルに複数の値が入ると、主キーが各列の値を一意に決定できないため、 リレーショナルデータベースは第1正規形を満たすテーブルを作らなければならない。

第2正規形

主キー以外の列は主キーに従属する必要があるが、 主キーの一部の列に対して従属する列がある場合、 そのような関係を部分関数従属と呼ぶ。 主キーを構成する全ての列に従属する場合、完全関数従属と呼ぶ。

第2正規形とは、部分関数従属を解消し、完全関数従属にすること。

第2正規形でないと、部分関数従属している列にデータを登録したいときに 他の主キーの値が決まっていないと登録できない、あるいはダミー値を入れる必要が出てくること。 また、部分関数従属している列の値が{C0001,A商事}、{C0001,A商社}などとマチマチに なってしまう可能性があること。

第2正規化は異なるレベルの実体(エンティティ)をテーブルとしても分離する作業と言える。

第3正規形

テーブル内部に存在する段階的な従属関係を推移的関数従属と呼び、 これらを解消すること。

下記のように二段階の関数従属を解消し、非キー列をキー列に対してのみ従属させる。

{社員ID}→{部署コード}→{部署名}

db, sql

« [CakePHP]ページのタイトル変更について

Comments