请先阅读上一个问题:T-SQL finding of exactly same values in referenced table
这个question的主要目的是找出这种存储数据的方法是否有效。
也许最好摆脱PropertyValues
表。并在PropertyValues nvarchar(max)
表中使用其他Entities
列而不是它。例如,而不是
EntityId PropertyId PropertyValue
1 4 Val4
1 5 Val5
1 6 Val6
表格,我可以将这些数据存储在PropertyValues
列中:“4:Val4;5:Val5;6Val6
”
作为替代方案,我可以将XML存储在PropertyValues
列....
您如何看待这里的最佳方法?
[ADDED] 请记住:
[ADDED] PropertyValues表中的数据将经常更改。实际上,我存储配置的产品。例如,admin配置衣服具有“类型”,“大小”,“颜色”,“按钮类型”,“标签类型”,“标签位置”等属性...用户将从系统中选择这些属性的值。因此,PropertyValues数据无法有效缓存。
答案 0 :(得分:3)
如果您使用多值属性(即4:Val4;5:Val5;6Val6
)实施解决方案,您将会讨厌自己。
XML稍微好一些,因为有XQuery函数可以帮助您提取和解析值。但是XML类型在SQL Server中实现为CLR类型,并且使用起来非常慢。
这个问题的最佳解决方案就是你拥有的。如果列可以是任意数量的数据类型,请使用sql_variant
类型。理想情况下,您可以将其重构为多个表/实体,以便数据类型可以更具体。
答案 1 :(得分:2)
我使用类似的项目(网店生成器)。因此,每个产品都有属性,每个属性都有一组值。这是不同的表。对于所有这些,有几种语言的翻译。 (因此存在用于属性和值转换的附加表)。
为什么我们选择这样的解决方案?因为每个客户端都应该有相同方案的数据库。所以这样的数据库方案非常有弹性。
那么这个解决方案呢?一如既往,“它取决于” - ))
所以回答你的问题并不简单。如果准备具有未知属性和值的弹性方案,则应使用不同的表。我建议你记住将值存储在CSV字符串中。最好将其存储为XML(键入和索引)。
<强>更新强>
我认为,如果与用户订单进行比较,PropertyValues不会经常更改。但是如果你怀疑,你应该使用非规范化表或索引视图加速。无论如何,在大量行上更改XML / CSV将会有很差的性能,因此“单独的表”解决方案看起来不错。
答案 2 :(得分:1)
SQL客户咨询小组(CAT)有一份专门为您编写的白皮书:Best Practices for Semantic Data Modeling for Performance and Scalability。它经历了EAV建模的常见缺陷,并建议如何设计可扩展的EAV解决方案。