【问题标题】:PostgreSQL logic/query for user LIKES用户 LIKES 的 PostgreSQL 逻辑/查询
【发布时间】:2021-10-28 15:16:09
【问题描述】:

我是 postgreSQL 的新手,我想将字段递增 1 或递减 1(类似于 firestore FieldValue.increment(1))

场景:假设一个帖子(表格中的列)的值为 10,并且有 5 个用户尝试同时将其增加 1。我希望更新后的帖子值为 15 而不是 11。如何使用 postgreSQL 做到这一点?

技术栈:PostgreSQL Express NodeJS React

提前致谢。

【问题讨论】:

  • 可能不应该将“喜欢”存储在单个标量值中 - 相反,您应该有一个表来存储每个喜欢 +1 或不喜欢 -1 的被添加。您可以通过在该表上执行SUM 获得实际分数(按帖子过滤)。为了提高性能,您将使用包含缓存数据的索引视图或行,这些数据将由您的 RDBMS 自动从 SUM 复制。我建议你完成一门数据库理论课程(尤其是数据库表规范化)。
  • 感谢您的评论伙伴,它很有帮助。但是有没有其他方法可以做到这一点,因为听说我正在创建一个新表只是为了存储喜欢。

标签: sql node.js postgresql


【解决方案1】:

你想知道谁喜欢什么,对吧?否则,有人可能会“喜欢”两次或“不喜欢”他们从不喜欢的东西。

所以有一个表来存储一个人对这样的帖子的喜欢:

CREATE TABLE likes (
   person_id bigint REFERENCES persons NOT NULL,
   post_id bigint REFERENCES posts NOT NULL,
   PRIMARY KEY (person_id, post_id)
);

CREATE INDEX ON likes (post_id);

每个“喜欢”都是该表中的一个条目。

主键保证没有人可以多次“喜欢”同一个帖子,而索引可以快速找到所有喜欢某个帖子的人。

关系数据库的事务保证将确保即使两个人同时插入一行,也只有一个人会成功。

您可以像这样找到所需的计数:

SELECT count(*)
FROM likes
WHERE post_id = 12345;

【讨论】:

  • 读者练习:添加对不喜欢的支持:)
  • 感谢您的回答。我还有一个问题,但与这个增量无关。我可以在 postgreSQL 中有多少个表。如果我创建 500 个表会降低性能。
  • 表的数量对性能的影响很小(是的,正确识别表需要微秒的开销),性能取决于它们的访问方式。 BTW 500 个表是一个相对较小的数据库。
  • 500 张桌子没问题。但问题是有道理的:一旦进入 10000 次,一些元数据查询(这很重要)的性能就会受到影响。
  • @LaurenzAlbe 我认为自己很幸运,但我从未遇到过包含超过 100 个表左右的生产数据库。如果一个数据库有 500 多个表,这表明该应用程序可能正在经历范围蔓延——或者有人在他们的 SSIS 工作完成后忘记删除他们的 ETL 表。原谅我想象力不够,但是什么样的数据模型需要500+表来存储数据呢? (我认为它已正确规范化?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 2013-05-12
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
  • 2011-10-19
  • 2021-12-03
相关资源
最近更新 更多