質問: チーム補佐-チーム.チームコード; ``` 結果 社員ID チームコード チーム補佐 ----- ---------- --------- 000A 001 123W 000A 001 456W (以下略) SQLの結果をよく見てください。 「あれ、元のテーブルよりレコード数が増えている」 そう、この結果には、存在してはならないレコードまで含まれてしまっているのです。これはつまり、「社員-チーム-補佐」の間に、現実には存在しない関連が表現されてしまっている、ということです。 このようにして得られる結果というのは主キーに対して一意性が保証されないため、よくないものだというのはわかるのですが、内容的には問題ないように思えます。 チームコード001で表されるチームというのは123W、及び456Zという二人のチーム補佐がいるわけで、表している内容自体には問題がないと思います。 よって、この結合によって得られた結果のテーブルは、主キーに対して一意性がない、という問題があるためにいけない、ということなのでしょうか? 回答お願いします。
回答: ### 失われた制約 社員-チーム-リーダー表には以下の制約がありました。 制約(Boyce/Codd正規化により失われた) {社員ID、チームコード} -> {チーム補佐} 一つのチームに所属する社員を担当する**「チーム補佐はただ一人だけ」**である。 表を分割する際にこの制約が失われたのです。 したがってBoyce/Codd正規化は無損失分解ではなく、2つの表を結合すると、 {チームコード}を介して、{社員ID} と{チーム補佐} の直積が現れます。 社員IDは001と001Fがあるので直積の意味がわかると思います。 失われた制約はプライマリキー制約(DDL)ではもはや表せないので、プログラム処理(DML)で補わなければなりません。 ・アプリケーションロジック ・トリガー ・SQLのexists制約 ・その他のプログラム処理 ### 参考書 増永良文 『リレーショナルデータベース入門 [新訂版]』2003/3 サイエンス社