1

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

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

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

4

5 回答 5

4

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

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

假设选项值是TRUE或者FALSENULL不可能),您应该只为非默认选项值(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
于 2013-01-17T10:23:37.953 回答
3

我建议创建一个Options具有不同选项的表。

+---Options---+
ID
Option

+---Users---+
ID
Name

+---User_Options---+
User_id
Option_id

现在,如果您需要更多选项,请将它们插入Options表中,您不需要以这种方式更改数据库。

编辑:删除:像Quassnoi mensioned一样,conditionuser_options“TRUE”的情况下添加记录会更好,并且没有记录应该被认为是“FALSE”

于 2013-01-17T10:20:16.833 回答
1

我建议存储为 TINYINT 0 或 1。许多框架使用 TINYINT 数据类型开箱即用,并将其作为布尔值处理。

于 2013-01-17T10:17:37.610 回答
0

创建 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

于 2013-01-17T10:26:01.507 回答
0

我建议使用位掩码列。如果您有许多选项,而不是为每个选项创建一个新列,您将能够快速执行逐位比较。

有关其他信息,请参阅:

通过权限位掩码从 MySQL 数据库中选择用户?
在 PHP 中实现位掩码或关系 ACL
使用位掩码指示状态

于 2013-01-17T10:27:19.340 回答