我不是数据库专家,也不确定在查询我的表时哪种方法最好。
我有一个表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
按位运算符添加所有值和查询来插入它吗?
感谢您的帮助:)
于连。
答案 0 :(得分: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
会给你周一工作的人。
就个人而言,我喜欢这种方法解决这些问题。
答案 1 :(得分:0)
在SQL Server内部,SQL Server将位列实现为SQL Server中的字节块。
SQL Server数据库引擎优化了位列的存储。如果 表中有8位或更少位列,列存储为 1个字节。如果有9到16位列,则列为 存储为2个字节,依此类推。
我建议使用bit
列。数据库为您执行所有按位操作,因此您可以编写方便且易于阅读的过滤条件,如where [wednesday] = 1
。
此外,架构本身可防止任何尝试在tinyint
和smallint
等整数列中设置无效值。例如,假设您设置了一个允许7位的tinyint列。这会将值限制为0到127.需要检查约束以防止某人设置最高位并防止128到255(包括)之间的值。