Sql server 在sql server中使用位掩码跟踪已启用服务列表的最佳方法?

Sql server 在sql server中使用位掩码跟踪已启用服务列表的最佳方法?,sql-server,binary,bitmask,Sql Server,Binary,Bitmask,我试图找到一种简单的方法来跟踪在2008 MS SQL Server数据库中为客户启用的服务列表 客户可以订阅256个可能启用的服务 对于每个客户,我需要知道哪些服务已启用,哪些服务已禁用 我正在考虑在sql server中使用某种位掩码。我正在考虑将位掩码定义为一个32字节的二进制列。这将给我2560或1的翻转或关闭一列。启用的服务的位为on或1,禁用的服务的位为off或0 我希望最左边的有效位表示服务1,最右边的位表示服务256。换句话说,从左到右读取位 正在寻找打开位掩码中任何位的简单方法

我试图找到一种简单的方法来跟踪在2008 MS SQL Server数据库中为客户启用的服务列表

客户可以订阅256个可能启用的服务

对于每个客户,我需要知道哪些服务已启用,哪些服务已禁用

我正在考虑在sql server中使用某种位掩码。我正在考虑将位掩码定义为一个32字节的二进制列。这将给我2560或1的翻转或关闭一列。启用的服务的位为on或1,禁用的服务的位为off或0

我希望最左边的有效位表示服务1,最右边的位表示服务256。换句话说,从左到右读取位

正在寻找打开位掩码中任何位的简单方法。我一直在使用按位或“|”运算符

理想情况下,我会编写一个UDF,它可以很容易地打开任何位,使用十进制数字表示要打开哪个位

例如,如果我想打开位110,我希望执行以下操作: 位掩码=位掩码| 110

花了整整一个下午的时间试图找到一些东西,并在网上搜索,但还没能把它们全部整合起来


任何帮助和建议的方法都将不胜感激。

使用位掩码的最佳方法是不使用位掩码

首先,SQL Server在将它们存储到磁盘时已经存在。基本上,位掩码工作已经为您完成了。256位列将占用磁盘上32字节的空间

然而,这可能仍然不是解决这个问题的最佳方法。因为每个位字段代表一个服务,所以您在将来仍将创建更多的工作。您不仅仍然使用重复字段打破1NF,还要求自己在添加、删除或更改服务时修改表架构。无论您使用的是位掩码还是一系列位字段都无法解决这一问题。(对于位掩码,如果服务位0x4失效,您必须永远维护无用的数据,而重新分配会带来记录数据库中未保留的更改的问题。)

解决此问题的最佳方法是使用。将可用服务列表放在它自己的表中,然后使用连接表来表示服务分配。现在,您可以轻松地添加和删除服务,使用连接表上的外键保持完整性,甚至可以在连接表本身中记录有关关系的数据


是的,从应用程序中查询可能会很痛苦,因为您不能在一行中获取所有内容。这仍然是存储RDBMS中所描述类型的关系的最佳方式。

客户和服务之间的简单多对多表有什么问题?甚至是一个有256个稀疏列的表?在确定偏离关系模型的具体原因之前,您应该使用关系模型。这听起来像是一个多对多连接的场景。也就是说,SQLServer确实支持整数的按位操作。