我发现如果数组的元素是数据本身,例如标签,PostgreSQL 数组对性能有好处
http://shon.github.io/2015/12/21/postgres_array_performance.html
如果我使用数组作为存储整数外键的方式怎么样?排除外键约束问题,用整数数组存储外键是否可取?
应用应针对报告或分析进行优化。因此,如果应用程序最终会在大多数情况下将数组连接到表中,比如说应用程序需要显示外键的标签/标题/名称,是否仍然可以使用数组来存储外键?
与使用联结表相比,当数组较小时性能会更好吗,比如电影类型整数的复选框?
如果数组以千为单位,不使用数组而只使用联结表性能会更好吗?
最佳答案
不,将 FK 存储在数组中对于通用表来说绝不是一个好主意。首先,您顺便提到了一个事实:未实现数组元素的外键约束(对于 Postgres 14 仍然如此)。仅此一项就应该使这个想法无效。
曾尝试实现 Postgres 9.3 的功能,但因严重的性能问题而停止。看这个thread on pgsql-hackers.
此外,虽然在某些用例中使用数组可以提高读取性能,但写入性能会直线下降。想一想:要从长数组中插入、更新或删除单个元素,您必须使用整个数组编写一个新的行版本。我也看到了严重的锁争用。
如果您的表只读,这个想法开始变得更有意义。但后来我会考虑 materialized view在规范化的多对多实现的之上使用非规范化数组。见:
同时,MV 可以包含所有连接表并生成一个平面表以获得更好的读取性能(对于典型用例)。通过这种方式,您可以获得参照完整性和良好的读取(和写入)性能 - 以管理 MV 的开销和额外存储为代价。
关于arrays - PostgreSQL 数组可以针对连接进行优化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38156345/