我有2个表Product
,其中包含商店的产品,ProductStatus
表示产品是否是新产品,销售商等。一个产品可能有很多种状态。
我需要链接产品和状态。我想了两个方法:
ProductToStatus
添加
Status
列添加到Product
表,其中包含以逗号分隔的状态ID(“4,12,34,”); 上述每个解决方案的优缺点是什么,或者还有另一种常见方法可以做到这一点?
答案 0 :(得分:5)
第一种方式是正确的,更常见。用于建模多对多关系的表称为连接表,关系表或联结表,以及其他名称。
你提出的第二种方式的主要冒险是:
ProductId
和ProductStatusId
列声明为外键,数据库将阻止您为产品分配不存在的状态。连接表的主要缺点是添加/修改产品的代码可能有点难以编写,因为您需要操作更多的数据库记录。幸运的是,现代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!