2015-07-12 62 views
0

在PostgreSQL中存储大列表的正确方式是什么?用于存储长列表的数据类型

我目前有一个“用户”表,其中“追随者”列存储该用户拥有的追随者列表。此列表以JSON格式存储,并且每次服务器想要将新用户添加到该列表时,都会从数据库中检索该列表,添加新用户,然后用新列表替换旧列表。

问题是这些列表往往会变得很长,这可能会影响性能。是否可以直接通过SQL直接追加到列表中而不检索并稍后重写?

回答

1

使用一个单独的表追随者。该表至少应有两列:用户标识和关注者标识。此外,为此表提供主键也是一种很好的做法,所以让我们给它一个“ufid”。

如果您的应用程序需要它,您可以执行select以获取所有元素并计算JSON字符串。但不要使用JSON或其他任何列表的字符串表示,因为它会破坏关系数据库的目的。

要添加新的追随者,只需使用用户ID向追随者表添加新记录;删除和更新也是在记录级别上完成的,而无需使用“其他记录”。

+0

谢谢!我原本试图绕过为一列创建一个新表,但我想这是最好的选择。 –

0

如果追随者是作为其帐户主键的整数列表,请将其设置为整数数组int[]。如果他们是用户名或其他字,请使用字符串数组character varying[]

追加到数组列,你可以这样做:

UPDATE the_table SET followers = followers || new_follower WHERE id = user; 
+0

谢谢你的回答!我决定和Schien一起回答,因为这看起来好像是一个更好的大规模实施,但你的也很好! –

+0

谢谢。 Schien的方法适用于增加/删除关系的一般实现,但Postgres具有很好的功能,可以充分利用数组。如果您遇到更复杂的用例,例如“查找所有用户后跟X并且没有跟随Y和Z”,您会注意到JOIN和子查询需要完成的工作是Postgres单行程。 –

相关问题