【发布时间】:2021-08-23 20:13:22
【问题描述】:
我目前正在构建一个类似论坛的应用程序。用户将能够查看具有总点赞数的最近帖子。如果用户对帖子感兴趣,他们也可以喜欢它并为总点赞数做出贡献。
标准化的方法是有两个表:user_post(contains id, metadata ...)、liked_post(which includes the user id + post id)。当帖子被查询时,点赞数将由liked_post 表上的COUNT() 语句确定,该表按帖子ID 分组。
我正在考虑另一种方法,它不需要在潜在的大桌子上进行分组。那就是在user_post 表中添加一个like_count 列并打破规范化。当插入或删除新的 like_post 条目时,此列将始终更新。这意味着:每次用户喜欢帖子时 -> 将更新 user_post 表(增加 like_count 列)+ 在 liked_post 表中插入/删除实体(使用应用层中的触发器或代码)。
除了一致性问题之外,这种aggregation on the fly 方法是否有任何缺点?这将启用非常简单和快速的选择查询,但我不确定额外的更新是否会成为问题。
你有什么想法? 我真的对性能影响感兴趣,而不是你是否应该从项目开始就这样做。
【问题讨论】:
-
PostgreSQL 中有bloat 效果。所以我建议再创建一个只有两列的薄表:
post_id和like_count。
标签: postgresql database-design relational-database