2013-05-03 74 views
5

我有一個用戶及其權限數據庫。例如,一排是這樣的:位掩碼與單獨列

Name | sendMessages | receiveMessages | post | readPosts 
------------+--------------+-----------------+------+---------- 
Jeff Atwood |  1  |  1  | 0 |  1 

什麼是這個情況較好,單獨的列(如示例)或單個列,其中包含一個位掩碼(在這種情況下,1101轉化爲0xD)?

+5

爲了查詢目的,絕對要分開的列。除非存儲空間是真實世界的問題,否則我會去那個 – 2013-05-03 16:43:09

+0

如果你認爲你將擁有比適合你的mask列更多的特權,事情會變得非常難看。如果每個權限有一列,那麼閱讀可能也更容易。我肯定會去與單獨的列 – nurdglaw 2013-05-03 16:44:35

回答

9

tinyint(1)作爲布爾值是最好的方法。

這樣做有位掩碼查詢效率不高,因爲它無法使用索引,如果有來計算的話 或會變得非常討厭,如果你試圖用指數的

讓我們看一下簡單的查詢

select * from tbl where sendMessages = 1 and readPosts = 1 

隨着一列,這將是:

select * from tbl where val&9 = 9 

這是不是真的有效,因爲它必須做全表掃描和計算。

讓我們嘗試重寫查詢,以便它可以使用索引。 這可以通過IN列出所有可能的值來完成:

select * from tbl where val in (9, 11, 13, 15) 

現在想象如何將這個查詢一下,如果你想要做的簡單where readPosts = 1

但是,如果你列出太多價值的MySQL優化器仍然會做全表掃描

+4

這個規則的例外是如果你有幾百或幾千位不直接查詢。 – tadman 2013-05-03 16:46:17

+1

感謝您的評論。總是有例外。 n =幾百或幾千個需要多少列? N/64? – 2013-05-03 17:12:20

+1

如果每個「位」是一列,那麼大概有多少列與你有位相同。在某個時候,你的模式不再有任何意義。 – tadman 2013-05-03 17:24:21

8

如何不使用列權限,但創建一個權限表和用戶權限鏈接表?

+0

我沒有看到優勢。 – 2013-05-03 16:56:33

+2

@Giulio它允許添加,修改和刪除權限,而無需更改您的數據模型。它可以使easyer查詢,您不必更改列名稱,但可以更改傳遞給WHERE子句的參數。還有很多正常化的好處。 – CodeCaster 2013-05-03 17:00:06

+1

@GiulioMuscarello請參閱:http://stackoverflow.com/questions/9774715/mysql-multiple-tables-or-one-table-with-many-columns每個方法都有專業人員和缺點。通過權限/角色,應用規範化實踐通常是安全的。當您開始超過40,000條規範化記錄時,在加入操作期間,您通常會增加查詢時間。 – fyrye 2015-01-30 17:53:23

0

使用位掩碼,您不能使用第一位或最後一位0和(31位32位下注/ 63位64位???),但可以通過pow(2位)輕鬆搜索& field = pow(2,位)

如果需要超過1場可以再應付你不得不開始使用多個字段,然後你進入工作了的痛苦字段中輸入位被設置。

這可以很容易地通過一個簡單的例程來克服你正在查找的位和有問題的字段或行,返回真或假。

但是對於權限,最好是@CodeCaster所說的使用權限表和鏈接表。

1

最好將數據類型爲BIT的權限作爲單獨的列存儲。大多數現代的數據庫引擎優化位列存儲:

  • 長達表中的8個列,列存儲在1個單字節。
  • 9和16位的列,列存儲在2個字節,

因此,它充分利用了您列出兩個選項。通過位屏蔽所需的存儲量更少,同時保持多列的清晰度。發動機爲你照顧它。