正規化について

2021/05/08に公開

正規化とは

  • データベースで保持するデータの冗長性を排除し、一貫性と効率性を保持するためのデータ形式のこと
  • 第5正規化まで存在する(業務レベルでは第3正規化までが多い)

冗長性

  • 一つの情報が複数のテーブルに存在していること

非一貫性

  • 冗長なデータの保持により、データの更新ができないテーブルが発生したり、更新処理のタイムラグにより、データの不整合が発生する、などのこと

第一正規化

  • 第一正規化の定義は、テーブルの一マス(セル)には一つの値しか含まない
  • つまり、リレーショナルデータベースのテーブルは、常に第一正規化を満たす形になっている
  • 一つのセルに一つだけ値が含まれているとき、その値のことをスカラ値と呼ぶ

第二正規化

  • テーブル内で部分関数従属を解消し、完全関数従属のみのテーブルを作ること

    • 部分関数従属

      • 主キーの一部の列に対して、従属する列がある場合
      • 「会社コード」と「社員ID」の主キーを持ち、「会社名」は「会社コード」に従属している
    • 完全関数従属

      • 主キーのすべての列に従属性がある場合
  • つまり、異なるレベルの実体を、きちんとテーブルとしても分離すること

  • 第二正規化を行うことで防げること(第二正規化が行えていない社員テーブル参照)

    • 同じ会社コードを持つ会社名が異なる可能性
    • 社員情報が不明な会社を登録できない可能性

第二正規化が行えていないテーブル例(社員テーブル)

会社コード 会社名 社員ID 社員名 年齢
C0001 〇〇会社 0000 鈴木 30
C0002 △株式会社 0001 山田 35

第二正規化を行う

  • 第二正規化の方法はテーブルの分割

社員テーブル

社員ID 社員名 年齢
0000 鈴木 30
0001 山田 35

会社テーブル

会社コード 会社名
C0001 〇〇会社
C0002 △株式会社

第三正規化

  • テーブル内の推移的関数従属を解消すること

    • 推移的関数従属
      • テーブル内部に存在する段階的な従属関係
      • 「部署コード」に従属する「部署名」を「社員ID」から見たときの従属関係。
        • 「社員ID」→「部署コード」→「部署名」
    • 同一テーブルで推移的関係従属が存在していると、データ登録の不都合がある
      • 例えば、上記例の場合、社員の存在しない部署は、データ上も存在しないことになる。

第三正規化が行えていないテーブル例(社員テーブル)

社員ID 社員名 年齢 部署コード 部署名
0000 鈴木 30 D01 経理部
0001 山田 35 D02 営業部

第三正規化を行う

  • 第二正規化と同様にテーブルの分割を行う

社員テーブル

社員ID 社員名 年齢
0000 鈴木 30
0001 山田 35

部署テーブル

部署コード 部署名
D01 経理部
D02 営業部
D03 企画部

正規化のポイントは3つ

  • 更新時の不都合・不整合を排除するために行う
  • 正規化は従属性を見抜くことで可能になる
  • 正規形はいつでも非正規系に戻せる

参考文献

達人に学ぶDB設計徹底指南書

Discussion