【问题标题】:Database design for queries that has tons of sql-like join具有大量类似 sql 连接的查询的数据库设计
【发布时间】:2015-08-30 19:03:23
【问题描述】:

我有一个名为 posts 的集合,其中包含多个文章帖子和一个名为 users 的集合,其中包含大量用户信息。每个post 都有一个名为author 的字段,它引用users 集合中的帖子作者。

在我的主页上,我将查询posts 集合并将帖子列表返回给客户端。因为我还想显示帖子的作者,所以我需要执行类似 sql 的连接命令,以便所有帖子都有作者姓名、ID 等。

如果我返回一个包含 40 个帖子的列表,我必须执行 40 个 sqllike-joins。这意味着每次我都会进行 41 次查询以获取包含作者信息的帖子列表。这似乎真的很贵。

我正在考虑在存储帖子信息时存储作者信息。这样我只需要进行 1 次查询即可检索所有帖子和作者信息。但是,当用户信息发生变化(例如名称更改)时,列表就会过时,这样管理列表似乎不太容易。

那么有没有更好或标准的方法呢?

ps:我用的是mongodb

【问题讨论】:

  • 核心文档中有一整节的常见示例和案例。 Data Modelling
  • 是的,感谢我只是让问题变得非常简单。实际情况非常复杂,1 个用户个人资料链接到多个属性,如 pagelikes、reviews、checkins...
  • 例如上面的 40 个帖子是同一作者的。当作者更改名称时,您只需更新帖子 40 次。这似乎很便宜(对我来说)。但我不确定是否有更通用的方法。

标签: mongodb join database-design database


【解决方案1】:

Mongo 是 NoSQL 数据库。根据定义,NoSQL 解决方案是非规范化的(所有必需的数据都应该位于同一位置)

在您的示例中,作者和帖子之间的关系是一对多的,但作者与帖子的比例非常小。简单来说,没有。作者与没有相比。的帖子将非常少。

基于此,您可以安全地将作者信息存储在帖子集合中。

如果您需要查询帖子集合,即如果您知道您的大多数查询将在帖子集合上执行,那么将作者存储在帖子中是有意义的。存储一个属性不会占用很大的空间,但会在查询性能和编码/检索数据的简易性方面产生巨大差异。

【讨论】:

  • 作者改名怎么办?我应该遍历整个帖子集并相应地更新作者信息吗?
  • 还有一位作者可能有1000个帖子。在这种情况下,当他连续 3 次更新他的名字时,那就是 3000 次写入。那么这是否意味着我可能让人们有机会轻松关闭服务器?
  • 如果作者更改了他的姓名,单个更新查询(在 find 子句中带有作者姓名)将在所有地方更新姓名。您不必迭代(类似于 RDBMS)
  • 首先,改名不会那么频繁。偶尔发生一次,可以处理第二个,单个用户平均会有100-200个帖子。因此,偶尔为 100-1000 个帖子更改名称不会导致服务器瘫痪。 (我希望你至少有服务器类硬件 :))
  • 这其实是有道理的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-17
  • 2018-01-13
  • 1970-01-01
  • 2021-08-19
  • 2012-09-08
相关资源
最近更新 更多