现在我的MySQL表中有7列:
monday
tuesday
wednesday
..
他们都是布尔人。有没有办法通过使用bitset / bitmap或其他东西将这些布尔值组合在一个days
列中?
我还希望能够查询启用了特定日期的行。我现在使用的查询是:
SELECT id FROM rows WHERE thursday = 1
多天都可以,但我只需要一次查询一天。
答案 0 :(得分:4)
是否有任何理由要将它们全部存储在一列中?
有很多方法,但是如果你走这条路的话,你将会遇到一些问题。例如,如果您想在“星期四”期间查看哪些行处于活动状态,则必须查看每一行,运行一些功能以“去除”数据,然后解析结果。
如果它只有7个布尔值,为什么不只是制作一个可以存储0-2 ^ 8的列并分配每一天?
答案 1 :(得分:3)
是的,这是可能的,但是你没有规范化,某些查询将很难编写。
例如 - 如果你想知道每天出现多少次事件(比如星期二),这种设计会让它变得非常困难和低效。
表中的7位字段最好。
答案 2 :(得分:2)
让我告诉你我的经验。我有类似的需要存储应用程序权限的位掩码。
实现起来非常简单,只需将字段设置为标准整数类型,然后使用相关位掩码进行AND检查是否设置了特定项目,并使用OR设置特定项目。
那就是说,我现在后悔了。它实际上使你的代码变得更加复杂,而且我学到了很难的方法,你不会真正使用该列上的索引进行有意义的使用,从而导致查询性能不佳。接受我的建议并将其作为7个独立的位/布尔字段来执行,特别是考虑到它们不会很快发明新的工作日,因此使用位掩码的灵活性无论如何都是浪费。聪明的位掩码解决方案无法获得回报。
答案 3 :(得分:0)
我认为你可以在这里序列化。请看一下:
http://www.devshed.com/c/a/PHP/Working-with-MySQL-and-Sessions-to-Serialize-Objects-in-PHP/1/
答案 4 :(得分:0)
您可以使用1个字节来存储7位并保留1位,但建议每个位使用不同的列
答案 5 :(得分:0)
Set datatype会很好。 Storage used因为它是位图。
答案 6 :(得分:0)
我认为@Mike M就在这里。 因此,例如,您有一个可能如下所示的表:
monday | tuesday | wednesday | thursday | friday | saturday | sunday
true | false | false | true | false | false | true
这可以在一栏中表示为:
| days |
--------
1001001
我不确定这对你有多大帮助,你只需解析日期栏,看看哪些日子有效。