2013-02-22 55 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