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

Postgresql 如何在Postgres中存储别名数组?,postgresql,Postgresql,当用户可以有许多别名时,向用户添加别名的最佳方法是什么?别名将作为用户ID的替代品被大量查询 假设我有一个Users表: Users - id 当然,我可以创建另一个表,别名: Aliases - id - user_id - name 但是在用户中使用Postgres数组怎么样 Users - id - aliases (array) 哪个性能更好?标准化为边桌。这里没有真正的理由做任何其他事情 如果您使用数组,那么当用户元组的任何其他字段发生更改时,您可能需要重写数组。我之所以说“可能

当用户可以有许多别名时,向用户添加别名的最佳方法是什么?别名将作为用户ID的替代品被大量查询

假设我有一个
Users
表:

Users
- id
当然,我可以创建另一个表,
别名

Aliases
- id
- user_id
- name
但是在
用户中使用Postgres数组怎么样

Users
- id
- aliases (array)

哪个性能更好?

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

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

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

如果您在一个副表中不按行存储,那么每行的开销将相当大(大约28字节),但您的索引可能会更小更快。您将有更少的锁定问题。与GIN或GiST查询相比,优化器可以通过简单的连接做出更明智的选择,并且将有更好的统计数据作为这些选择的基础。可以正确应用唯一性约束。您的客户端工具将理解该值,而不需要阵列处理方面的特殊帮助。这几乎可以肯定是一条路要走


数组确实有它的位置,但通常情况下,当您发现需要反规范化并找到证据表明数组可以帮助您解决某个特定问题时,在您以基本方式完成后,您应该进行调查。

过早优化是万恶之源。喜欢最容易阅读/调试/维护的方法。我100%同意。坦率地说,我正在寻找使用Postgres数组的借口,但我不确定它是否适合我所考虑的(别名)。我认为默认做法是将别名规范化到一个单独的表中。然而,如果你知道你正在寻找一个借口来使用一种有趣的技术,那就称之为“教育”吧。数组比等价行的总和更紧凑,但其中的任何插入/更新/删除值都意味着每次都要重写整个数组,这比行的效率要低得多。@DanielVérit另外,数组列上的GIN或GiST索引查询效率较低,占用更多空间,更新成本也比规范化边表上的b-树高得多。