2012-04-03 71 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

相关问题