Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 具有多个标志的表_Mysql_Database_Database Design - Fatal编程技术网

Mysql 具有多个标志的表

Mysql 具有多个标志的表,mysql,database,database-design,Mysql,Database,Database Design,我在下面有一个示例表: +-------------------------------------------------------------------+ | id | name | flag1 | flag2 | flag3 | flag4 | flag5 | flag6 | flag7 | +-------------------------------------------------------------------+ | 1 | fred | 1 | 0

我在下面有一个示例表:

+-------------------------------------------------------------------+
| id | name | flag1 | flag2 | flag3 | flag4 | flag5 | flag6 | flag7 |
+-------------------------------------------------------------------+
| 1  | fred | 1     | 0     | 1     | 1     | 1     | 1     | 1     |
+-------------------------------------------------------------------+
我想知道的是,这是检索这些数据最有效、最简单的方法吗

我目前正在研究一个有一定逻辑性的

在这种情况下,如果:

flag1 = 1
flag2 = 2
flag3 = 4
and so on..
我将使用此设计创建一个表,然后添加另一个表以查找这些值:

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

有什么建议吗?

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

该页面上有一些关于这个用例的评论。最新的示例显示了读取标志的典型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,0))实际值, 购物总额(如果(卢比和2,1,0)), 总和(如果(卢比和4,1,0))UTIL, 和(如果(rubrik&8,1,0))通信, 总额(如果(卢比和16,1,0))服务, 将(用户id)计数为总数, 来自首选项p 我想知道的是,这是检索这些数据最有效、最简单的方法吗

Dependstm;)

你总是有7面旗子吗

  • 如果是,则将它们存储在同一行中是合适的
  • 如果否,则将标志移动到与“main”表具有N:1关系的单独表中。这将使您能够轻松地更改标志的数量,而无需向表中添加更多列
  • 对于上面的(1),是否需要查找单个标志

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

      此数据类型是在MySQL 5.0.3中为MyISAM添加的,并在5.0.5中扩展到内存、InnoDB、BDB和NDBCLUSTER。在5.0.3之前,BIT是TINYINT(1)的同义词