2013-02-22 52 views
0

下面我有一个示例表:表具有多个标志

+-------------------------------------------------------------------+ 
| 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 | 
+------------------+ 

有什么建议?

回答

1

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

取决于TM;)

你总是正好为7米的标志吗?

  1. 如果是,将它们存储在同一行是适当的。
  2. 如果否,则将标志移动到与“主”表N:1关系的单独表中。这将使您可以轻松更改标志数量,而无需在表格中添加更多列。

对于上述(1),您是否需要查找单个标志?

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

    “这个数据类型在MySQL 5.0.3对MyISAM加入,并在5.0.5到内存扩展时,InnoDB,BDB和NDBCLUSTER 5.0.3之前,BIT是一个代名词TINYINT(1)“

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