MongoDB是否是这个多对多问题的错误工具?

时间:2011-07-29 00:14:42

标签: mongodb database-design nosql

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

  • 帐户(百万),用户名,电子邮件,密码......
  • 产品(百万),标题,描述,评级......

帐户可以获取产品的许可证(多对多)。我将有一个页面,显示给定帐户许可的所有产品。

当前概念:产品拥有一系列许可帐户,因此我可以使用find(licensed_accounts: ObjectId("4d731fe3cedc351fa7000002"))

我期待很多帐户。对于热门产品,该阵列可能包含数百万个ObjectIds(12byte * 1,000,000 = 12MB)。 100万将使该文件接近目前的16MB大小限制。

有没有更好的方法来处理这个问题?或者MongoDB是那么多关系的错误工具?

3 个答案:

答案 0 :(得分:1)

请看这张幻灯片:http://www.10gen.com/presentation/mongosf2011/schemabasics。有许多样本有几种选择。

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

accounts:
  { _id: ObjectId("..."),
    name: "ACME",
    product_ids: [ ObjectId("..."), ObjectId("...")]}

一个产品可以有很多帐户,但一个帐户应该只有几个产品?不是吗?

显示帐户的所有产品:

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

答案 1 :(得分:0)

首先你应该阅读:When to use MongoDB or other document oriented database systems?

MongoDB和nosql的主要功能是sharding的想法。在这种情况下,不清楚什么值最适合用作分片键。

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

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

答案 2 :(得分:0)

“连接表”类型概念怎么样?您有产品,帐户和许可证。许可证具有产品ID和帐户ID。这样你就不会支付大量文件的费用,而且仍然可以完成你想要做的事情。

Mongo vs其他东西有权衡,其中一个原因是文档数据库中有很多人真的很糟糕(权衡是一对多是非常免费的)如果这是为了报告的目的,我会看一夜(或每周或任何其他)map-reduce查询将数据转换为使您的工作(和mongos)更容易的事物。 Map reduce非常灵活,您可以告诉它将结果保存为集合,它也可以在集群中很好地扩展,但是单节点性能明智它非常慢(这就是为什么我会把它作为夜间事物)< / p>