我目前正在设计一个包含这些实体的商店系统:
帐户可以获取产品的许可证(多对多)。我将有一个页面,显示给定帐户许可的所有产品。
当前概念:产品拥有一系列许可帐户,因此我可以使用find(licensed_accounts: ObjectId("4d731fe3cedc351fa7000002"))
。
我期待很多帐户。对于热门产品,该阵列可能包含数百万个ObjectIds(12byte * 1,000,000 = 12MB)。 100万将使该文件接近目前的16MB大小限制。
有没有更好的方法来处理这个问题?或者MongoDB是那么多关系的错误工具?
答案 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>