1

次のような2つのテーブルがあるとします。

products:       id, name
                  (PK = id)
product_group1: product_id
                  (PK = a1_id)
                  (FK = a1_id REFRENCES a1)
product_group2: product_id
                  (PK = a1_id)
                  (FK = a1_id REFRENCES a1)
product_group3: product_id
                  (PK = a1_id)
                  (FK = a1_id REFRENCES a1)

approved_products問題は、 group1とgroup2(group3ではない)の製品のみを受け入れるというテーブルを設計したいということです。

どうすればそのようなテーブルを設計できますか?(私はmysql BTWを使用しています)

4

3 に答える 3

1

トリガーレベルまたはアプリケーションレベルのいずれかでロジックを挿入しないと、現在の設計でこの問題を解決することはできません。 FOREIGN KEY■複数のテーブルを参照することはできません(製品グループごとに1つのテーブルを使用するように設計されていることを理解しています。間違っている場合は、お知らせください)。さらに、条件付きロジックを含めることはできないため、単一のテーブルがある場合でも、そのテーブルからのG1およびG2レコードのみを許可するをproduct_groups作成することはできません。FOREIGN KEY

標準のリレーショナル整合性制約を使用してこれを実現するには、グループ1またはグループ2にある製品をapprovable_products含むようなものと呼ばれる追加のテーブルが必要になります。product_ids

于 2012-10-17T14:46:42.113 に答える
1

必要なのは、「負の」外部キー制約です。つまり、このテーブルに存在する製品IDを拒否します。

ただし、それは不可能です。グループ1と2のIDのみを含むそのようなテーブルを自分で維持する必要があります。そのためにトリガーを使用できます。その後、そのテーブルを外部キー参照テーブルとして使用します。

于 2012-10-17T12:05:38.890 に答える
1

その「ルール」が存在しなかったかのようにテーブルを設計する必要があります(なぜなら、それに直面すると、最終的には変更される可能性があるためです)

次に、他のメカニズムを使用してこの制約を実装できます。データベースレベルで実行する場合は、テーブルでbefore insertトリガーを使用するか、データを検証する関数を呼び出す列をチェックすることができます。しかし、なぜあなたのアプリケーションでそれをしないのですか?それは私にはビジネスルールのように思えます。

于 2012-10-17T12:20:54.320 に答える