2012-02-15 14 views
0

我有一張表,有可能有很多不同的標誌。處理這個問題的最好方法是什麼?如何設計大量不同的數據庫標誌的模式

這裏是選擇我想出了與留在主表中的一些標誌

  1. 多很多一對多表
  2. 一個通用多到多臺被稱爲TableAttributes或標誌是用於所有表格標誌。更多的處理在代碼中留下
  3. 一切如表本身就是一個標誌(導致巨大的表)

其他想法?

+0

就個人而言,如果需要這些標誌的表總數很少(如10以下),我會傾向於選項#1(主表中剩下的*無*標誌除外)。除此之外,我會選擇#2。 – aroth 2012-02-15 22:46:29

回答

1

兩個問題:

  • 是一個標誌預定
  • 您需要登錄到搜索

假設標誌預定,你需要這樣的事:

enter image description here

的標誌「設置」,爲給定的項目,如果相應的行出現在FLAG表和「重置」,如果該行不存在。如果您需要區分「NULL」和「reset」,則可以添加FLAG_VALUE字段。

該結構有效地回答以下問題:「給定一個項目,它有哪些標誌?」。如果這是您所需要的,您可以避免使用二級索引,並創建表clustered(也就是Oracle中的「索引組織」)。

另一方面,如果您還想(有效)回答問題:「給定一個標誌,哪些項目設置了它?」,您應該在{FLAG_NAME}上添加索引,或者在{FLAG_NAME, ITEM_ID}上添加索引covering index(這不幸使得集羣不太理想)。


如果所有預定標誌,簡單地表示每個標誌作爲一個單獨的列。將需要搜索的那些索引,如果數據庫支持,可能使用位圖索引,並且修改性能要求允許。

您可以使用位圖將標誌更緊密地打包在不能高效表示布爾值的數據庫(如Oracle)上並可能使用function-based indexes

1

我過去使用的方法是利用位圖。這些可以作爲簡單的整數或大整數列建模到表中。然後,您可以靈活地更改和執行通過代碼使用的標誌,而無需更改數據庫模型。

例如,2個值的簡單的電源是您的標誌:1,2,4,8和16

select 1 | 2 | 4 | 8 | 16 
Result: 31 

你的標記欄會簡單地存儲值31時的所有5個標記是有效的。您可以檢查是否標誌是活性的,BITAND:

select 1 where 31 & 4 = 4 
Result: 1 

在這種情況下,我們知道該標誌位4是有效的。在SQL代碼中使用位圖很容易,當然在客戶端應用程序中,按位數學是語言的一個組成部分。位圖可以在枚舉中進行編碼,並可以在客戶端代碼中輕鬆引用,並可以使用常量存儲過程。

+0

我見過這種方法,我不喜歡它的事情是很難找出表中的數據,而不運行按位樣式的查詢 – chobo 2012-02-15 23:10:09

+0

@chobo這是很容易覆蓋表與視圖將位圖標準化爲列,但除了創建它的DBA之外,很少有人正在查看原始表格數據。 – tawman 2012-02-15 23:12:25