Hos*_*sam 2 database performance normalization
我不是在询问索引还是分区,我在询问一个选择,在添加大号之间.列或将数据添加为行而不是.说明:我们目前有一个要求做出设计来处理多个属性和属性值对某些特定产品的产品可能会达到100万人次的纪录,并且每个产品可能有多个属性,因此对于ProductProperties表可能会达到数十亿美元.有些人想过将属性添加为ProductProperties表,Property1和value1,Property2和value2等中的列....如果产品不包含属性的值,则此属性的相关字段将为null.此外,他们还将添加大约80-100个属性,以便能够动态地覆盖各种属性.建筑师拒绝这种方法,因为这不是一个好的设计.任何人都可以告诉我如何达到良好的设计和良好的性能.谢谢
这个问题出现了许多伪装.在您的情况下,您似乎拥有一系列产品,每个产品可能具有不同的属性集.我认为您需要一种以可扩展的方式存储这些属性的方法,以便您可以向系统添加新产品.
方法1:行上的通用字段+补充元数据
通过将产品属性元数据规范化为自己的表,可以稍微修改您建议的第一种方法:
使用一些通用字段构建产品表(Code1,Code2,IntVal1,IntVal2,FloatVal1 ......)
构建一组辅助父子引用表ProductType
和ProductAttribute
(或某些此类引用表),其中包含产品表中哪些列包含哪些属性的指南.
构建功能以将其解释为应用程序的数据访问层.
这样做的主要优点是结构有效查询.缺点是product
没有补充元数据,表的内容是不透明的.然而,其他方法的低效率和复杂性通常从根本上超过了这个缺点.
如果不同产品类型的数量相对较小,您还可以使用元数据生成解释元数据的产品表上的视图或一系列视图.这减轻了很多不透明度的问题.
另一个优点是在产品上具有多个筛选条件的查询不必针对非常大的子表执行多个连接.如果表上的各个字段可以为空,则每个字段的开销相对较小(通常每列一个字节,具体取决于平台).未使用的字段将在记录上浪费大量空间.
方法2:实体属性值
这通常被认为是解决这类问题的方法.在这种情况下,你必须Product
和ProductAttribute
在与对产品类型的过滤器产品属性类型的一些参考数据父子关系表.
这种方法看起来在概念上是优雅的并且是可扩展的,但是查询并且占用相当多的磁盘空间是非常低效和低效的.某些数据库设计黑客可以在各种平台上使用,以缓解性能问题.您尚未指定您正在使用的DBMS平台,因此很难为您指明正确的方向.EAV结构的主要优点和缺点是:
无需灵活,无需更改数据库schena(+)
查询效率低且繁琐,特别是如果您想要按多个属性进行过滤( - )
更多磁盘空间使用.( - )
除非您有令人信服的要求,否则不建议使用EAV结构.
方法3:XML字段
用Fredrick Lundh的话说:'现在你有两个问题'.XML字段是无限可扩展的 - 您可以将任何您想要的内容放入其中,但它们对您的应用程序以外的任何内容都是不透明的,并且它们查询速度慢而且繁琐.从SQL查询中的XML字段中获取数据比存储在列上的数据要多得多.
通常,在数据库中使用XML字段来存储非本质上是XML文档的东西是个坏主意.许多人写过关于在数据库中滥用XML字段的不明智之处.我建立ETL过程以从XML字段中提取数据的个人经验使我同意.除非你有令人信服的理由,否则最好避免.
结论
方法1类似于您最初提出的方法,但将列元数据移动到其自己的结构中.即使它看起来不优雅,但几乎在所有情况下它都是最好的方式.
归档时间: |
|
查看次数: |
931 次 |
最近记录: |