MongoDB是解决这个多对多问题的错误工具吗?

MongoDB是解决这个多对多问题的错误工具吗?,mongodb,database-design,nosql,Mongodb,Database Design,Nosql,我目前正在设计一个包含以下实体的商店系统: 帐户(百万)、用户名、电子邮件、密码 产品(百万)、标题、说明、评级 帐户可以获得产品的许可证(多对多)。我将有一个页面,在那里我显示了所有的产品许可的一个给定的帐户 当前概念:产品具有一系列许可帐户,因此我可以使用查找(许可帐户:ObjectId(“4d731fe3cedc351fa700002”) 我期待有很多客户。对于流行的产品,该数组可能包含数百万个objectid(12byte*1000000=12MB)。一百万将使该文档的大小接近当前的

我目前正在设计一个包含以下实体的商店系统:

  • 帐户(百万)、用户名、电子邮件、密码
  • 产品(百万)、标题、说明、评级
帐户可以获得产品的许可证(多对多)。我将有一个页面,在那里我显示了所有的产品许可的一个给定的帐户

当前概念:产品具有一系列许可帐户,因此我可以使用
查找(许可帐户:ObjectId(“4d731fe3cedc351fa700002”)

我期待有很多客户。对于流行的产品,该数组可能包含数百万个objectid(12byte*1000000=12MB)。一百万将使该文档的大小接近当前的16MB限制

有没有更好的方法来处理这个问题?还是MongoDB对于这么多关系来说是一个错误的工具?

首先,您应该阅读:

MongoDB和nosql的一个主要功能是。在这种情况下,尚不清楚什么值最好用作分片键

在任何情况下,您都可以使用nosql或关系数据库来解决这个问题。我认为使用联接可以很好地关联帐户和产品。所以我会使用SQL,因为它会减少所需的查询数量

一种从根本上说是nosql的方法是只拥有一个您需要的文档类型集合。然而,如果你需要更新一个产品,你必须进行大量的更改,这更证明这更像是一个关系问题

首先,您应该阅读:

MongoDB和nosql的一个主要功能是。在这种情况下,尚不清楚什么值最好用作分片键

在任何情况下,您都可以使用nosql或关系数据库来解决这个问题。我认为使用联接可以很好地关联帐户和产品。所以我会使用SQL,因为它会减少所需的查询数量

一种从根本上说是nosql的方法是只拥有一个您需要的文档类型集合。然而,如果你需要更新一个产品,你必须进行大量的更改,这更证明这更像是一个关系问题

“联接表”类型的概念如何?您拥有产品、帐户和许可证。许可证有一个产品id和一个帐户id。这样,您就不会支付大量文档的费用,并且仍然可以完成您正在尝试做的事情

Mongo与其他东西之间存在权衡,其中之一是文档数据库中的多对多非常糟糕(权衡是一对多,几乎是免费的)。如果出于报告目的,我会查看每晚(或每周或其他任何时间)的map reduce查询,以将数据转换为使您的工作(和mongos)更轻松的内容。Map reduce非常灵活,您可以告诉它将结果持久化为一个集合,它在集群中也可以很好地扩展,但单节点性能方面非常慢(这就是为什么我会在夜间使用它)

关于“连接表”类型的概念如何?您拥有产品、帐户和许可证。许可证有一个产品id和一个帐户id。这样,您就不会支付大量文档的费用,并且仍然可以完成您正在尝试做的事情

Mongo与其他东西之间存在权衡,其中之一是文档数据库中的多对多非常糟糕(权衡是一对多,几乎是免费的)。如果出于报告目的,我会查看每晚(或每周或其他任何时间)的map reduce查询,以将数据转换为使您的工作(和mongos)更轻松的内容。Map reduce非常灵活,您可以告诉它将结果持久化为一个集合,它在集群中也可以很好地扩展,但是单节点性能方面它非常慢(这就是为什么我会将其作为夜间工作来做)

看这张幻灯片:。有很多样本,有几个备选方案

在您的情况下,您应该将产品ID存储在帐户文档中:

accounts:
  { _id: ObjectId("..."),
    name: "ACME",
    product_ids: [ ObjectId("..."), ObjectId("...")]}
一个产品可以有很多客户,但一个客户应该只有几个产品?不是吗

要显示帐户的所有产品,请执行以下操作:

> db.products.find({_id : {$in: account.product_ids});
请看这张幻灯片:。有很多样本,有几个备选方案

在您的情况下,您应该将产品ID存储在帐户文档中:

accounts:
  { _id: ObjectId("..."),
    name: "ACME",
    product_ids: [ ObjectId("..."), ObjectId("...")]}
一个产品可以有很多客户,但一个客户应该只有几个产品?不是吗

要显示帐户的所有产品,请执行以下操作:

> db.products.find({_id : {$in: account.product_ids});

+1非常多到非常多的问题需要收集,如您建议的许可证收集。但很多人都很容易。我真的希望更多的人在投票后发表评论。我不太在乎分数,但如果我错了,我很想知道为什么,这样我才能修正它。我没有否决你的答案,但如果你需要一些改进的灵感:你的写作风格不令人信服。你的第一段是一个问题——一个不确定的迹象。“Mongo vs other stuff”和“真的很烂”也是模糊的表达。你的答案的可信度和可感知的质量会因此受到影响。我不反对在这些问题上投票,但其他许多人反对。PS:如果你想改进,我建议你阅读Strunk&White。+1很多到很多问题都需要像你建议的许可证收集这样的收集。但很多人都很容易。我真的希望更多的人在投票后发表评论。我不太在乎分数,但如果我错了,我很想知道为什么,这样我才能修正它。我没有否决你的答案,但如果你需要一些改进的灵感:你的写作风格不令人信服。你的第一段是一个问题——一个不确定的迹象。“Mongo vs other stuff”和“真的很烂”也是模糊的表达。你的答案的可信度和可感知的质量会因此受到影响。我不反对在这些问题上投票,但其他许多人反对。附言:如果你愿意,我建议你阅读Strunk&White