3

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

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

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

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

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

你有什么想法吗?


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


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


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

4

5 回答 5

5

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

EAV 是一种非关系型设计。就关系数据库设计的适当规则而言,没有“正确”的方法可以做到这一点。

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

如果您需要动态属性,请使用非关系数据管理解决方案

于 2009-08-27T22:53:05.020 回答
2

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

于 2009-09-22T02:25:41.580 回答
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 to SQL 的角度来看,您可能有一个轻量级的类,可以将类型映射到特定的数据类型;XML 反序列化可能是这里的一个选项。

于 2009-09-22T02:43:34.703 回答
1

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

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

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

于 2009-09-22T02:16:09.427 回答
1

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

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

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

于 2009-09-23T21:15:41.977 回答