gpt4 book ai didi

mysql - 许多复选框有很多列还是单列位串更好

转载 作者:行者123 更新时间:2023-12-01 10:07:53 25 4
gpt4 key购买 nike

我有以下场景:

一个有很多复选框的表单,大约 100 个。

关于如何将它们保存在数据库中,我有两个想法:

1。多列

我创建了一个如下所示的表:

id | box1 | box2 | ... | box100 | updated| created

id: int
box1: bit(1)


SELECT * FROM table WHERE box1 = 1 AND box22 = 1 ...

2。单个数据列

表格很简单:

id | data | updated | created

data: varchar(100)

SELECT * FROM table WHERE data LIKE '_______1___ ... ____1____1'

其中数据看起来像 0001100101010......01 每个字符表示是否检查了值。

考虑到表将有 200k+ 行,这是一个更具可扩展性的解决方案?

3。 JSON类型的单个数据列

我还没有这方面的好消息。

最佳答案

或者...

<强>4。几个SETs

<强>5。几个INTs

  • 这些要紧凑得多:每个字节大约 8 个复选框。
  • 它们的设置/测试有点困惑。
  • 由于它们仅限于 64 位,因此您需要多个 SETINT .我建议根据应用程序以某种合乎逻辑的方式对位进行分组。
  • 注意 FIND_IN_SET() .
  • 注意 (1 << $n)创造值(value)2^n .
  • 注意 |&运营商。

5 个中哪个最好?这取决于您需要运行的查询——搜索(如果需要?)、插入、更新(如果需要?)和选择。

一个例子:INTs , WHERE (bits & 0x2C08) = 0x2C08将同时检查 4 个标志是否为“ON”。该常量可以在应用程序代码中构造,或者 ((1<<13) | (1<<11) | (1<<10) | (1<<3))对于位 3、10、11、13。同时,其他标志被忽略。如果您需要将它们设为“OFF”,则测试为 WHERE bits ^ 0x2C08 = 0 .如果这两种测试中的任何一种是您的主要事件,那么选择 5 可能是性能和空间方面的最佳选择,尽管它读起来有些神秘。

添加另一个选项时,SET需要 ALTER TABLE . INT 通常 有一些备用位(TINYINT UNSIGNED 有 8 位,... BIGINT UNSIGNED 有 64 位)。所以,大约八分之一的时间,你需要一个 ALTER获得更大的 INT 或添加另一个 INT。删除一个选项:建议只放弃那个 SET 元素或 INT 的一点。

关于mysql - 许多复选框有很多列还是单列位串更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50449744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com