存储多种类型字段的最佳方式

时间:2009-08-27 22:47:05

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

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

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

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

2-个单独的表(StringValues,DateValues,Decimal,XML ...等):指向值+字段定义类型的外键:某种程度上复杂,性能

如果仅存储唯一值,则第二种方法可能具有额外的优势:它将作为索引使用。

你有什么想法吗?


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


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


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

5 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

您能考虑使用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 de / serialization可能是一个选项。

答案 3 :(得分:1)

我不确定这是否足以详细回答这个问题。如果你真的在询问这两种类型的情况,你可能还会考虑一个表格,每个类型都有一个列和一个鉴别器。 “正确”答案可能取决于具体情况,例如要支持的不同类型的数量,速度与空间限制等。

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

关于不执行此操作的所有建议,我同意如果可能。另一方面,SharePoint是一个显示它并非不可能的例子。祝你好运!

答案 4 :(得分:1)

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

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

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