AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 313863
Accepted
Lance
Lance
Asked: 2022-06-29 10:29:16 +0800 CST2022-06-29 10:29:16 +0800 CST 2022-06-29 10:29:16 +0800 CST

以事务方式创建/编辑许多相互关联的记录时要采取的方法?

  • 772

所以我认为我有一个相当复杂的系统,它正在开始出现。写出所有表格太复杂了,但这里是一个简短的描述。

基本上我正在为帖子创建一个像 StackOverflow 这样的徽章系统。你有这些类型的表:

  • 用户
  • 帖子
  • 事件(保存到数据库,以便您知道每个重要事件何时发生)
  • user_statistics(徽章计数汇总等)
  • post_statistics(帖子上的操作计数汇总,“已编辑 20 次”)
  • user_badges(授予用户徽章)
  • 徽章类型

然后假设您“更新帖子”。这是发生的事情:

  • 帖子记录已更新
  • 接下来会创建事件记录,上面写着“更新操作”,只有在它不存在时才会创建,否则它会重用相同的更新事件(以免防止向系统发送垃圾邮件)。它与帖子 ID 和用户 ID 相关联。
  • 更新用户统计信息以计算新事件(如果已创建)。可能有多个统计信息需要更新,因为这些统计信息可能仅限于某些类别(例如特定语言的所有帖子)
  • 如果统计数据达到阈值,则检查我们是否需要创建一个徽章或潜在的多个徽章,然后创建徽章。
  • 可能会创建通知记录。
  • 可能还有其他一些事情,例如提升站点上的权限,因为他们有更多的声誉,等等。
  • 所有这一切都需要成功,所以没有什么可以做的(所有计数都是正确的,并且徽章被正确授予)。

您如何在 PostgreSQL 中适当地完成此任务?在我的具体情况下,似乎有大约 10 个表被查询,至少 5 个表被修改(创建或更新记录)。所有这些在理论上应该是原子的,在一个事务中,但是打包到一个事务中似乎很多,特别是如果你有这些“事件”在一秒钟内多次出现。

我能想到的唯一可能解决这个问题的初始方法是 使用队列和后台作业。上述每个步骤都将在事务之外按顺序完成,步骤之间可能存在时间间隔。所以会有一个中间状态,事情是不一致的。但最终(理论上似乎),队列将运行并重试直到成功,并进入正确的状态。这应该怎么做?

如果不是,是否可以在每个事件上进行单一交易的复杂性?我不知道,我不认为实施徽章和这些计数器的解决方案会变得如此复杂,但每个事件都有很多需要考虑和做的事情。基于您构建可扩展数据库系统的专业知识,我正在寻找任何指向正确方向的指针。

假设这个系统一定是这么复杂,因为我在理论上真的是在问如何处理复杂的事务需求。也就是说,如果您知道一种对徽章系统进行建模的理想方法,那会很高兴知道,但不会真正解决问题的主要部分。感谢您的帮助!

目前,就我的目的而言,一切都可以被认为适合单台机器,而不是分布在多个数据库中。

postgresql transaction
  • 1 1 个回答
  • 25 Views

1 个回答

  • Voted
  1. Best Answer
    J.D.
    2022-06-30T04:11:03+08:002022-06-30T04:11:03+08:00

    同意 Charlieface 在评论中的观点,原因如下:

    1. “特别是如果你有这些“事件”在每秒多次出现“-如果整个事务只需要 10 毫秒的运行时间,你可以让这些事件每秒发生 100 次并且 0 阻塞争用。大多数查询在针对正确索引的表进行正确架构时,执行时间不应超过几毫秒到几百毫秒。

    2. “可以在每个事件上进行这种复杂的单一交易吗? ” - 是的。但是,当有第三种选择 - 多个事务时,您似乎只提到了涉及全部或全部事务的解决方案。您应该只将需要立即在事务上保持一致的对象放在同一个事务中。因此,根据您描述的工作流程,我会说事务可以包装记录的更新Post和创建Event。第二个事务可以只包装不同统计表的更新以及这些统计信息的相关操作,例如创建Badge和创建Notification给用户。第三个事务可以处理确保所有相关表更新的特权更改是原子的。

    3. 此外,就 Charlieface 而言,汇总和统计数据通常不需要在 100% 的时间内 100% 准确。如果您遵循我之前观点的事务模式,并且在极少数情况下更新统计表的事务失败,您仍然应该每晚(或任何有意义的节奏 - 可以是每小时,可以是每周等)重新计算这些统计数据以解决任何后果的工作。这样您就可以两全其美:大多数情况下数据是原子准确的,在极少数情况下并非如此,最终会如此,而且通过将单个事务分解为多个将锁定所有事务的较小事务来提高工作流程性能当进程运行时,这些数据库对象的时间范围甚至更短。

    • 1

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve