创建“多对多”关系的常用方法是什么?

时间:2011-12-01 11:17:29

标签: sql database many-to-many

我有2个表Product,其中包含商店的产品,ProductStatus表示产品是否是新产品,销售商等。一个产品可能有很多种状态。

我需要链接产品和状态。我想了两个方法:

  1. ProductId ProductStatusId
  2. 匹配的第3个表ProductToStatus添加
  3. Status列添加到Product表,其中包含以逗号分隔的状态ID(“4,12,34,”);
  4. 上述每个解决方案的优缺点是什么,或者还有另一种常见方法可以做到这一点?

5 个答案:

答案 0 :(得分:5)

第一种方式是正确的,更常见。用于建模多对多关系的表称为连接表,关系表或联结表,以及其他名称。

你提出的第二种方式的主要冒险是:

  • 更快的数据库操作 - 例如,如果要查找具有特定状态的所有产品,使用连接表的查询将很快创建正确的索引,而您提出的第二种方式将意味着搜索给定的子字符串每件产品(都会很慢)。
  • 约束检查 - 您可以将ProductIdProductStatusId列声明为外键,数据库将阻止您为产品分配不存在的状态。

连接表的主要缺点是添加/修改产品的代码可能有点难以编写,因为您需要操作更多的数据库记录。幸运的是,现代ORM框架负责幕后的所有工作。

答案 1 :(得分:3)

选项1是目前为止更好和最常用的,因为您可以使用外键设置链接表(ProductToStatus)来保持数据的完整性。

答案 2 :(得分:2)

第二种方法听起来很笨拙。你将如何对这种模型进行查询? 第一种方法是正确的,这就是人们通常的模型。

答案 3 :(得分:1)

为了模型,应该使用备选方案1。备选方案2是一个丑陋的解决方法。

如果你使用替代品2,你甚至无法制作FK。

答案 4 :(得分:0)

选项2的问题是您的新数据结构与SQL的运算符不兼容。例如,值"4,12,34,"应该被视为与"4,34,12,"相同:在没有能够超载SQL运算符的情况下,您需要a)编写用户定义的函数并且b)训练用户使用UDF而不是SQL运算符。对每个操作员重复。

这同样适用于约束。例如,您需要阻止值"4,12,4,",因为它包含重复的成员。同样,您需要推出自己的约束,可能是使用SQL CHECK约束。

在编写这些操作符和约束的过程中,您总是需要拆分成员,操作符,然后再连接它们。哪个会提出这个问题:为什么不把它们分开?然后我们回到选项1!