【问题标题】:Handling multiple users concurrently populating a PostgreSQL database处理同时填充 PostgreSQL 数据库的多个用户
【发布时间】:2020-07-06 13:45:05
【问题描述】:

我目前正在尝试构建一个允许许多用户查询外部 API 的 Web 应用程序(由于各种原因,我无法定期检索此 API 提供的所有数据以填充我的 PostgreSQL 数据库)。我已经阅读了几篇关于 ACID 和 MVCC 的文章,但我仍然不确定如果多个用户同时填充/读取我的 PostgreSQL 数据库不会有任何问题。所以在这里我征求意见(我对这个领域很陌生)!

假设我的用户查询外部 API 以检索文章。他们通过表单进行搜索,后端获取它,查询 api,填充数据库,然后查询数据库以将一些数据返回给前端。

  • 是否可以简单地创建一个唯一的表来存储用户查询时 API 返回的文章?
  • 我是否应该存储 API 返回的文章并将每篇文章与请求它的用户相关联(文章模型将包含到用户模型的外键映射)?
  • 或者我应该给每个用户一个表(数据隔离会很好,但听起来效率很低)?

感谢您的帮助!

【问题讨论】:

  • 使用数据库而不是直接提供 API 响应的原因是什么?性能、可靠性、统计、分页、用户将数据保存在他们的配置文件中,...?
  • 消除第三个选项;可能效率低下,绝对是维护的噩梦。您对其他选项的需求取决于其他处理要求。如果您需要创建本地副本或需要跟踪查看了哪些文章,您将需要第一个选项。您是否还需要跟踪哪些用户查看了哪些文章和/或用户关于他们的信息。在这种情况下,最好创建第三个表 User_Article (左右)。此表将包含用户和文章表的 FK,以及组合所需的任何数据 - 例如 cmets。
  • @KevinLanguasco 许多指标与每篇文章相关联,可能有很多文章需要检索。我需要在返回文章之前计算一些 KPI(它们用于填充一种仪表板)。即使使用 ajax 从用户端查询 api,我仍然需要在后端处理东西,使用数据库似乎更快更容易。不过,如果您有一些资源来描述如何在 Django 中执行此类操作,我很乐意更改我的代码!

标签: django postgresql django-models database-design database-concurrency


【解决方案1】:

是否可以简单地创建一个唯一的表来存储用户查询时 API 返回的文章?

是的。如果文章具有唯一键(doi?),您可以使用 INSERT...ON CONFLICT DO NOTHING 来处理(可能非常罕见)两个人几乎同时请求一篇文章的情况。

我是否应该存储 API 返回的文章并将它们中的每一个关联到请求它的用户(文章模型将包含到用户模型的外键映射)?

你想要吗?有理由吗?你关心谁要求每篇文章吗?听起来您希望只存储第一个请求每篇文章的人,而不是每个请求?

或者我应该给每个用户一个表(数据隔离会很好但听起来效率很低)?

没错,您会更频繁地访问 API(假设大部分文章被多次请求)并存储大量重复项。如果一个人连续两次点击“提交”,或者打开了多个标签,或者编写了一个机器人来并行点击您的服务,它甚至可能无法解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 2020-07-10
    • 2019-07-15
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    相关资源
    最近更新 更多