表有多个标志

时间:2013-02-22 09:08:52

标签: mysql database database-design

我有一张示例表:

+-------------------------------------------------------------------+
| id | name | flag1 | flag2 | flag3 | flag4 | flag5 | flag6 | flag7 |
+-------------------------------------------------------------------+
| 1  | fred | 1     | 0     | 1     | 1     | 1     | 1     | 1     |
+-------------------------------------------------------------------+

我想知道的是,这是检索这些数据的最有效和最简单的方法吗?

我目前正致力于Enum,它有一些Flag Attribute逻辑。

在这种情况下,如果:

flag1 = 1
flag2 = 2
flag3 = 4
and so on..

我只是用这个设计创建一个表,然后添加另一个表来查找这些值:

+------------------+
| id | name | flag |
+------------------+
| 1  | fred | 125  |
+------------------+

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您可以使用二进制函数将所有标志存储在一个整数字段中以获取/设置不同的位。看到: MySql Bit Functions

该页面上有一些关于此用例的评论。最新的示例显示了读取标志的典型SQL:

SELECT 
SUM(IF(rubrik & 1, 1, 0)) actus,
SUM(IF(rubrik & 2, 1, 0)) shopping,
SUM(IF(rubrik & 4, 1, 0)) utils,
SUM(IF(rubrik & 8, 1, 0)) communication,
SUM(IF(rubrik & 16, 1, 0)) services,
COUNT(user_id) AS total,
FROM preferences p

答案 1 :(得分:1)

  

我想知道的是,这是检索这些数据的最有效和最简单的方法吗?

取决于 tm ;)

你总是有7个旗帜吗?

  1. 如果是,将它们存储在同一行是合适的。
  2. 如果不是,请将标志移动到与“主”表格成N:1关系的单独表格。这样,您就可以轻松更改标志数,而无需向表中添加更多列。
  3. 对于上面的(1),你需要找到单独的标志吗?

    • 如果是,请将它们保存在单独的字段中,以便您可以单独编制索引。但请注意,仅当索引具有足够的选择性时,索引才有用。
    • 如果不是,您可以尝试通过encoding将标志保存为单个整数字段中的位,从而节省一些存储空间(更重要的是,提高缓存效率)。除非您使用的是旧版本的MySQL,否则请考虑使用BIT(M)。来自documentation的引用:

      “此数据类型已添加到MySQL 5.0.3中,用于MyISAM,并在5.0.5中扩展到MEMORY,InnoDB,BDB和NDBCLUSTER。在5.0.3之前,BIT是TINYINT(1)的同义词“