Jas*_*oor 24 database postgresql
在我工作的地方,我们使用postgres数据库(8.3很快就会迁移到8.4).目前关于在数据库中使用枚举的争论很少.我个人不喜欢db enum类型.除此之外,它还将应用程序逻辑放在数据库中,并为代码和数据之间的不匹配创建了可能性.
我想知道postgres enums的优点究竟是什么(除了readablity)以及有什么不满意?
Mar*_*ark 40
枚举的优点是:
缺点是:
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 一样好。
作为一个优点,您还可以进行数据库检查,没有其他枚举值无法记录在列中。对我来说最大的缺点是,枚举只能通过在末尾添加值来修改,但从 Postgres 9.1 开始,它已经过去了: https: //stackoverflow.com/a/7834949/548473
| 归档时间: |
|
| 查看次数: |
10960 次 |
| 最近记录: |