2016-05-23 2 views
1

私は多値M:Nの関係を必要とするプロジェクトに取り組んでいます。多値M:N関係をモデル化する方法は何ですか?

たとえば、 Productsテーブルに製品の一覧があります。 ユーザーは1つ以上の製品を購入することができ、テーブルOrdersに保持されます。この情報に加えて、分析情報を保持するもう1つのテーブルがあります。

この表には次のようなハードコードされたデータが含まれている必要があります。注文に商品1と商品2が含まれている場合、商品3と商品4もユーザーの注文で表示されます。ユーザーの注文番号1は、1と3のような製品は、その後、2と4

を返さなかった場合、私はするよう提案を必要とするように、これらは基本的にハードコーディングされたルール

actual products | expected products 
1,3    | 2,4 
5,6,7,8   | 3,4 

は今、これらの表から、私は情報を見つけるために必要がありますこの多値M対Nの関係を記述する方法。 RDBMS以外のオプションがある場合は、お気軽にお問い合わせください。おかげ

+0

をあなたが(HTTPS [推奨エンジン]を記述しようとしています.org/wiki/Recommendation_engine)、またはこれらのルールは、ユーザーが注文を有効にするために満たす必要がありますか? – eggyal

+0

@eggyalあなたはこの問題を説明する正しい言葉を持っています。ええ、それは間違いなく推薦エンジンのようです。ユーザーの注文が有効であるためには、これらのルールは真実であってはなりません。 –

答えて

0
次の3つの追加のテーブル作成でき

  • ProductSet(productset_id) - 商店製品は(あなたのサンプルから1列)のヘッダーを設定します
  • ProductSetPart(productset_id、PRODUCT_ID) - 必要な店舗のセットを作るための製品、あなたの場合の列実際の製品
  • ProductSetAdditional(productset_id、product_id) - 予想される製品を格納します。

注文をいただきましたが、追加する製品を追加する必要があります。

EDIT:サンプルが要件を満たしているセットのリストを返す

例のクエリを追加://en.wikipedia:

SELECT psp.productset_id FROM 
    ProductSetPart psp LEFT JOIN 
    OrderLines ol 
ON 
    psp.product_id=ol.product_id 
GROUP BY 
    psp.productset_id 
HAVING 
    -- trick - COUNT(*) will return count of all products required by aggregatet set 
    -- COUNT(psp.product_id) will count only not null products 
    -- (which will be null if they aren't in order line) 
    -- so if all product sets are in order line then we know, 
    -- that this set requirements are full filled 
    COUNT(*) = COUNT(psp.product_id) 
+0

私は実際にこのデザインについて以前考えました。私が持っていた唯一の問題は、ProductSetPartから行を取得する方法でした。注文表にはproduct_idがあり、product_set_idはありません。では、どのようにしてProductSetPartからデータを取得するのか? –

+0

COUNTの小さなトリックを使用するサンプルクエリを追加しました。 – mjpolak

+0

ご返信遅れて申し訳ありません。しかし、このクエリは期待される結果を与えません。 http://sqlfiddle.com/#!9/1a441/13 –

関連する問題