【问题标题】:Storing unknown datatype in MS SQL Server Database在 MS SQL Server 数据库中存储未知数据类型
【发布时间】:2010-10-07 22:40:50
【问题描述】:

有没有人知道在表中存储未知数据类型的最佳实践是什么? 基本上,我需要将 bit、smallint、int、real 和 nvarchar 等类型存储在同一个“值”列中,以便稍后由 .NET 应用程序进行解释。

我试图在不影响数据库性能或增长的情况下实现最佳解决方案。

有什么建议吗?

提前致谢!

【问题讨论】:

  • 如果您要走 EAV 路线,我建议您阅读一下为什么这是关系数据库中的不良数据结构。见:simple-talk.com/opinion/opinion-pieces/bad-carma如果你真的需要这样做,你可以考虑使用nosql解决方案。

标签: sql sql-server sql-server-2008


【解决方案1】:

Varchar(max) 可能是最简单的方法。

sql_variant 是为此目的而设计的,因此您可以使用它,但请阅读联机丛书条目以确保它能够满足您的需求。

http://msdn.microsoft.com/en-us/library/ms181071.aspx

【讨论】:

  • 我不太喜欢 varchar 解决方案,但我肯定会尝试 sql_variant 并测试转换性能。如果它可以接受,那就是它的方式!谢谢你的建议。
【解决方案2】:

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

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

【讨论】:

  • 解决方案看起来不错,但序列化的字符串或 Xml 不会比基础数据本身大很多(以字节为单位)吗?
  • @Guilherme,是的,这就是为什么我说'I would point out that "serializing it" will bloat the data' 但是如果你没有其他方法来确定实际数据类型,这可以作为一个后备。
【解决方案3】:

我不确定您所说的“未知类型”是什么意思。如果您的意思是一个值恰好是有限数量的可能类型之一,那么我将为每种可能的类型使用一个单列(强类型)表和一个“超类”表来告诉您要查看哪个表。

【讨论】:

  • 事实上,这正是我目前的解决方案。但是我试图通过一个“值”表来增强表交叉和选择查询。如果没有其他选择,那就这样吧。
【解决方案4】:

将其存储为varchar(或nvarchar)。这将处理所有类型。您必须根据您对数据的了解来确定长度。

【讨论】:

  • 感谢您的建议。但由于数据库增长和转换性能受到影响,我避免使用 varchar (nvarchar) 解决方案。
  • 你不能一边吃蛋糕一边吃;如果你想在同一列中存储不同的类型,你会使用什么 other 类型? String/varchar 是唯一 可以表示所有其他类型(二进制或课程除外)的类型。
  • **注意:我刚刚阅读了有关 sql_varient 类型的信息,这似乎是一个可行的解决方案,但我想知道 .NET 会如何将该列中的对象转换为您所希望的类型欲望。
  • 事实上我的 .NET 解决方案已经将值存储在对象属性中,所以可能不会有太多的转换。
【解决方案5】:

试试这个:

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) 解决方案。
  • 哈,您选择的答案:“sql_variant”您认为如何表现更好?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多