2013-02-26 61 views
0

好吧,我会开始说我不是新手,但我正在寻找最佳的解决方案。什么是这个数据最好的MongoDb模式

我有4路的关系,为简单起见:

Busines 
{ 
bid: unique, 
name: string 
} 

Client 
{ 
cid: unique, 
name: string 
} 

Product 
{ 
pid: unique, 
name: string 
} 

Order 
{ 
oid: unique, 
bid: FK, 
cid: FK, 
pid: FK 
} 

什么将是蒙戈打造最好的方法?

请注意,相同的客户端也可以在许多业务和相同的产品中使用。

因此有时我需要通过客户的所有订单进行选择,并将数据按业务和其他时间按产品分组。

回答

1

考虑您的评论:

我同意,但问题是在速度和MongoDB的分片/复制是更好的那么MySQL例如...而我将有小幅整理的大量的元素(百万)和这里的RDBS都会有它的缺点... :(

我相信你看这是错误的。MongoDB的只会比一个RDBMS更快,如果它适合您的方案以这样的方式使其更快。

数以百万计的行甚至没有值得在大多数数据库中的碎片,甚至商品服务器可以处理至少几TB的信息。分片来自需要增加写入容量,就像它在RDBMS技术中所做的那样,而不是从数据的大小来决定。

但是作为回答架构的问题,我会离开它,因为它是目前除我会删除订单和更换客户端里面:

{ 
    _id: ObjectId(), 
    name: 'sammaye', 
    orders: [ 
     {oid:{},bid:{},cid:{},pid:{}}, 
     { //etc } 
    ] 
} 

这是一个小而麦格对象,不应该造成太多问题,并且不会每天增加100个,所以不应该导致严重和立即的碎片化。

如果您发现它确实会导致您的流量和订单费率出现碎片,您可以随时使用两种尺寸分配(http://docs.mongodb.org/manual/reference/command/collMod/)的功率来帮忙,但是我应该警告这实际上在短期内表现较差,所以不要无需使用此选项。

也就是说,您提供给我们的信息。我将如何设计该模式。

+0

首先,我同意你上面的评论,关于信息的大小,我也有数据库,可能不是TB,但有一个GB,但我的问题不是规模,它是在小操作的数量订单)。在这里,NoSQL比SQL有明显的优势。我确实喜欢你把这个命令嵌入到客户端的方法......但是我将不得不使用它。 – 2013-02-26 12:31:01

+0

@AlexFrenkel是的,如果你正在看很多操作,那么它可能会更高性能,它听起来像你基于你需要分片的数据大小是所有:) – Sammaye 2013-02-26 12:35:10

+0

不,抱歉...是我的错误:)数据大小实际上非常小,这次...我第一次,我不期望我的数据库超过1GB磁盘空间... – 2013-02-26 12:51:56

0

为了给出一种替代方法,您可以将Clients作为单独的集合保存,并将Product信息嵌入(至少部分)Order

通常很重要的一点是要知道客户在下单时点的订单(以及他们支付的价格,货币等)。您仍然会提及产品,但这意味着您可以查看历史订单,并实际了解当时客户购买的产品。产品细节随着时间的推移而合法变化

这仍然意味着快速读取;我假设业务集合将比客户小得多,所以也许可以在应用程序级别处理(即缓存业务,所以你没有在数据库上查找每一个)

我很欣赏我所说的信息目前不在产品文档中,但可能需要考虑一些事情。

当然有一个文件大小限制,如果你denormalising产品信息(或其中一些),并且一个客户可以为许多企业下订单,你需要检查你有余地把这些信息保存在客户收集 - 但这取决于订单数量和大小等。

无论如何,已经有一些很好的答案处理性能等技术问题,只是认为我会提出不同的意见。

相关问题