我有一张示例表:
+-------------------------------------------------------------------+
| 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 |
+------------------+
有什么建议吗?
答案 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),你需要找到单独的标志吗?
如果不是,您可以尝试通过encoding将标志保存为单个整数字段中的位,从而节省一些存储空间(更重要的是,提高缓存效率)。除非您使用的是旧版本的MySQL,否则请考虑使用BIT(M)。来自documentation的引用:
“此数据类型已添加到MySQL 5.0.3中,用于MyISAM,并在5.0.5中扩展到MEMORY,InnoDB,BDB和NDBCLUSTER。在5.0.3之前,BIT是TINYINT(1)的同义词“