按位列的约束表现得像C#enum标志

时间:2014-01-22 06:51:47

标签: sql-server bitwise-operators

您如何建议对映射C#标记枚举值的列强制执行约束?

管理按位操作的一个很好的解决方案是: SQL Server Bitwise behave like C# Enum Flags

此外,我想限制此列中输入的值。枚举现在包含大约10个成员,将来可能会提高。

1 个答案:

答案 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)
    );

更多表格,但从长远来看更容易维护和查询。