Postgresql 计算列
Postgresql computed column
我有一个问题,但我没有找到答案。
举个例子:
Table:兴趣
- id: 整数 - 主键
- 名称:兴趣名称 - 唯一
- popularity:兴趣流行度
Table:用户
- id: 整数 - 主键
- 电子邮件:字符串 - 唯一
- 兴趣:整数数组 - 'interests' 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'键。
我有一个问题,但我没有找到答案。
举个例子:
Table:兴趣
- id: 整数 - 主键
- 名称:兴趣名称 - 唯一
- popularity:兴趣流行度
Table:用户
- id: 整数 - 主键
- 电子邮件:字符串 - 唯一
- 兴趣:整数数组 - 'interests' 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'键。