Postgresql 计算列

Postgresql computed column

我有一个问题,但我没有找到答案。

举个例子:

Table:兴趣

Table:用户

由于 'users' table,我希望计算 'interests' table 的 'popularity' 列。

Table 用户

  id | email           | interests
  0  | toto0.gmail.com | [ 0 ]
  1  | toto1.gmail.com | [ 0, 1 ]
  2  | toto2.gmail.com | [ 1 ]
  3  | toto2.gmail.com | [ 2 ]

Table 兴趣

  id | name         | popularity
  0  | 'interest 0' | 2
  1  | 'interest 1' | 2
  2  | 'interest 2' | 1
  3  | 'interest 3' | 0

我试过这个:

  UPDATE interests SET popularity = (SELECT COUNT(*) from public.users where ARRAY[interests] @> ARRAY[interests.id]);

但我不想运行查询来更新兴趣table。我的意思是,我希望 'popularity' 列在用户订阅时自动填充。

如果我像这样创建一个 'view',它应该能按我的意愿工作吗?

  CREATE VIEW interests_popularity (id, popularity) AS
     SELECT COUNT(1) as popularity, interest.id
     FROM public.user, interest
     WHERE ARRAY[public.user.interests] @> ARRAY[interest.id]
     GROUP BY interest.id;

有没有更有效的方法?

Konstantin 的建议是在用户每次订阅特定兴趣时使用触发器来提高 "interests" table 中的受欢迎程度。这可能足够有效,直到太多会话等待由多个会话更新的特定兴趣的行级锁定。

如果您放弃 table "interests" 上的唯一性约束,您可以使用不会阻止任何内容的插入动态记录新订阅。要获取总体统计信息,您必须执行 SELECT id, count(*) FROM interests GROUP BY id,如果您定期更新整个 table 以重新组合以消除重复项,这对您来说可能足够快。

我已经更改了我的模型来处理这个问题。

有一个单独的table,当我需要通过受欢迎程度获得兴趣时,我只需要指望一个'UNIQUE'键。