代码之家  ›  专栏  ›  技术社区  ›  Ahmed Khalaf

存储多类型字段的最佳方法

  •  3
  • Ahmed Khalaf  · 技术社区  · 15 年前

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

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

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

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

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

    你有什么想法吗?


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


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


    注3:类型可以更改,但不经常更改

    5 回复  |  直到 15 年前
        1
  •  1
  •   Jason Weber    15 年前

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

    有些人可能会说,最便宜的方法是最好的。具体来说,您认为的方法需要最少的成本来理解和维护(通常约占总拥有成本的60%)。

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

        2
  •  5
  •   Community CDub    7 年前

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

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

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

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

        3
  •  2
  •   Shaun Mundi    15 年前

    我将使用第二个选项,并通过几个视图隐藏表情况的复杂性。这样,一旦您获得了更大的灵活性,您的应用程序仍然可以指向视图而无需更改,并且您可以将底层表重新排列到更干净的地方。

        4
  •  2
  •   Scott McKenzie    15 年前

    可以考虑使用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到SQL的角度来看,您可能有一个轻量级的类,它可以将类型映射到特定的数据类型;XML去/序列化可能是这里的一个选项。

        5
  •  1
  •   Danny Varod    15 年前

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

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

    如果可能类型的数目很大或不是常量 ,使用选项1(字符串)-可以将日期以字符串形式存储为YYYY-MM-DD-HH-MM-SS以保留排序。