【发布时间】:2014-09-12 06:32:09
【问题描述】:
在我的数据库中,我有 tasks 和 comments 表。每个任务都有很多 cmets。
我想创建将由 PostgreSQL 自动更新的 tasks.comments_count 列,因此我可以在选择所有任务时在 O(1) 时间内获得 comments_count(并按其排序/过滤)。
我知道有一些特定于语言的解决方案,例如 ActiveRecord 的 counter cache,但我不想使用它们(我发现它们很脆弱)。我希望 PostgreSQL 处理此类计数器缓存。
我也知道 PostgreSQL 支持触发器,但是它们很难编写和使用(不是一个可靠的解决方案)
理想情况下,它应该是一个 PostgreSQL 扩展或一些我不知道的原生特性。
此类计数器的延迟计算将是一个很大的好处。
【问题讨论】:
-
为什么不只计算查询中每个任务的 cmets 数,而不必在数据库表中维护该数字?另一种选择可能是使用触发器并使用添加或删除的每个新评论更新
tasks.comments_count。 -
@ydaetskcoR 我提供了一个简单易懂的例子。在实际应用中,有多个计数器,并且需要对它们进行高级排序/过滤/分组,因此在查询中计算关联记录并不是一个高效的解决方案。假设将计数器缓存存储在表中是客户端要求。
-
我之前没有遇到过“计数器缓存”,但是,如前所述,如果您想将性能影响转移到写入而不是比读。它也是一种便携式解决方案。
-
“[触发器]很难编写和使用(不是可靠的解决方案)”是什么意思?触发器并不比其他任何东西更难编写或使用。 “懒惰的计算”是什么意思?
标签: performance postgresql caching