我有以下情况:
包含许多复选框的表单,大约100个。
我有两个关于如何将它们保存在数据库中的想法:
我创建一个看起来像这样的表:
id | box1 | box2 | ... | box100 | updated| created
id: int
box1: bit(1)
SELECT * FROM table WHERE box1 = 1 AND box22 = 1 ...
表格简单:
id | data | updated | created
data: varchar(100)
SELECT * FROM table WHERE data LIKE '_______1___ ... ____1____1'
其中数据看起来像0001100101010......01
,每个字符表示是否检查了值。
考虑到该表将有200k +行,这是一个更具可扩展性的解决方案?
我还没有关于此的好消息。
答案 0 :(得分:2)
或者...
<强> 4。一些SETs
<强> 5。一些INTs
SET
或INT
。我建议根据应用程序对这些位进行分组是合乎逻辑的方式。FIND_IN_SET()
。(1 << $n)
创建值2^n
。|
和&
运营商。5个中哪个最好?这取决于您需要运行的查询 - 搜索(如果需要?),插入,更新(如果需要?)和选择。
示例:对于INTs
,WHERE (bits & 0x2C08) = 0x2C08
会同时检查4个标记是否为“开启”。该常量可以在应用代码中构建,也可以在{3}中为位3,10,11,13构建。同时,其他标志被忽略。如果您需要它们“关闭”,则测试将为((1<<13) | (1<<11) | (1<<10) | (1<<3))
。如果这些测试中的任何一种都是您的主要活动,那么选择5可能是性能和空间的最佳选择,尽管读起来有点神秘。
添加其他选项时,WHERE bits ^ 0x2C08 = 0
需要SET
。 ALTER TABLE
通常有一些备用位(INT
有8位,... TINYINT UNSIGNED
有64位)。因此,在8中大约一次,你需要一个BIGINT UNSIGNED
来获得更大的INT或添加另一个INT。删除选项:建议放弃该SET元素或INT位。