2017-10-13 39 views
1

我不是数据库专家,也不确定在查询我的表时最好采用什么方法。SQL Server:按位或单独的字段

我有一个表Availability其中包含特定用户可以工作的星期几。

我已经定义了这样的

 monday: { 
     type: Sequelize.BOOLEAN, 
     allowNull: false, 
     defaultValue: false, 
    }, 
    tuesday: { 
     type: Sequelize.BOOLEAN, 
     allowNull: false, 
     defaultValue: false, 
    }, 
    wednesday: { 
     type: Sequelize.BOOLEAN, 
     allowNull: false, 
     defaultValue: false, 
    }, 
    thursday: { 
     type: Sequelize.BOOLEAN, 
     allowNull: false, 
     defaultValue: false, 
    }, 
    friday: { 
     type: Sequelize.BOOLEAN, 
     allowNull: false, 
     defaultValue: false, 
    }, 
    saturday: { 
     type: Sequelize.BOOLEAN, 
     allowNull: false, 
     defaultValue: false, 
    }, 
    sunday: { 
     type: Sequelize.BOOLEAN, 
     allowNull: false, 
     defaultValue: false, 
    }, 

现在我的模型,我想知道,是不是会更快,当它涉及到查询我的可用工作例如所有用户在星期一,有一个单列包含一个按位整数,所以我可以通过在SQL Server中使用OR位运算符添加所有值和查询来插入它?

感谢您的帮助:)

Julien。

回答

1

你问是否可能或者它是一个好方法吗?

我在作业调度工具上做了大量工作,我的团队使用SQL Server中的SQL Agent作业调度程序作为开始的基础。在下面,SQL Agent调度程序将调度表存储在一个表中,并且对一些列进行编码以对它们使用按位操作。

由于一周只有7天,您可以使用tinyint数据类型(1字节= 8位)来存储此可用性数据。

Ob01000000 could be Monday = 64 
0b00100000 could be Tuesday = 32 
etc. 

然后当你拉出来的数据查询中...

WHERE Availability.AvailableDays | 64 = 64 

会给你任何人谁在周一的作品。

就我个人而言,我喜欢这种类型的问题的方法。

+0

嗨@thomas,我只是想知道这里最好的做法是什么。这看起来确实是一个很好的方法。我会试一试。谢谢:) – Julien

0

在内部,SQL Server将位列实现为SQL Server中的一个字节块。

SQL Server数据库引擎优化位列的存储。如果 表中有8个或更少位列,则这些列存储为 1个字节。如果有9到16位列,则列为 ,存储为2个字节,依此类推。

BOL Source

我会建议使用bit列。数据库为您执行所有按位操作,因此您可以编写方便且易于阅读的筛选条件,如where [wednesday] = 1

此外,架构本身可以防止在整数列中设置无效值,如tinyintsmallint。例如,假设你设置了一个允许7位的tinyint列。这将值限制在0到127之间。检查约束将被要求防止某人设置最高位并阻止128到255(含)之间的值。

+0

Hi @ paul-williams,谢谢你的回应,我确实认为Sequelize会默认创建一个BIT,这是我目前的实现。现在我将介绍perfs的用法。 – Julien