「一般的には、第3正規形まででよい」の根拠は何か?(3)
前回までのまとめ
- 自分には正規化理論の再入門の必要が。いろいろ考え違いをしているので正さなくてはならない。
- 勘違いの一例。
- ×「BC正規形を第4正規形に分解して自然結合すると、それまで存在しなかった行が出現することがあるので、分解しない方がよい」
- ○「どのように分解して自然結合しても、それまで存在しなかった行が出現するならば、そこには多値従属性がない。つまり、もともと第4正規形だった」
- 非第4正規形の表をテーブルとして実装するのは、およそあり得ない。非第4正規形であるということは、2つの異なる概念の直積にすぎないということ。この点に限って言えば「第3正規形までで十分」なわけがない。
推移的関数従属性の勘違いを正す=サロゲートキーの導入は非正規化ではない
もう一つ勘違いを発見した。
例えば商品コードを商品マスタのPRIMARY KEYにして、いろんなテーブルで商品コードをFOREIGN KEYにしていると、現実世界で商品コードの振り直しがあった場合、すごい面倒なことになる。
そこで、現実世界に誰にも認知されていない連番などのサロゲートキーをPRIMARY KEYとし、外部キー参照はその連番に対して行うことで、現実世界の変更に強いデータ構造にする。
で、このサロゲートキーは、正規化理論から見ると、一種の非正規化になるのだと、昨日まで思っていた。
なぜなら、
完全正規形である商品マスタに、
商品マスタ { 商品コード(PK), 商品名, 単価 }
サロゲートキーを導入すると、
商品マスタ { 商品ID(PK), 商品コード(UNIQUE), 商品名, 単価 }
商品ID --> 商品コード --> 商品名
商品ID --> 商品コード --> 単価
という推移的関数従属が発生し、第2正規形になってしまうから ... と。
非正規化しても更新時異状が発生しないのはなぜだろう、とずっと疑問に思っていた。
で、推移的関数従属の定義を調べなおすと、やっぱり勘違いしてました。
正確な定義はこう:
X,Y,ZをリレーションスキーマRの異なる属性とする。Rには次の3つの制約が成立しているとする。 X ---> Y Y -/-> X Y ---> Z すると、これから次の2つの制約が成立する。 X ---> Z Z -/-> X このような時、ZはXに推移的に関数従属するという。
商品マスタにサロゲートキーを導入した場合は、上記の「Y -/-> X」を満たさない、つまり
商品ID --> 商品コード
商品ID <-- 商品コード
なので、推移的関数従属とは呼ばない。
またこの時、これ以上分解しなくても更新時異状は発生しない。
ということは、完全正規形のテーブルにサロゲートキーを追加しても、完全正規形のままだということ。
整理すると
整理すると、
×「推移的関数従属を放置しても更新時異状が発生しない場合がある」
○「放置しても更新時異状が発生しないなら、それは推移的関数従属ではない」
更新時異状が起きる条件は何か
なんというか、話が細かすぎるので、もうちょっと大枠で理解したい。
正規化の目的は、更新時異状の解消のため。
では、更新時異状が起きる条件は何かというと、俺理解では、1つのテーブルに複数の事実を収容している時。
ある本に、非第3正規形の例としてこんな社員マスタが載っていたが、
社員マスタ { 社員番号, 社員名, 所属支店, 支店所在地 }
ここには「社員の存在」と「支店の存在」という2つの事実が混在しているがために、追加・更新・削除時に更新時異状が発生しうる。
なので次のように第3正規形に分解することになっている。
支店マスタ { 支店コード, 支店名, 支店所在地 } 社員マスタ { 社員番号, 社員名, 所属支店コード }
ところで、分解後の社員マスタには1つの事実だけが収容されていると言えるのだろうか。
T字形ER手法では、この社員マスタには「配属」というeventが混入していると見なす。で、所属支店コードを社員マスタに置くのは「愚行」とされている。
「配属」という別の事実が混入しているのに、更新時異状が起きない理由は、所属支店コードがnull値可能であるから。
仮にNOT NULL制約があるのであれば、配属の決まっていない社員を登録できない、という問題が生じる。
つまり、教科書的な正規化は、null値を許容せざるを得ない。
nullの何がいけないのか、なぜCodd自身が"Fatal Flaws in SQL"とまで言っているのか、いまいち身にしみて感じることができていない。
ここも整理しなくてはならない。
今回のまとめ
やっぱり、完全正規形じゃなければ更新時異状があるし、更新時異状があるならそのテーブルは multi facts in 1 place になっているのではないか。だったら、常に完全正規形まで分解せざるを得ないのではないか。「第3正規形まででよい」わけがないのではないか。