我正在使用PostgreSQL数据库中的一个表,该数据库有几个布尔列,用于确定某些状态(例如published
,visible
等)。我想创建一个单独的状态列,它将以位掩码的形式存储所有这些值以及可能的新值。在这种情况下,integer
和bit(n)
之间是否存在差异?
这将是一个相当大的表,因为它存储用户通过Web界面创建的对象。所以我想我必须为这个列使用(部分)索引。
答案 0 :(得分:24)
如果您只有一些变量,我会考虑保留单独的boolean
列。
boolean
不同,如果您需要,则列允许单个位的 NULL
值。如果不这样做,您可以随时定义列NOT NULL
。如果您有超过手动完整变量但不超过32 ,则integer
列可能最佳。 (或最多64个变量的bigint
。)
=
运算符)。varbit
或boolean
更慢/更不方便。有更多变量,或者你想要大量操作这些值,或者如果你没有巨大的表或磁盘空间/ RAM不是问题,或者如果你不确定要选择什么,我会考虑bit(n)
or bit varying(n)
(short: varbit(n)
。
对于仅 3位的信息,单个boolean
列得到3个字节,integer
需要4个字节(可能是额外的对齐填充)和{{1 6个字节(5 + 1)。
对于 32位的信息,bit string
仍然需要4个字节(+填充),integer
占用9个字节(5 + 4)和{ {1}}列占用32个字节。
要进一步优化磁盘空间,您需要了解PostgreSQL的存储机制,尤其是数据对齐。 More in this related answer
This answer关于如何转换类型 布尔,位(n)和整数也可能有所帮助。
答案 1 :(得分:1)
您可以将bit string functions直接应用于位字符串,而无需从整数转换。