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的sql_variant数据类型.除了作为记忆猪,sql_variant是有限的:
- 变体不能是主键或外键的一部分.(这不适用于SQL Server 2005.请参阅下面的更新)
- 变体不能是计算列的一部分.
- 变量不能在WHERE子句中使用LIKE.
- OLE DB和ODBC提供程序自动将变体转换为nvarchar(4000) - 哎哟!
为避免出现问题,请始终在使用时显式转换sql_variant数据类型.使用您喜欢的任何方法,只是不要尝试使用未转换的sql_variant数据类型.
我之前没有使用sql_variant过,但考虑到这些限制和性能影响,我首先会考虑替代方案.
以下是我最不喜欢的解决方案
VARCHAR列,以便至少可以使用LIKE语句.sql_variant数据类型.编辑 Cudo's到ta.speot.is
唯一,主键或外键可以包含sql_variant类型的列,但构成特定行键的数据值的总长度不应超过索引的最大长度.这是900字节
我知道我的答案有点晚了但是这里制作的表看起来有点像应用程序配置表.作为给出的建议的替代方案,让我们考虑不要将自己限制在30或甚至8000个字符.让我们也让它更自包含,用户可定义.
考虑到这些想法,为什么不将"配置文件"信息保存为XML数据类型,甚至可以允许多级设置?您可能不再需要像ProfilerOptionID这样的列,并且可能能够将其转换为一个简单的控制表.