3-5 第2正規化 〜部分関数従属
まずは第2正規化をするために必要な用語の理解
完全関数従属
主キー以外の他のすべての列が、主キーに従属していること
部分関数従属
主キー以外のどれかしらの列が、主キーの一部の列に従属していること
例
社員テーブル
https://scrapbox.io/files/687a11f762e7e68c3a462cd4.jpg
主キーは、会社コードと社員ID
部分関数従属は、{会社コード} → {会社名}
第2正規化の目的
部分関数従属を解消し、完全関数従属にすること
第2正規化を行う
部分関数従属を解消する手順は決まっていてテーブルの分割
部分関数従属の関係にあるキー列と従属列だけ、独立のテーブルにすれば良い
完全関数従属の例
https://scrapbox.io/files/686e39bb5347e5c8faa146ed.png
第2正規化でないと何が悪いのか?
第2正規化前のテーブルを参考にする
1️⃣ 主キー列の値が不明(NULL)だと、他の列の値を決めることができない
例えば、社員IDが不明の会社があったときに、テーブルに会社名を登録できない
社員IDにダミーデータを入れて回避もできるが、それは根本解決ではない
2️⃣ 同じ値であって欲しい列の組み合わせが、レコードによってマチマチになる
会社コード:C0001・会社名:A商事と、会社コード:C0001・会社名:A商社の、間違ったデータが登録される
データベース側でこれを防止する方法はなく、アプリケーション側でロジック担保しないといけない
第2正規化後のテーブルだと、1と2の問題は発生しない
言ってしまえば、第2正規化は異なるレベルの実体(エンティティ)を、テーブル分割すること
無損失分解と情報の保存
第2正規化分割前のテーブルに戻せなくなることはない
こういった操作を可逆的(reversible)という
可逆的な操作ができるのは、第2正規化によって失われる情報がないから
情報を完全に保存したままテーブル分割できることを無損失分解という
SQL文で内部結合すれば元に戻せる