Postgresql枚举有哪些优缺点?

Jas*_*oor 24 database postgresql

在我工作的地方,我们使用postgres数据库(8.3很快就会迁移到8.4).目前关于在数据库中使用枚举的争论很少.我个人不喜欢db enum类型.除此之外,它还将应用程序逻辑放在数据库中,并为代码和数据之间的不匹配创建了可能性.

我想知道postgres enums的优点究竟是什么(除了readablity)以及有什么不满意?

Mar*_*ark 40

枚举的优点是:

  • 表现更好.您可以只显示从核心表中获取的内容,而不是使用单独的查找表将代码转换为值,或者具有将代码转换为值的应用程序逻辑.这在数据仓库应用程序中尤其有用.
  • Ad hoc SQL更容易编写

缺点是:

  • 将显示值编码到数据库ddl中的形式不好.如果您将应用代码中的枚举值转换为不同的显示值,那么您将失去使用枚举的许多优点.
  • 添加值需要DDL更改
  • 使语言本地化变得困难
  • 数据库可移植性降低

  • 如果您正在定义控件将修改应用程序行为的值,那么肯定"添加值需要DDL更改"是一个优势吗?否则,您将增加显然无害的数据库操作破坏您的应用程序的风险. (4认同)

Jef*_*eff 13

在 PostgreSQL 13 中,btree 索引现在支持重复数据删除。如果我们采用以下实际示例,使用 ENUM 来表示具有 1 亿行的日志表中的 HTTP 方法:

public | test_http_enum_idx | index | postgres | test | permanent   | 789 MB  | 
public | test_http_test_idx | index | postgres | test | permanent   | 789 MB  | 
Run Code Online (Sandbox Code Playgroud)

我们可以看到两者的索引大小是相同的。对于非规范化表,每行节省几个字节并不能真正弥补缺点。

PG 13+ 的经验法则:使用 ENUM 将列限制为固定/静态值集;不要使用它们来节省磁盘空间。

可能的例外: 如果静态值的 ENUM 将帮助您避免昂贵的 JOIN 或 FK --- 那就去做吧;只需确保避免过早优化并在生产中衡量结果即可。

在做出决定时,请考虑流行的 BI 工具(例如 Metabase)不支持对 ENUM 进行过滤,但是它们在 TEXT 列上可以正常工作。@solaris:报告 Metabase 0.42.1 及更高版本支持对 ENUM 值进行过滤。


Den*_*ise 10

枚举结合了整数的优点和字符串的优点:它们像整数一样小而快速,像字符串一样可读,并且具有安全的额外优势(你不能拼错枚举)。

但是,如果您不关心可读性,则 int 与 enum 一样好。


GKi*_*lin 5

作为一个优点,您还可以进行数据库检查,没有其他枚举值无法记录在列中。对我来说最大的缺点是,枚举只能通过在末尾添加值来修改,但从 Postgres 9.1 开始,它已经过去了: https: //stackoverflow.com/a/7834949/548473