RDBで以下のようなテーブルがあります。


CREATE TABLE table_a (
id INTEGER,
table_b_id INTEGER FOREIGN KEY REFERENCES table_b(id),
table_c_id INTEGER FOREIGN KEY REFERENCES table_c(id),
);

CREATE TABLE table_b (
id INTEGER,
table_d_id INTEGER FOREIGN KEY REFERENCES table_d(id),
);

CREATE TABLE table_c (
id INTEGER,
table_d_id INTEGER FOREIGN KEY REFERENCES table_d(id),
);

CREATE TABLE table_d (
id INTEGER,
);

table_bとtable_cはお互い関連はないのですが、共にtable_dを参照しています。
また、table_aに所属するtable_bとtable_cのtable_d_idは必ず同じ値になります。
このようなテーブルはどのように正規化、もしくは設計変更すればよろしいでしょうか?

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2009/11/07 13:20:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:t-wata No.1

回答回数82ベストアンサー獲得回数13

ポイント27pt

この情報を見る限りでは、十分に正規化されてますね。やるとすれば非正規化でしょう。

もしくはA->Dのリレーションがあるということなので、そのテーブルを追加するか。

いずれにせよ用件によりますね。今のままで何か問題があるんですか?

id:mitsu1986

気分の問題かもしれませんが、table_bとtable_cのtable_d_idが異なる可能性を排除したいんです。

2009/10/31 19:43:16
id:matsubobo No.2

回答回数20ベストアンサー獲得回数3

ポイント27pt

外部参照が全て1対nの関係であれば、これ以上正規化はできないです。

id:mitsu1986

やりたい事はは上の回答に対する返答なのですが、

たしかに全て1対nの関係なので難しいですよね……

2009/10/31 19:45:54
id:sirotugu40 No.3

回答回数449ベストアンサー獲得回数14

ポイント26pt

table_d が必要ないはずですが・・・

  • id:matsubobo
    > 気分の問題かもしれませんが、table_bとtable_cのtable_d_idが異なる可能性を排除したいんです。
    質問文では言及されていない要件があるようですね。もっと踏み込んだ回答が必要な場合は、概念の説明をしていただく必要があります。

    現在、開示されている情報だけですとtable_bとtable_cのtable_d_idが異なっていることになんら問題無いと思いますよ。
  • id:matsubobo
    以下の仮定が成り立つならば、テーブルb,c,dを1つにできます。
    d:b=1:1
    d:c=1:1

    この場合、以下のようになります。
    a:
    - id
    - bcd_id -> bcd.id

    bcd:
    - id
    - b_id
    - c_id

  • id:mitsu1986
    >また、table_aに所属するtable_bとtable_cのtable_d_idは必ず同じ値になります。
    ここで言及したつもりでしたが……なんか勘違いさせたみたいで申し訳ないです。

    あと、
    b:d=1:N
    c:d=1:N
    a:b=1:N
    a:c=1:N
    なので、1つにはまとめられないです。
  • id:t-wata
    > 気分の問題かもしれませんが、table_bとtable_cのtable_d_idが異なる可能性を排除したいんです。

    それはデータベースの制約でできることじゃないですね。トリガでやるか、業務アプリ側でやるか。
    もし制約でやるとしたら、table_bやcに対して、table_d_idを更新するようなクエリも
    (table_aのなんちゃら制約違反によって)エラーにしないといけないわけで、こういう制約は無いです。
    (察するにこのような更新は、業務用件的には無いのでしょうが、データベース側はそんなこと知りませんので)

    もし設計変更でこれを克服したいなら、table_aに、table_d_idを付与し、table_b, table_cからtable_d_idを削除するしかないです。
    しかしこれだと第二正規形になり、データベースの教科書にでてくるような問題が発生します。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません