【问题标题】:Best way to store muti-type field存储多类型字段的最佳方式
【发布时间】:2009-08-27 22:47:05
【问题描述】:

假设我们有一个字段可以有多种类型,例如:字符串或日期或 XML 数据类型。

现在我们有两种方法可以将其存储在数据库中

1- 使用字符串类型字段 + 字段定义类型:失去“类型感知”排序功能,需要转换

2- 单独的表(StringValues、DateValues、Decimal、XML ...等):指向值的外键 + 定义类型的字段:有点复杂,性能

如果只存储唯一值,第二种方法可能有一个额外的优势:它可以用作索引。

你有什么想法吗?


注意1:最好考虑基于MS SQL Server 2008和Linq2SQL的项目


注2:也许我们会在另一个问题中讨论如何实现EAV,我问的是关系存储中的EAV。


注意3:类型可以改变,但不会频繁

【问题讨论】:

  • 如果您使用转换并按转换类型排序,您不会失去字段定义类型的排序功能。听起来第二种方法就是你想要的。
  • 但是SqlServer不完全支持ting,在代码端进行强制转换和排序会不会很高效?

标签: database-design architecture types entity-attribute-value


【解决方案1】:

听起来您正在设计一个EAV 解决方案,您的表存储多个属性的值,每行一个值。

EAV 是一种非关系型设计。对于正确的rules of relational database design,没有“正确”的方法可以做到这一点。

正确的设计是将每个属性存储在 one 表的单独列中。为每列提供正确的数据类型和描述性名称。每列只存储相同逻辑类型的值。

如果您需要动态属性,请使用non-relational data management solution

【讨论】:

  • 我自己说得再好不过了!
  • 我知道它在某种程度上没有遵循规范化指南,但我想知道以最少牺牲实现它的最佳方法。
  • 当您使用 EAV 设计时,您实际上牺牲了关系数据库的每一个优势,因此您最好不要使用关系数据库。
  • 我知道,我问的是如果我没有更好的选择:)
  • 如果您仍然认为 EAV 是您唯一的选择,请阅读这篇关于其他人使用 EAV 的经验的精彩文章:simple-talk.com/opinion/opinion-pieces/bad-carma
【解决方案2】:

我会选择第二个选项,并通过几个视图隐藏表格情况的复杂性。这样,一旦您获得更大的灵活性,您的应用程序仍然可以指向视图而无需更改,并且您可以将基础表重新排列为更简洁的东西。

【讨论】:

    【解决方案3】:

    您可以考虑使用 XML 数据类型吗?如果是这样,您可以使用属性/元素来定义类型。

    <string>My string value</string>
    <date>24-Nov-1976</date>
    

    或者,

    <val type="System.String">My string value</val>
    <val type="System.Date">24-Nov-1976</val>
    

    SQL Server 2005+ 对 XML 索引有一些很好的支持,可以满足您的需求。

    从 Linq to SQL 的角度来看,您可能有一个轻量级的类,可以将类型映射到特定的数据类型; XML 反序列化可能是这里的一个选项。

    【讨论】:

    • 索引也不是很有效
    • 查询 XMl 数据类型看起来像这样: SELECT xCol FROM docs WHERE xCol.exist ('/book/@ISBN[. = "0-2016-3361-2"]') = 1 I没有关于 XML 索引性能的任何细节。我认为这取决于您是否键入 XML。当然,根据场景,这种性能成本可能是可以接受的。只有尝试基准测试才能知道。
    • 没有意识到我有。 (PC 不时锁定,所以我不耐烦地点击直到它回来。)
    【解决方案4】:

    我不确定这是否足以很好地回答问题。如果您从字面上询问两种类型的情况,您还可以考虑一个表,其中每种类型都有一个列和一个鉴别器。 “正确”答案可能取决于具体情况,例如要支持的不同类型的数量、速度与空间限制等。

    有些人可能会争辩说,最便宜的方法是最好的方法。具体来说,您认为理解和维护成本最低的方法(通常约为 TCO 的 60%)。

    关于不这样做的所有建议,我同意如果可能。另一方面,SharePoint 是一个例子,表明它并非不可能。祝你好运!

    【讨论】:

      【解决方案5】:

      如果可能的类型数量很少,请使用选项 2(附加表 + 外键)或使用选项 3。

      选项 3: 使用一个表,其中包含每种类型的字段和定义哪个字段相关的枚举字段。

      如果可能类型的数量很大或不是恒定的,请使用选项 1(字符串) - 您可以将日期存储在字符串中为 YYYY-MM-DD-HH-MM-SS 以保留排序.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-09
        • 2011-09-22
        • 1970-01-01
        相关资源
        最近更新 更多