假设我们有一个可以有多种类型的字段,例如:字符串或日期或XML数据类型。
现在我们有两种方法可以将它存储在数据库中
1-使用字符串类型字段+字段定义类型:丢失“类型感知”排序功能,需要转换
2-个单独的表(StringValues,DateValues,Decimal,XML ...等):指向值+字段定义类型的外键:某种程度上复杂,性能
如果仅存储唯一值,则第二种方法可能具有额外的优势:它将作为索引使用。
你有什么想法吗?
注1:最好考虑基于MS SQL Server 2008和Linq2SQL的项目
注意2:也许我们将讨论如何在另一个问题中实现EAV,我在关系存储中询问EAV。
注3:类型可以改变,但不经常
答案 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存储在字符串中以保留排序