如何在Postgres中存储别名数组?

时间:2015-03-20 16:07:21

标签: postgresql

当用户可以拥有多个别名时,为用户添加别名的最佳方法是什么?将严格查询别名作为用户ID的替代。

想象一下,我有一个Users表:

Users
- id

我当然可以创建另一个表Aliases

Aliases
- id
- user_id
- name

但是如何在Users内使用Postgres数组:

Users
- id
- aliases (array)

哪个性能更高?

1 个答案:

答案 0 :(得分:2)

标准化为边桌。在这里做其他事情没有任何理由。

如果使用数组,那么只要用户元组的任何其他字段发生更改,您就可能会重新编写数组。我说"可能"因为较长的数组可能会被挤出到TOAST表中的压缩存储空间,在这种情况下它们可以通过引用进行更新,但是你会失去数据局部性的好处。

更新GiST或(特别是)GIN索引(如果要执行数组成员查询所需的那些)比更新b树要贵得多。查询它们通常也效率较低。这是他们灵活性的代价。

如果您在边桌中存储外线,那么每行开销会支付相当大的(大约28个字节),但您的索引可能会更小更快。您的锁定问题会更少。与使用GIN或GiST查询相比,优化器可以使用简单连接进行更明智的选择,并且可以根据这些选择获得更好的统计信息。您可以正确应用唯一性约束。您的客户端工具将理解该值,而无需特殊的数组处理帮助。这几乎肯定是要走的路。

数组确实有它们的位置,但通常应该是之后调查你已经完成它的基本方式,如果你发现需要非规范化并找到数组的证据可以帮助您解决特定问题。