0

我在下面有一个示例表:

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

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

我目前正在研究具有一些标志属性逻辑的​​ Enum 。

在这种情况下,如果:

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

我将使用此设计创建一个表,然后添加另一个表以查找这些值:

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

有什么建议么?

4

2 回答 2

1

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

该页面上有一些关于此用例的评论。最新的是一个很好的例子,展示了一个典型的 SQL 来读取标志:

选择
SUM(IF(rubrik & 1, 1, 0)) 动作,
SUM(IF(rubrik & 2, 1, 0)) 购物,
SUM(IF(rubrik & 4, 1, 0)) 实用程序,
SUM(IF(rubrik & 8, 1, 0)) 通信,
SUM(IF(rubrik & 16, 1, 0)) 服务,
COUNT(user_id) AS 总数,
FROM 偏好 p
于 2013-02-22T09:37:09.240 回答
1

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

取决于tm ;)

你总是有 7 个标志吗?

  1. 如果是,则将它们存储在同一行中是合适的。
  2. 如果不是,则将标志移动到与“主”表具有 N:1 关系的单独表中。这将使您能够轻松地改变标志的数量,而无需向表中添加更多列。

对于上面的(1),你需要找到单独的标志吗?

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

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

于 2013-02-22T14:08:57.630 回答