Postgresql计算列

时间:2015-05-07 15:58:48

标签: sql postgresql postgresql-9.4

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

这是一个例子:

表:兴趣

  • id:integer - 主键
  • 名称:兴趣名称 - 唯一
  • 受欢迎程度:兴趣普及

表:用户

  • id:integer - 主键
  • 电子邮件:字符串 - 唯一
  • 兴趣:整数数组 - '兴趣的外键'表

我希望这种受欢迎程度'感兴趣的专栏'由于'用户'而计算的表格表。

表用户

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

表的兴趣

  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]);

但我不想运行查询来更新兴趣表。我的意思是,我希望这个受欢迎程度很高。用户订阅时自动填充的列。

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

  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;

有更有效的方法吗?

2 个答案:

答案 0 :(得分:0)

康斯坦丁的建议是每次用户订阅特定兴趣时使用触发器来增加“兴趣”表中的受欢迎程度。这可能足够有效,直到有太多会话等待对多个会话正在更新的特定兴趣的行级锁定。

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

答案 1 :(得分:0)

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

有一张独立的桌子,当我需要受欢迎时,我只需依靠一个独特的桌子。键。