18

我正在使用 PostgreSQL 数据库中的一个表,该表有几个布尔列来确定某些状态(例如publishedvisible等)。我想创建一个状态列,它将以位掩码的形式存储所有这些值以及可能的新值。在这种情况下,integer和之间有什么区别吗?bit(n)

这将是一个相当大的表,因为它存储用户通过 Web 界面创建的对象。所以我想我将不得不为这个专栏使用(部分)索引。

4

2 回答 2

34

如果您只有几个变量,我会考虑保留单独的boolean列。

  • 索引很容易。特别是对表达式部分索引的索引
  • 查询条件易于编写和阅读且有意义。
  • 一个布尔列占用 1 个字节(无对齐填充)。仅对于少数变量,这占用的空间最少。
  • 与其他选项boolean列不同NULL,如果您需要,允许单个位的值。NOT NULL如果不这样做,您始终可以定义列。

如果您有多个完整变量但不超过 32,则integer可能效果最好。(或最多 64 个变量的 a。bigint

  • 在磁盘上占用 4 个字节(可能需要对齐填充,具体取决于前面的列)。
  • 非常快速的精确匹配索引(=运算符)。
  • 处理单个值可能比使用varbit或更慢/更不方便boolean

有更多变量,或者如果您想大量操作这些值,或者如果您没有巨大的表或磁盘空间/RAM 不是问题,或者如果您不确定选择什么,我会考虑bit(n)bit varying(n)(短:varbit(n)

对于仅3 位的信息,单个boolean列需要 3 个字节,integer需要 4 个字节(可能是额外的对齐填充)和bit string6 个字节(5 + 1)。

对于32 位的信息,ainteger仍然需要 4 个字节(+填充),abit string占用 9 个字节(5 + 4),boolean列占用 32 个字节。

要进一步优化磁盘空间,您需要了解 PostgreSQL 的存储机制,尤其是数据对齐。更多在这个相关的答案中。

这个关于如何转换类型的 答案booleanbit(n)integer可能有帮助。

于 2012-04-03T12:45:07.517 回答
2

您可以将位串函数直接应用于位串,而无需从整数转换。

于 2012-04-03T10:53:18.290 回答