使用MongoDB集合与索引

使用MongoDB集合与索引,mongodb,Mongodb,我是MongoDB的新手,正在尝试在使用的数据建模范式方面取得领先 我想我最好能提供一点背景知识。假设我是一家向客户销售产品的公司;但我的商品价格并不是固定不变的:每次购买都有一个迭代的易货序列。(即我公司报价、他们还盘、我公司还盘等)。我的数据库的目的是存储交易的演变。我的公司有能力以不同的选择还盘。唯一客户的数量是我不认为文档结构是这里真正的问题。让我们从另一个角度来看这个问题。把它想象成一个会计分类账 line #, Date, Description, Count, Price

我是MongoDB的新手,正在尝试在使用的数据建模范式方面取得领先


我想我最好能提供一点背景知识。假设我是一家向客户销售产品的公司;但我的商品价格并不是固定不变的:每次购买都有一个迭代的易货序列。(即我公司报价、他们还盘、我公司还盘等)。我的数据库的目的是存储交易的演变。我的公司有能力以不同的选择还盘。唯一客户的数量是我不认为文档结构是这里真正的问题。让我们从另一个角度来看这个问题。把它想象成一个会计分类账

line #, Date,  Description,   Count,  Price each
1, 02/25/2013,  Super widgets, 1000, $1   // <-- Strike though font
2, 02/25/2013, Super Widgets, 5000, $0.50 // <-- Strike though font
3, 02/26/2013, Super widgets 3500, $0.75
行#,日期,描述,计数,价格

2013年02月25日,超级小部件,1000,$1/我认为这是一个设计讨论,可能最好是现场进行,但希望我能引导你朝着正确的方向前进

听起来这个场景中有三个主要实体:客户、交易和交易竞价历史。将数据嵌入或存储在单独的集合中的决策是特定于开发人员应用程序的设计决策。如果你不需要学习一些基础知识,我强烈建议你参加免费的在线培训课程。这里有一个关于基本模式设计的课程,可以帮助你在思考过程中进行指导。在考虑主要数据访问模式时,您似乎已经直观地知道如何做出决策

根据我对您的数据的理解,我可能会将您的客户数据存储在它自己的集合中。原因是,您的应用程序可能会独立于交易访问客户详细信息,而且似乎不需要以原子方式访问客户和交易(Mongodb旨在提供文档级别的原子操作)。这就是为什么跨所有数据复制客户数据可能不是更好的选择的一些原因。一旦客户登录,您就可以提取客户数据,并获得上下文(即客户id)。然后,您可以使用此上下文来读取和更新交易信息。你的deals系列实际上看起来不错。有了客户id,您就可以完成一笔交易,以及交易的各个分支(如果您想引用它们,可以在www.mongodb.org上引用树形设计模式——请注意,您的设计模式确实非常符合标准)。不过,在交易中嵌入交易历史有一个危险。请注意,当前单个文档上有16MB的限制。如果您保持交易历史记录子文档精简,您应该能够存储大量历史记录;但是,如果你的应用程序像一个微型竞价应用程序,那么16MB的限制可能会带来问题;如果是这种情况,则需要将交易历史记录存储到另一个集合中的单个文档中。如果有意义的话,你可以选择在交易中存储一些冗余数据,比如最近10次出价,如果这能让你的应用程序更容易阅读(而不是必须更新多个目标的可能性)。在任何情况下,如果它是合理的,嵌入,因为它将提供您的应用程序的简单性和更快的数据访问


此外,如果您最终将交易历史嵌入到交易中,您的文档将随着每个文档的增加而增大。MongoDB将文档连续存储在磁盘上,以便就地快速更新和读取。这意味着,如果文档超出了当前分配的空间,MongoDB将把整个文档移动到磁盘上的另一个位置。这会减慢更新速度,如果应用程序大量更新,这可能会引起关注。为了防止文档不及时移动,请在mongodb.org网站上查看使用填充因子选项和“powersof2”设置。

很抱歉花了一段时间才回复您,我得去吃晚饭了。不过这个主意很有趣。我只是在想这是怎么翻译成Mongo的。通过添加事务,这是否对应于将文档添加到一个数组中,其中每个数组跟踪一个信息量很大的“操作性”。我不知道文档大小有16MB的限制,这对我来说可能是个问题。非常感谢!另外,感谢您提供的“powersof2”设置参考-看起来很有用
line #, Date,  Description,   Count,  Price each
1, 02/25/2013,  Super widgets, 1000, $1   // <-- Strike though font
2, 02/25/2013, Super Widgets, 5000, $0.50 // <-- Strike though font
3, 02/26/2013, Super widgets 3500, $0.75