低基数字段:整数或字符串

Jes*_*ose 3 postgresql index database-design datatypes

工单具有以下状态:

new
in_progress
on_hold
closed
Run Code Online (Sandbox Code Playgroud)

我可以创建ticket.status一个字符串 ( on_hold) 或一个唯一的 int( 2)。它被索引。

整数优点:索引中的最小尺寸

Int con:BI 和不断发展的模式的清晰度低(3与 相比closed

String pro:清晰的数据导航

String con:占用更多空间来索引,对于相同的 RAM 性能较低

我想如果字符串索引的基数较低,它不会比 int 索引占用太多空间。如果该字段的基数较低并且不是复合索引的一部分,则选择整数是否过早优化?

我将 Postgres 与 SQLAlchemy、Python ORM 一起使用。

Erw*_*ter 5

我肯定会为大桌子标准化。您可以将带有FK 约束integerorint2列用于查找表。

对于小桌子,您的任何一个想法都可以。如果有疑问,请坚持项目的指导方针。

我会用没有。反而:

  • 对于小表:使用enum. 文档:

    一个枚举值在磁盘上占据四个字节。

  • 对于大表:使用"char"字段(1 字节)作为查找表的 FK。对于非常小的查找值集是一个不错的选择。每个值都可以是引用状态的助记符:

    status_id | status
    ----------+------------
    n         | new
    i         | in_progress
    o         | on_hold
    c         | closed
    
    Run Code Online (Sandbox Code Playgroud)

这也取决于完整的图片。如果无论如何都没有丢失对齐填充,您实际上只会在表和索引中节省空间(并获得性能)。更多的:

对于字符类型(“char”除外),排序规则也可能相关。更多的:

  • 我非常尊重你 Erwin - 你的答案总是正确的,无可挑剔的记录,有时甚至鼓舞人心(好吧,我们不要走得太远:-)),但是你觉得这个[帖子]( http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/)关于枚举类型?我觉得这些论点很有说服力。 (2认同)