我不是DB专家,也不确定在查询我的表时哪种方法最好。
我有一个表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,
},
现在,我想知道,在查询所有可用的用户时,例如在星期一,如果有一个包含按位整数的列,这样我就可以使用Server中的OR
按位运算符添加所有值并对其进行查询,这样会不会更快呢?
(谢谢你的帮助:)
朱利安。
发布于 2017-10-13 16:26:24
你是在问这是否可能,还是一个好办法?
我在作业调度工具上做了大量工作,我的团队使用SQL Server中的SQL代理作业调度器作为开始的基础。在本文中,SQL调度程序将计划存储在一个表中,其中一些列被编码为对它们使用按位操作。
因为一周只有7天,所以可以使用tinyint
数据类型(1字节=8位)来存储这些可用性数据。
Ob01000000 could be Monday = 64
0b00100000 could be Tuesday = 32
etc.
然后当你在查询中提取数据时.
WHERE Availability.AvailableDays | 64 = 64
会给你周一工作的人。
就我个人而言,我喜欢这种方法来解决这类问题。
发布于 2017-10-13 16:45:06
在内部,Server将位列实现为Server中的字节块。
Server数据库引擎优化了位列的存储。如果表中有8位或更少的位列,则将这些列存储为1字节。如果有9到16位列,则列存储为2个字节,依此类推。
我建议使用bit
列。数据库为您执行所有的按位操作,这样您就可以编写方便且易于阅读的筛选条件,如where [wednesday] = 1
。
此外,架构本身防止在整数列(如tinyint
和smallint
)中设置无效值的任何尝试。例如,假设您设置了一个允许7位的tinyint列。这将值限制在0到127之间。需要检查约束才能防止设置最顶层位的人,并防止值介于128到255之间(包括在内)。
https://stackoverflow.com/questions/46733817
复制相似问题