2012-04-03 72 views
13

我正在使用一個PostgreSQL數據庫中的表格,該數據庫有幾個確定某些狀態的布爾列(例如published,visible等)。我想創建一個狀態列,以一個位掩碼的形式存儲所有這些值以及可能的新值。在這種情況下,integerbit(n)之間是否有區別?位掩碼的整數和位(n)數據類型之間是否有區別?

這將是一個相當大的表格,因爲它存儲用戶通過網絡界面創建的對象。所以我想我將不得不爲這個列使用(部分)索引。

回答

21

如果你只有幾個變量我會考慮保留單獨的boolean列。

  • 索引很容易。特別還有indexes on expressionspartial indexes
  • 查詢條件易於編寫和閱讀,也很有意義。
  • 一個布爾列佔用1個字節(沒有對齊填充)。只有少數變量佔用最少的空間。
  • 不像其他選項boolean列允許NULL如果你需要這些值,如果你不這樣做,你總是可以定義列NOT NULL

如果你有比手更飽滿變量,但不超過32,一個integer可以提供最佳服務。 (或A爲bigint多達64個變量。)

  • 佔用磁盤上的4個字節(可能需要對齊填充,這取決於前列)。
  • 完全匹配的快速索引(=運算符)。
  • 處理個別值可能比varbitboolean更慢/不方便。

有了更變量,或者如果你要處理的值了很多,或者如果你沒有龐大的表或磁盤空間/ RAM是不是一個問題,或者如果你不知道選擇什麼樣的,我會考慮bit(n) or bit varying(n) (short: varbit(n)

只是稍微3比特的信息,從個人boolean柱用3個字節,一個integer需要4個字節(可能附加的對齊填充)和bit string 6字節(5 + 1)獲得由。

對於32比特的信息,一個integer仍然需要4個字節(+填充),一bit string佔用9個字節爲相同的(5 + 4)和boolean列佔用32個字節。

要優化磁盤空間此外,您還需要了解PostgreSQL的存儲機制,尤其是數據對齊。 More in this related answer

This answer如何改造類型布爾位(N)整數可能有幫助,太。

+0

非常感謝解釋,這正是我需要的!我想我會用一個「整數」列。 – 2012-04-03 13:49:10

相關問題