2009-08-11 5 views
1

私にはレンタル事業のモデリング用のデータベースがあります。データベースには複数のサプライヤ(所有者)の情報が格納され、各サプライヤにはデポのサブセットがあります。各デポは特定の日に閉鎖されているものもあれば、その土地に特有のものもある(毎週土曜日や感謝の気持ちで一週間閉まっているかもしれない)、そして他のものはグローバルである(すべてのデポはクリスマスクリスマスである。 。このモデルは、このこれをリレーショナルデータベースでどのようにモデル化できますか?

私が最初に考えたのは、次のようにDepotClosedテーブルを持っていることでした。これで

depotclosed 
    id (PK) INT 
    start_date DATE 
    end_date DATE 
    display VARCHAR 
    global BOOLEAN 
    depot_id (FK) 

私の問題は、それが世界的な休日だときdepot_idはnullになりますということですが、それは「未定義」ではありません、休日はすべての倉庫のためだけです。私は、私がすべきであるよりも、これ以上の取引をしているかもしれません。どんな考えも大歓迎です。

ありがとう

答えて

1

この構造は問題ないと思います。グローバルが真であるすべての行を選択することができます。これは、1つのストアのクローズされた日付を検索する2つのクエリ、1つのストアのすべてのクローズド日付、すべてのグローバルなクローズド日付を検索する2つのクエリに変換されます。あなたは、各店舗のためにグローバル日付エントリを入れないようにするという正しい考えがありました。これを変更する必要がある場合は苦痛になります。

+1

Vinceさん、ありがとうございます。選択*デポからINNER JOINデポクローズドON(depot.id = depotclosed.depot_idまたはdepotclosed.global = TRUE) – Shane

1

私の好みは、すべてのデポのクロージャを明示的に記録することです(つまり、デポごとにそのdepotclosedテーブルに行を追加します)。そうすれば、あいまいさはなく、表に対して普通のJOINを実行できます。

また、depot_idを空白のままにして(つまり、NULL)、デポが表示されていない場合はすべてのデポに適用されます。私はそれが受け入れ可能な解決策であることを見つけるだろう

SELECT things 
FROM depot 
INNER JOIN depotclosed ON (depotclosed.depot_id = depot.depot_id OR depotclosed.depot_id IS NULL) 
+1

この問題を解決するために、データの完全性の影響が私を驚かせます。たとえば、新しいデポが追加された場合、各グローバル休日にそのデポの行を追加する必要があります。 – JoshJordan

0

:この方法では、しかし、あなたはこのようなJOINの何かを書く必要があるだろう。ちょうどあなたのアプリケーションロジックは、常にこれまでdepot_idをチェックする前グローバルブール値をチェックしていることを確認してください。また、FKとしてdepot_idの値を必要とする制約がないことを確認してください。

グローバル休日のテーブルとローカル休暇のテーブルを作成し、グローバルブール値を差し引いたものです。これは、アプリケーションで同じタイプのチェックを必要とするので、どちらの方法でも問題ありません。

0

はどのように多くのデポあなたは合計で期待していますか?答えが100のようなものであれば、普遍的な休日の場合は各デポの表に行を入力するだけでよいでしょう。それはスペースを無駄にするが、実際には時間を節約するかもしれない。

グローバルエントリをテストする余分なロジックを必要としないため、特定のdeoptに対して実行する必要があるクエリは本当に簡単です。

+0

おそらくちょうど100のデポの内気になるでしょう – Shane

関連する問題