【问题标题】:mongodb: Embedded only id or both id and namemongodb:仅嵌入 id 或 id 和 name
【发布时间】:2013-11-04 08:26:55
【问题描述】:

我是 mongodb 新手,请建议我如何针对以下情况更正设计模式:

我有用户集合和产品集合。产品包含 id、标题、描述、价格等信息...用户可以收藏或喜欢产品。目前,在用户集合中,我为喜欢的产品存储 1 个数组,为书签产品存储 1 个数组。因此,当我需要查看有关 1 个用户的信息时,我必须读出这 2 个数组,然后在产品集合中搜索以获取喜欢和收藏的产品的标题。

//User collection
{
   _id : 12345,
   name: "John",
   liked: [123, 456, 789],
   bkmark: [123, 125]
}

//Product collection
{
    _id : 123,
    title: "computer",
    desc: "awesome computer",
    price: 12
}

现在我想我可以通过在用户集合中嵌入产品 id 和标题来加快这个过程,这样我就不必在产品集合中搜索,只需读出并显示。但是如果我选择这种方式,每当产品的标题更新时,我也必须在用户集合中搜索和更新。我无法以第二种方式评估更新成本,所以我不知道哪种方式是正确的。请帮我在它们之间做出选择。

感谢和问候。

【问题讨论】:

  • 根据您的用例,您还可以考虑将其翻转并将喜欢或收藏特定产品的用户 ID 添加到产品中。
  • 谢谢,但我认为这不是一个好主意。因为有一段时间很多用户尝试喜欢 1 个产品,然后可能会发生一些奇怪的事情,我不确定如何处理 mongodb 中的竞争条件。
  • 这个问题在 StackOverflow 上被问了很多,并且在 MongoDb 的网站上有很好的记录:docs.mongodb.org/manual/core/data-modeling。您需要根据测试找出在您的系统上有效的方法。

标签: mongodb design-patterns database-design


【解决方案1】:

您应该考虑更频繁发生的情况:产品被重命名或请求用户信息。

您还应该考虑一个更大的问题:用户看到过时的产品名称的时间延迟(我们说的是几秒钟,当您拥有大量用户时可能是几分钟),或者在请求时总是有较长的响应时间用户个人资料。

在不了解您的实际使用模式和要求的情况下,我猜测在这两种情况下都是后者,因此您应该针对这种情况进行优化。

一般来说,不建议像规范化关系数据库那样彻底规范化 MongoDB。原因是 MongoDB 无法执行 JOIN。因此,在多个文档中复制一些相关信息通常不是一个坏主意,同时接受更高的更新成本和潜在的不一致风险。

【讨论】:

  • 谢谢。所以在 mongodb 的世界里有很多权衡。我想我必须更多地习惯它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2018-05-28
  • 1970-01-01
  • 2019-10-03
  • 2012-06-30
  • 2020-12-27
  • 1970-01-01
相关资源
最近更新 更多