您如何建议对映射C#标记枚举值的列强制执行约束?
管理按位操作的一个很好的解决方案是: SQL Server Bitwise behave like C# Enum Flags
此外,我想限制此列中输入的值。枚举现在包含大约10个成员,将来可能会提高。
答案 0 :(得分:1)
如果你有一个带有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)
);
更多表格,但从长远来看更容易维护和查询。