Mongo 架构设计

Posted

技术标签:

【中文标题】Mongo 架构设计【英文标题】:Mongo Schema Design 【发布时间】:2011-11-18 10:55:07 【问题描述】:

我对 Mongo 还是很陌生。刚开始一个项目,使用MongoDB作为数据库。 我不确定我应该如何将以下用例设计到文档库。

用户案例 1. 供应商/分销商在我们的系统上有一个产品列表。 2. 每个客户都有一个标准的价格表。 3.供应商/分销商还为每个客户定制了每种产品的价格表。 例如。 CustA 有一个产品 A,其定价与标准不同,并且仅供他使用。 4. 部分商品只能通过customize price 获得,我匹配那些带有public = false 属性的商品。

我应该如何在文档库中解决这个问题? 我目前的设计是。 1. [产品文档]内嵌标准价目表文档。 2. [Product_Price Document] 与 oneToMany 链接 [Product Document] 和 oneToMany 到 [Customer Document] 3. [客户文件]。

使用此模型,我在通过分页查询时遇到问题。 示例我查询按名称排序的前 30 个产品。然后使用匹配的 30 个 ProductId 查询 [Product_Price Document],这样我就可以为登录的客户定制价格。

问题出在我无法查询为用户定制的项目,这些项目并非对所有人都可用。

有没有更好的方法或设计架构或我应该如何处理查询?

我正在使用 php、Doctrine2、Symfony2

【问题讨论】:

在这种情况下,您应该为每个客户嵌入一个价目表,使用产品价目表作为其初始版本。从那时起,仅查询客户价目表。数据重复有点痛苦,但在非关系模式中很难避免。复制允许获取单个文档,这提供了高性能。以 MongoDB 格式 (JSON) 输入您想要的架构并将其添加到您的问题中,我将看看编辑它以允许您需要的查询。 【参考方案1】:

当您查询 Product_Price_Document 时,请同时使用 ProductID 和当前 CustomerID。还是我错过了什么?

【讨论】:

感谢巴沙尔阿卜杜拉的回复!是的,我正在使用 ProductId 和 CustomerId 查询 Product_Price_Document。 在我看来你应该在这里得到你想要的结果。但是看看其他 cmets 和答案,它们暗示嵌入式文档可能根本不是坏选择。【参考方案2】:

这是我的结构。

有两个集合: - 产品 - 供应商

您的产品表将包含所有产品及其标准价格的列表。您的供应商页面将包含一系列产品 ID 以及覆盖价格,以防他们对该特定产品有不同的价格。

如果您还跟踪客户,那么您也可以将其设为一个集合,并且几乎与供应商具有归属关系。

简而言之:

collection.vendor:
 "name":'foo',"products":["_id":mongoId,"priceOveride":15.50,..]

collection.products:
 "name":"bar","price":15.40

深入了解您可以使用的关系的优秀资源: Learn Mongo Interactively

【讨论】:

感谢 Frederico 的反馈。和链接!!通过 Mongo 了解更多信息。还有一个快速的问题。如果 product_priceOverride 有多个,因为每个客户可能有不同的价格。如何仍将客户链接到嵌入式 priceOverride?还是有可能? 啊,如果每个客户都有价格覆盖;然后我会把它放在用户集合中。

以上是关于Mongo 架构设计的主要内容,如果未能解决你的问题,请参考以下文章

BaseMongo基类设计

58同城高级系统架构师带你实战MongoDB集群分布式存储

架构师成长之路:到底啥是架构设计?该如何理解架构设计?

小议软件架构设计要点

架构设计-架构设计原则

系统架构设计师第七章 软件架构设计