我正在使用一个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