SQL Server 按位列上的约束行为类似于C#枚举标志

b5lpy0ml  于 2022-12-03  发布在  C#
关注(0)|答案(2)|浏览(144)

您建议如何在MapC#标志枚举的值的列上强制约束?
下面是管理按位运算的一个很好的解决方案:SQL Server Bitwise behave like C# Enum Flags
另外,我想限制在此列中输入的值。枚举现在包含大约10个成员,将来可能会增加。

xa9qqrwz

xa9qqrwz1#

如果您有一个包含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)
    );

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

falq053o

falq053o2#

我不会约束一个按位字段,没有意义。如果它基于一个枚举的值,并且用户没有手动输入/编辑这个数据,那么就没有意义约束它。
至于性能,我和一位同事开始测试不同的方法,他用传统的方法,我用按位的方法。结果是,按位操作在大数据块上的性能优于传统的方法。传统的方法在大约16.7秒内返回结果,显示了相当大的查询计划,而按位操作只需0.6秒,计划要小得多。@Samuel Neff -如果在表上放置索引,则不涉及表扫描。

相关问题