添加更多列到MySQL表或内爆?[副本]

rsaldnfx  于 2023-10-15  发布在  Mysql
关注(0)|答案(1)|浏览(108)

此问题已在此处有答案

How to design a product table for many kinds of product where each product has many parameters(4个答案)
12天前关闭
我的项目存储并列出了我参与的爱好的事件。
有“理事机构”,有组织作为其成员的一部分(通常基于区域),和理事组织和区域组织运行的事件(即。管理=“世界锦标赛”,区域=预选赛或一次性事件)。
这些项目有组别(男子、女子、18岁以下男孩等)。大多数地方和/或区域活动可能有3-5个部门,但最多,有一些可能有10个。全球约有20个分部。
事件表有14列。
当用户选择列出这些列时,是否应该增加20个列并使用类似BOOLEAN的东西来处理?
或者我应该在一列中存储除法,比如使用数组,implode/explode等?
我想自己/用户排序和过滤。
我的实现将使用PHP/JS。

cwtwac6a

cwtwac6a1#

要为数据库表中的每一行存储多个布尔值,可以
1.将这些列添加到表中(不是很灵活,有点混乱,但在条件语句中使用起来很快)
1.对每一行使用关系表,关系表中的每一个值对应一行,引用原始表中的行(最灵活,非常干净,性能稍差)
1.将所有值存储在表中的一列中(在条件中使用时可能是性能噩梦,这取决于值的存储方式)
然而,当处理布尔值时,值的数量保证不会超过64(在64位系统上),选项3成为性能最好的选项,因为您可以使用按位操作将所有布尔值存储在一个单一的(无符号)整数值中。为此,您将为每个布尔值分配一个位。
范例:

division_1_selected = bit 0 = 1 
division_2_selected = bit 1 = 2
division_3_selected = bit 2 = 4 
division_4_selected = bit 3 = 8
[...]

(the值始终为2的bit_number次幂)
要存储一个选择,您需要对所有值求和并存储结果。如果选择1和3分区,结果将是5(1+4)。这与对所有division_x_selected使用按位OR运算符相同。
要检索某个选择的所有记录,可以使用按位AND运算符。因此,如果您想获取所有选择了第3和第4分区(=12)的记录(无论第1和第2分区的选择是什么),您可以使用

WHERE col & 12 = 12

在查找精确匹配时,不需要使用按位运算符。因此,如果您想获取所有选择了第3和第4分区,第1和第2分区为空的行,您只需执行以下操作即可:

WHERE col = 12

相关问题