2012-02-01 15 views
1

私は、次のモデル(主キーIDのに焦点を当て、他のすべてのフィールドを残して簡素化)を持っている:SQLモデル/スキーマ設計、チェック制約、FKまたはテーブル再設計?

[invoice] 
invoice_id 
customer_id 
invoice_description 

[customer] 
    customer_id 
    company_id 
    customer_name 

[company] 
company_id 
company_name 

[strategy] 
strategy_id 
strategy_descripton 

同社は順番にその顧客に属する多くの請求書を持つことができ、多くの顧客が含まれています。

上記には記載されていませんが、私はまた、企業(および1つの会社のみ)に属する戦略のリストを持ちたいと考えています。

私は、顧客、請求書、会社が、自分が所属する会社の戦略を参照する「デフォルト戦略」を定義できるようにしたいと考えています。

私はstrategy_idという別のFKフィールドを各テーブル(請求書、顧客、会社)に入れることができますが、変更が行われた場合(誰かが別の会社に戦略を移そうとする)別の会社の戦略リストに属する戦略を指しているインボイスや顧客で終わることはありませんか?

どのように私はこれに対処する必要がありますか?これをビジネスロジックでチェックするか、チェック制約を使用する必要がありますか、これはテーブルの再設計と外部キーを使って達成できますか?

事前に多くのおかげで、

クリス

答えて

0

会社が彼らの戦略を変更した場合、会社に属している顧客や請求書は、その戦略を変更した場合、あなたは気にしてください。

例:company1にstrategy1がある場合。これにはcustomer1、customer2(invoice1を持つ)があります。次に、company1がstrategy2に請求書を変更した場合、customer1、customer2、invoice1がstrategy2またはstrategy1に属していればOKです。

それは問題ではない場合

は行います

  • は、会社のテーブルに制約を追加します。顧客/請求書の戦略をチェックするには、親会社を見つけてその戦略をチェックします。

そうでなければ、それは問題でない場合:

  1. は、会社のテーブルに制約を追加し、会社に子顧客/請求書は、(それらが存在するかどうかを確認)が属している場合は、それを変更することはできません。
  2. 上記のように各テーブルに制約を設定します。

もっと具体的な回答が必要な場合は、明確にする必要があります。

+0

感謝を。 はい、誰かが使用中に別の会社に戦略を変更しようとした場合、これは許可されないことが重要です。 上記のことを達成するためのSQL制約条件/コードのリンクがあれば、通常はビジネスロジックレベルでしかチェックしていませんが、最近では、アプリケーションが奇妙な状態データベースでは有効ですが、エンティティモデルでは無効です。 あなたは私の質問に上記に感謝しました、ありがとうございます。 – g18c

+0

私は助けてくれると嬉しかったです。これ以上質問があれば。 :) – Kyra

+0

最終的な1つの明確化/質問、ビジネスロジックレイヤーでもこれらの制約をチェックするのは正しいですか(SQLバックエンドでEntityFrameworkを使用しています)、または処理するデータベースのままにしておきますか?私は仕事の複製や、さまざまな場所でのルールの実装を避けたいと考えています。 – g18c

0

私が正しく理解していれば、すべての企業が多くの戦略を持ち、すべての戦略が1つの企業に属していることになります(企業と戦略の関係が1:n)。また、すべての企業にとっての1つのデフォルト戦略も、すべての顧客とその請求書のデフォルト戦略です。

あなたは(いくつかの戦略がデフォルトです)[strategy]テーブルと1:1関係にあるもう一つのテーブル[company_default_strategy]を追加することで、外部キー制約として、これらの制約を定義することができます。迅速な応答を

[invoice] 
invoice_id  PK 
customer_id FK to customer(customer_id) 
invoice_description 

[customer] 
customer_id PK 
company_id  FK to company(company_id) 
customer_name 

[company] 
company_id  PK 
company_name 

[strategy] 
strategy_id PK 
company_id  FK to company(company_id) 
strategy_descripton 

[company_default_strategy] 
company_id  PK, FK1 
strategy_id FK1 
    FK1 (strategy_id, company_id) to strategy(strategy_id, company_id) 
関連する問題