我正在编写代码(使用 MySQL)来解决类似于以下的问题:
有 20 个布尔选项(每个用户)。
我应该存储 20ENUM('false','true')
还是只将这些选项的 ID 放入表中,这些选项是正确的(因此每个用户可能少于 20 行)?
如果可能会出现新选项并且您没有按选项过滤,那么您也可以使用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
我建议创建一个Options
具有不同选项的表。
+---Options---+
ID
Option
+---Users---+
ID
Name
+---User_Options---+
User_id
Option_id
现在,如果您需要更多选项,请将它们插入Options
表中,您不需要以这种方式更改数据库。
编辑:删除:像Quassnoi mensioned一样,condition
在user_options
“TRUE”的情况下添加记录会更好,并且没有记录应该被认为是“FALSE”
我建议存储为 TINYINT 0 或 1。许多框架使用 TINYINT 数据类型开箱即用,并将其作为布尔值处理。
创建 3 个表。第一个是 'user_table' 。它包含用户名和 user_id。样本数据如下
表创建脚本如下
现在创建另一个名为 options_table 的表。它包含每个选项的 option_name 和 option_id。示例如下
现在创建第三个名为“selected_options”的表。该表将用户映射到选项。它包含 user_id 和 option_id
示例如下
在上面的例子中 user1 选择了 option1 和 option2
和 user2 选择 option1,option2 和 option3 即..option1,option2 和 option3 对于 user2 是 true
我建议使用位掩码列。如果您有许多选项,而不是为每个选项创建一个新列,您将能够快速执行逐位比较。
有关其他信息,请参阅: