我正在编写代码(使用MySQL)来解决类似于以下问题:
有20个布尔选项(每个用户)。
我应该存储20 ENUM('false','true')
或只将这些选项的ID放入表中(这可能每个用户少于20行)?
答案 0 :(得分:4)
如果可能出现新选项并且您没有按选项进行过滤,那么您也可以采用EAV
结构(每个选项的记录)。
这样,您可以更轻松地添加新选项(无需更改元数据)。
假设选项值为TRUE
或FALSE
(不可能NULL
),则应仅为非默认选项值(TRUE
创建记录案件)。缺少记录将意味着错误。
要检索所有选项,您可以使用:
SELECT *, GROUP_CONCAT(CONCAT(o.id, ': ', ov.user IS NULL), ', ' ORDER BY o.id)
FROM users u
CROSS JOIN
options o
LEFT JOIN
option_value ov
ON (ov.user, ov.option) = (u.id, o.id)
GROUP BY
u.id
,它会为您提供动态输出:
user_id options
1 1: 0, 2: 1, 3: 0
答案 1 :(得分:3)
我建议使用不同的选项创建Options
表。
+---Options---+
ID
Option
+---Users---+
ID
Name
+---User_Options---+
User_id
Option_id
现在,如果您需要更多选项,请将它们插入Options
表,您不需要以这种方式更改数据库。
编辑:删除了condition
中的user_options
:像Quassnoi一样,最好只在“TRUE”的情况下添加记录,并且缺少记录应该被视为“FALSE”
答案 2 :(得分:1)
我建议存储为TINYINT 0或1.许多框架使用TINYINT数据类型开箱即用,并将其作为布尔值处理。
答案 3 :(得分:0)
创建3个表。第一个是'user_table'。它包含用户名和user_id。样本数据如下:
表创建脚本如下所示
现在创建另一个名为options_table的表。它包含每个选项的option_name和option_id。样品如下:
现在创建一个名为'selected_options'的第三个表。该表将用户映射到选项。它包含user_id和option_id
样品如下:
在上面的示例中,user1选择了option1和option2
和user2为user2选择了option1,option2和option3 ie..option1,option2和option3为真
答案 4 :(得分:0)
我建议使用位掩码列。如果您有多个选项,而不是为每个选项创建一个新列,您将能够快速执行逐位比较。
有关其他信息,请参阅:
SELECT users from MySQL database by privileges bitmask?
Implement bitmask or relational ACL in PHP
Using bitmasks to indicate status