对多值M:N关系进行建模的方法是什么?

时间:2016-05-23 14:14:42

标签: mysql

我正在研究需要多值M:N关系的项目。

例如。 Products表中有一个产品列表。 用户可以购买1个或多个产品,并保留在表Orders中。除了这些信息外,还有一个表可以维护分析信息。

此表应包含类似的硬编码数据。如果订单包含产品1和产品2,则产品3和产品4也按用户的顺序出现。这些基本上是硬编码规则

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

现在从这些表格中,我需要查找信息,例如用户的订单号1是否包含1和3等产品,然后返回2和4。

我需要有关如何描述这种多值M到N关系的建议。如果除了RDBMS之外还有其他任何选项可以随意建议。感谢

1 个答案:

答案 0 :(得分:0)

您可以创建另外三个表:

  • ProductSet(productset_id) - 存储产品集标题(样本中的一行)
  • ProductSetPart(productset_id,product_id) - 在您的案例列实际产品中存储所需的产品集
  • ProductSetAdditional(productset_id,product_id) - 存储预期的产品。

在发出订单后,我们可以检测出应该添加哪些附加产品。

编辑:添加样本

返回满足要求的集合列表的示例查询:

 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)