【发布时间】:2014-01-22 06:51:47
【问题描述】:
您如何建议对映射 C# 标记枚举值的列实施约束?
这里有一个很好的管理按位运算的解决方案: SQL Server Bitwise behave like C# Enum Flags
此外,我想限制此列中输入的值。该枚举现在包含大约 10 个成员,将来可能会增加。
【问题讨论】:
标签: sql-server bitwise-operators
您如何建议对映射 C# 标记枚举值的列实施约束?
这里有一个很好的管理按位运算的解决方案: SQL Server Bitwise behave like C# Enum Flags
此外,我想限制此列中输入的值。该枚举现在包含大约 10 个成员,将来可能会增加。
【问题讨论】:
标签: sql-server bitwise-operators
如果您有一个包含 10 个数字的按位枚举,那么它们的值将是 1 到 512,2 的幂。因此范围可以是 0 到 1023。添加这样的约束:
CREATE TABLE sample
(
id INT PRIMARY KEY,
flags INT,
CONSTRAINT chk_flgs CHECK (flags BETWEEN 0 and 1023)
)
但是,我强烈警告不要这样做。关系数据库旨在允许以各种方式访问数据并轻松地对数据运行查询。按位运算符在 SQL 中效率不高。想一想您想列出所有匹配标志的情况吗?使用枚举值创建一个查找表并在您的源和查找表之间添加一个交叉引用表会更加规范化。
上面的例子会变成这样:
CREATE TABLE Flags
(
FlagID INT PRIMARY KEY, -- When inserted, match enum value
FlagName nvarchar(50)
);
CREATE TABLE SampleS
(
SampleID INT PRIMARY KEY
);
CREATE TABLE Xref_Sample_Flags
(
SampleID INT,
FlagID INT,
CONSTRAINT FK_SampleID FOREIGN KEY (SampleID) REFERENCES Sample (SampleID),
CONSTRAINT FK_FlagID FOREIGN KEY (FlagID) REFERENCES Flags (FlagID)
);
更多表,但从长远来看更易于维护和查询。
【讨论】: