- - PR -
1対1関連のテーブル設計について
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-03-24 03:55
お世話になります。
テーブル設計についてご意見をお聞かせください。 【環境】 HSQLDB 1.8.0 次の2つのテーブルがあり、 カテゴリ(CATEGORY)テーブルと商品(ITEM)テーブルは1対多の関係です。
これに次の要件を加えたいと思っています。 ・1つのカテゴリに最大1つの商品を「注目商品」としてマークすることができる。 そして、次のような画面の表示を考えています。
この場合、注目商品かどうかをどのようにテーブルで表現するのがよいのでしょうか? 【案1】 ITEMテーブルにその商品が注目商品かどうかを示すカラム(boolean型)を設ける。 ただ、この方法だと「1つのカテゴリに最大1つの注目商品」という要件を DBの制約で保証できない。 【案2】 CATEGORYテーブルにITEMテーブルへの外部キーであり、 nullableなカラム(NOTICE_ITEM_ID)を設ける。 ただこの場合、双方のテーブルが互いに外部参照することになる。 このような構造はおかしいのか? 【案3】 次のような中間テーブルを設ける。
まとめますと、 (1)【案2】のように相互に外部参照する構造はありえないのでしょうか? (2)要件を満たすには【案3】を採用すべきなのでしょうか? それとも別のテーブル構造をとるべきでしょうか? ご意見よろしくお願いします。 | ||||||||||||
|
投稿日時: 2008-03-24 07:51
案2でしょうね、案3は案2とほぼ同じことをしてます。
おかしくありません。問題ないです。 | ||||||||||||
|
投稿日時: 2008-03-24 08:37
HSQLDBについて詳しくないですが、、、
のような重複禁止の複合インデクス(マルチカラムインデクス)を定義すればいいの では? | ||||||||||||
|
投稿日時: 2008-03-24 12:05
「案2」は、「1つのカテゴリに最大1つの商品」という制約をカテゴリーが管理するために、カテゴリが商品を参照していると考えることができます。ですから、カテゴリと商品が相互に参照しあうのは特に問題ではないと思います。 「案1」も、外部制約としては参照はないかもしれません。しかし、DB上での制約であってもアプリケーションでの見かけ上の制約であっても、そういう制約をかける以上、暗に参照があるとみなすほうが良いかもしれません。 | ||||||||||||
|
投稿日時: 2008-03-24 12:42
「最大1つ」という要件が今後も守られるなら案2、増えそうなら案1。
注目商品にその他の情報(期間とか)が必要なら案3が良いと思います。 | ||||||||||||
|
投稿日時: 2008-03-24 13:08
私なら「案1」です(暗黙的に制約があると同じ意見です)
しかも「注目商品」はかなりゆるい仕様だと思います。 (もし突っ込むだったら、 誰が決めるねん! 複数あったらあかんのか! 私こっちの方がおすすめ!) | ||||||||||||
|
投稿日時: 2008-03-24 15:23
疑問に思っていることがあったので、便乗して質問してみます。
最大1つだったら案2と3はほぼ同じなんでしょうが、今週の注目ランキングみたいな1対多の順序付きリストにする場合は、案2を拡張してNOTICE_ITEM_IDSでIDリストをあらわすデータを格納したのでよいのでしょうか? 1対多で多が100とかの場合、中間テーブルを作った場合、元のテーブルより巨大な中間テーブルになって、スピードの点でも問題があるような気がしているのですが。 (それをやめただけで2倍のスピードになったので) ということで私は案2してます。 | ||||||||||||
|
投稿日時: 2008-03-24 17:41
複数(100個とか)ある場合でも、案2を使うということですか? NOTICE_ITEM_ID1、NOTICE_ITEM_ID2、NOTICE_ITEM_ID3… 違ってたらすみません。 |
1|2|3
次のページへ»