在SQL中存储布尔选项

时间:2013-01-17 10:11:51

标签: mysql sql

我正在编写代码(使用MySQL)来解决类似于以下问题:

有20个布尔选项(每个用户)。

我应该存储20 ENUM('false','true')或只将这些选项的ID放入表中(这可能每个用户少于20行)?

5 个答案:

答案 0 :(得分:4)

如果可能出现新选项并且您没有按选项进行过滤,那么您也可以采用EAV结构(每个选项的记录)。

这样,您可以更轻松地添加新选项(无需更改元数据)。

假设选项值为TRUEFALSE(不可能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。样本数据如下:

enter image description here

表创建脚本如下所示

现在创建另一个名为options_table的表。它包含每个选项的option_name和option_id。样品如下:

enter image description here

现在创建一个名为'selected_options'的第三个表。该表将用户映射到选项。它包含user_id和option_id

样品如下:

enter image description here

在上面的示例中,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