Sql server 存储属性可能不同的数据的最佳方法

Sql server 存储属性可能不同的数据的最佳方法,sql-server,Sql Server,请先读我前面的问题: 其主要目的是了解这种存储数据的方法是否有效 也许最好去掉propertyvalue表。并使用实体表中的其他属性值nvarchar(max)列代替它。例如,而不是 EntityId PropertyId PropertyValue 1 4 Val4 1 5 Val5 1 6 Val6 表中,我可以将此类数据存储在propertyvalue列中:“4:Val4;5:

请先读我前面的问题:

其主要目的是了解这种存储数据的方法是否有效

也许最好去掉
propertyvalue
表。并使用
实体
表中的其他
属性值nvarchar(max)
列代替它。例如,而不是

EntityId  PropertyId  PropertyValue
1         4           Val4
1         5           Val5
1         6           Val6
表中,我可以将此类数据存储在
propertyvalue
列中:“
4:Val4;5:Val5;6Val6

另外,我可以将XML存储在
PropertyValues
列中

你认为这里最好的方法是什么

[补充] 请记住:

  • 属性集必须是可自定义的
  • 对象将有几十个属性(大约从20到120)。数据库将包含数千个对象
  • [补充]
    PropertyValues表中的数据将经常更改。实际上,我存储配置的产品。例如,管理员配置衣服具有“类型”、“大小”、“颜色”、“按钮类型”、“标签类型”、“标签位置”等属性。。。用户将从系统中选择这些属性的值。因此,无法有效缓存PropertyValue数据。

    如果您使用多值属性(即
    4:Val4;5:Val5;6Val6
    )实施解决方案,您以后会讨厌自己

    XML稍微好一些,因为有XQuery函数可以帮助您提取和解析值。但是XML类型在SQL Server中实现为CLR类型,使用它的速度可能非常慢


    解决这个问题的最好办法就是像你这样。如果列可以是任意数量的数据类型,请使用
    sql\u变量
    类型。理想情况下,您应该将其重构为多个表/实体,以便数据类型更具体。

    如果您使用多值属性(即
    4:Val4;5:Val5;6Val6
    )实现解决方案,您以后会讨厌自己

    XML稍微好一些,因为有XQuery函数可以帮助您提取和解析值。但是XML类型在SQL Server中实现为CLR类型,使用它的速度可能非常慢


    解决这个问题的最好办法就是像你这样。如果列可以是任意数量的数据类型,请使用
    sql\u变量
    类型。理想情况下,您应该将其重构为多个表/实体,以便数据类型更具体。

    我使用类似的项目(web shop generator)。所以每个产品都有属性,每个属性都有一组值。这是不同的桌子。所有这些都有几种语言的翻译。(因此存在用于属性和值转换的其他表)

    我们为什么选择这样的解决方案?因为对于每个客户机,都应该有具有相同方案的数据库。所以这种数据库方案是非常有弹性的

    那么这个解决方案呢。一如既往,“视情况而定”-)

  • 存储。如果您的值将经常用于不同的产品,例如属性“尺寸”和尺寸值经常重复的衣服,则您的属性/值表将更小。同时,如果值具有可重复性的独特性(例如,图书的“页面计数”属性的值),您将得到一个足够大的表,其中包含值,每个值都将链接到一个产品
  • 速度。这个方案并不是项目中最薄弱的部分,因为这里的数据很少改变。请记住,您始终可以对数据库方案进行非规范化,以准备类似DW的解决方案。如果数据库部分速度太慢,则可以使用缓存
  • 弹性这是解决方案中最强的部分。您可以轻松地添加/删除属性和值,甚至可以将值从一个属性移动到另一个属性 所以你的问题的答案并不简单。如果准备了属性和值未知的弹性方案,则应使用不同的表。我建议您记住如何将值存储在CSV字符串中。最好将其存储为XML(类型化和索引化)

    更新


    我认为与用户订单相比,PropertyValue不会经常更改。但是,如果您怀疑,您应该使用非规范化表或索引视图来加快速度。无论如何,在大量行上更改XML/CSV的性能会很差,所以“单独表”解决方案看起来不错。

    我使用类似的项目(web shop generator)。所以每个产品都有属性,每个属性都有一组值。这是不同的桌子。所有这些都有几种语言的翻译。(因此存在用于属性和值转换的其他表)

    我们为什么选择这样的解决方案?因为对于每个客户机,都应该有具有相同方案的数据库。所以这种数据库方案是非常有弹性的

    那么这个解决方案呢。一如既往,“视情况而定”-)

  • 存储。如果您的值将经常用于不同的产品,例如属性“尺寸”和尺寸值经常重复的衣服,则您的属性/值表将更小。同时,如果值具有可重复性的独特性(例如,图书的“页面计数”属性的值),您将得到一个足够大的表,其中包含值,每个值都将链接到一个产品
  • 速度。这个方案并不是项目中最薄弱的部分,因为这里的数据很少改变。请记住,您始终可以对数据库方案进行非规范化,以准备类似DW的解决方案。如果数据库部分速度太慢,则可以使用缓存
  • 弹性这是解决方案中最强的部分。您可以轻松地添加/删除属性和值,甚至可以将值从一个属性移动到另一个属性 所以你的问题的答案并不简单。如果准备了属性和值未知的弹性方案,则应使用不同的表。我建议你记住关于储存的事