我应该使用SQL_Variant数据类型吗?

SQL*_*ner 24 sql sql-server database-design sql-server-2005

使用SQL Server 2005和SP4,我正在设计一个数据库表.

这是表DDL

CREATE TABLE CPSync4D.ProjectProfilerOption
(
    ProjectProfilerOptionID     INT  IDENTITY(1,1) CONSTRAINT PK_ProjectProfilerOption_ProjectProfilerOptionID PRIMARY KEY 
   ,ProjectID                   INT  CONSTRAINT FK_ProjectProfilerOption_Project_ProjectID FOREIGN KEY(ProjectID) REFERENCES CPSync4D.Project(ProjectID) ON DELETE CASCADE
   ,ProfilerOptionID            TINYINT CONSTRAINT FK_ProjectProfilerOption_ProfilerOption_ProfilerOptionID  FOREIGN KEY(ProfilerOptionID) REFERENCES CPSync4D.ProfilerOption (ProfilerOptionID) 
   ,ProfilerOptionValue         sql_variant  NOT NULL   

)
Go
Run Code Online (Sandbox Code Playgroud)

profileroptionvalue列可以包含最多30个字符的字符串,整数或十进制值,例如值为"ProfilerValueType",或12.52或20等(不超过两位小数,整数值小于100)

我应该使用sql_variant还是varchar(30)......?我以前从未使用过sql_variant,也不确定在数据库设计方面没有使用任何含义.

使用sql_variant ...与.net代码的任何陷阱

Lie*_*ers 19

显式转换SQL Server数据类型的10个理由

作为一般规则,您应该避免使用SQL Server的sql_variant数据类型.除了作为记忆猪,sql_variant是有限的:

  • 变体不能是主键或外键的一部分.(这不适用于SQL Server 2005.请参阅下面的更新)
  • 变体不能是计算列的一部分.
  • 变量不能在WHERE子句中使用LIKE.
  • OLE DB和ODBC提供程序自动将变体转换为nvarchar(4000) - 哎哟!

为避免出现问题,请始终在使用时显式转换sql_variant数据类型.使用您喜欢的任何方法,只是不要尝试使用未转换的sql_variant数据类型.

我之前没有使用sql_variant过,但考虑到这些限制和性能影响,我首先会考虑替代方案.

以下是我最不喜欢的解决方案

  • 只需创建三个不同的列.3不同的数据类型(应该)是指在客户端和服务器端解释它的3种不同方式.
  • 如果这不是一个选项,请使用VARCHAR列,以便至少可以使用LIKE语句.
  • 使用sql_variant数据类型.

编辑 Cudo's到ta.speot.is

变体可以是外键的主要部分

唯一,主键或外键可以包含sql_variant类型的列,但构成特定行键的数据值的总长度不应超过索引的最大长度.这是900字节

  • 作为一般规则,您应该始终对以"作为一般规则"开头的任何解释持怀疑态度.;-)而且,不...它不是一个内存猪,特别是当你用它来替换你建议的不同数据类型的3列时.它比通过VARCHAR转换速度快一点.它也有很多好的用途.只是大多数人不知道它们是什么.;-) (10认同)

Jef*_*den 6

我知道我的答案有点晚了但是这里制作的表看起来有点像应用程序配置表.作为给出的建议的替代方案,让我们考虑不要将自己限制在30或甚至8000个字符.让我们也让它更自包含,用户可定义.

考虑到这些想法,为什么不将"配置文件"信息保存为XML数据类型,甚至可以允许多级设置?您可能不再需要像ProfilerOptionID这样的列,并且可能能够将其转换为一个简单的控制表.