在MS SQL Server数据库中存储未知数据类型

7

有没有人知道如何在表中存储未知数据类型的最佳实践。

基本上我需要在同一“值”列中存储像bit、smallint、int、real和nvarchar这样的类型,以便后来由.NET应用程序进行解释。

我正在尝试实现最佳解决方案,以不影响数据库的性能或增长。

有什么建议吗?

提前感谢!


2
如果您要使用EAV模型,请先了解为什么它在关系型数据库中是一种糟糕的数据结构,建议您阅读以下文章:http://www.simple-talk.com/opinion/opinion-pieces/bad-carma/ 如果您确实需要使用EAV模型,可以考虑使用NoSQL解决方案。 - HLGEM
5个回答

11

我不太喜欢varchar解决方案,但我一定会尝试sql_variant并测试转换性能。如果可以接受,那就这样吧!感谢您的建议。 - Guilherme Duarte

1

在我看来,你只有两个选择:

你的对象必须保存为某种字符串。该字符串可以是原始字符串或XML格式。如果你将其序列化为XML并存储在数据库中,同样,你可以选择nvarcharXML。我要指出的是,“序列化”会使数据膨胀。如果你可以合理地根据另一个同时提取的列确定数据类型,那么我建议将其作为字符串输入。


1
这个解决方案看起来不错,但是序列化的字符串或XML文件大小(以字节为单位)比基本数据本身大很多,不是吗? - Guilherme Duarte
@Guilherme,是的,这就是为什么我说“‘序列化它’会使数据膨胀”。但如果您没有其他确定实际数据类型的方法,这可以作为一种后备方案。 - Brad

1

我不确定你所说的“未知类型”是什么意思。如果你的意思是一个值恰好是有限数量可能类型中的一个,那么我建议使用单列 -- 强类型 -- 表来表示每个可能的类型,并使用一个“超类”表来告诉你应该在哪个表中查找。


事实上,那正是我的当前解决方案。但我试图通过使用单个“值”表来增强表交叉和选择查询。如果没有其他选择,那就只能这样了。 - Guilherme Duarte

0

将其存储为 varchar(或 nvarchar)。这样可以处理所有类型。您需要根据您所知道的数据来确定要设置多长。


谢谢您的建议。但是我避免使用varchar(nvarchar)解决方案,因为它会影响数据库增长和转换性能。 - Guilherme Duarte
2
你不能两全其美;如果你想在同一列中存储不同类型的数据,那么你会使用什么其他类型呢?字符串/varchar是唯一能够表示所有其他类型(当然除了二进制)的类型。 - Brad
注意:我刚刚了解了 sql_varient 类型,这似乎是一个可行的解决方案,但我想知道在将该列中的对象转换为所需类型时,.NET 会有何反应。 - Brad
事实上,我的.NET解决方案已经将值存储在对象属性中,因此可能不需要进行太多的强制转换。 - Guilherme Duarte

0

试试这个:

YourTableName
...more columns...
ColType char(1)       --B=bit, S=smallint, I=int, R=real, n=nvarchar, you can FK to a table to store these or just check constraint them
Col     nvarchar(x)   --where x is large enought to hold your longest string or other value
...more columns...

在 .Net 应用程序中,读取 ColType 并将 Col 列转换为该类型。保存时,SQL Server 将会自动将本地数据类型转换为 nvarchar()。

谢谢您的建议。但是我避免使用varchar(nvarchar)解决方案,因为它会影响数据库增长和转换性能。 - Guilherme Duarte
哈,你选择的答案是“sql_variant”,你认为它会表现得更好吗? - KM.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接