我正在使用一個PostgreSQL數據庫中的表格,該數據庫有幾個確定某些狀態的布爾列(例如published
,visible
等)。我想創建一個狀態列,以一個位掩碼的形式存儲所有這些值以及可能的新值。在這種情況下,integer
和bit(n)
之間是否有區別?位掩碼的整數和位(n)數據類型之間是否有區別?
這將是一個相當大的表格,因爲它存儲用戶通過網絡界面創建的對象。所以我想我將不得不爲這個列使用(部分)索引。
我正在使用一個PostgreSQL數據庫中的表格,該數據庫有幾個確定某些狀態的布爾列(例如published
,visible
等)。我想創建一個狀態列,以一個位掩碼的形式存儲所有這些值以及可能的新值。在這種情況下,integer
和bit(n)
之間是否有區別?位掩碼的整數和位(n)數據類型之間是否有區別?
這將是一個相當大的表格,因爲它存儲用戶通過網絡界面創建的對象。所以我想我將不得不爲這個列使用(部分)索引。
如果你只有幾個變量我會考慮保留單獨的boolean
列。
boolean
列允許NULL
如果你需要這些值,如果你不這樣做,你總是可以定義列NOT NULL
。如果你有比手更飽滿變量,但不超過32,一個integer
列可以提供最佳服務。 (或A爲bigint
多達64個變量。)
=
運算符)。varbit
或boolean
更慢/不方便。有了更變量,或者如果你要處理的值了很多,或者如果你沒有龐大的表或磁盤空間/ 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)和整數可能有幫助,太。
您可以將bit string functions直接應用於位串,而無需使用整型轉換。
非常感謝解釋,這正是我需要的!我想我會用一個「整數」列。 – 2012-04-03 13:49:10