我有一些问题要选择的模式设计,我有一个文件,保存用户的信息,每个用户有一个非常大的一组项目,最多可达20k项。
一个项目有一个日期、一个id和19个其他字段,还有一个内部数组,它可以有20-30个项,可以修改、删除,当然也可以用它所拥有的任何属性来重新插入和查询。
所以我想出了两种可能的模式。
1.把每件事都放在一份文件中
{_id:ObjectId("") type:'user' name:'xxx' items:[{.......,internalitems:[]},{.......,internalitems:[]},...]}
{_id:ObjectId("") type:'user' name:'yyy' items:[{.......,internalitems:[]},{.......,internalitems:[]},...]}2.将项目从用户中分离出来,让每个项目都有自己的文档。
{_id:ObjectId(""), type:'user', username:'xxx'}
{_id:ObjectId(""), type:'user', username:'yyy'}
{_id:ObjectId(""), type:'useritem' username:'xxx' item:{.......,internalitems:[]}]}
{_id:ObjectId(""), type:'useritem' username:'xxx' item:{.......,internalitems:[]}]}
{_id:ObjectId(""), type:'useritem' username:'yyy' item:{.......,internalitems:[]}]}
{_id:ObjectId(""), type:'useritem' username:'yyy' item:{.......,internalitems:[]}]}正如我在前面解释过的,一个用户可以拥有数千项,我有几十个用户,内部项可以有20-30项,它有9个字段。
考虑到单个项可以由不同的用户查询,并且只能由所有者和另一个进程修改。
另外,我将切分,我有一个单一的集合,为一切。
发布于 2014-01-16 13:33:15
我不推荐第一种方法,最大文档大小是有限制的:
“最大BSON文档大小为16 16。
最大文档大小有助于确保单个文档不能使用过多的RAM,或者在传输期间不能使用过多的带宽。为了存储大于最大大小的文档,MongoDB提供了GridFS API。有关GridFS的更多信息,请参见蒙古文件和驱动程序文档。“
来源:http://docs.mongodb.org/manual/reference/limits/
如果在更新时超过当前分配的文档空间(http://docs.mongodb.org/manual/core/write-performance/“文档增长”),也会产生性能影响。
您的第一个解决方案容易受到这两个问题的影响。
第二个是(免责声明:在20-30个内部项目的情况下)不太容易达到极限,但在进行更新时仍然可能需要重新分配。我还没有遇到类似情况下的问题,所以这可能是可行的方法。您可能需要查看记录填充(http://docs.mongodb.org/manual/core/record-padding/)以获得更多细节。
而且,如果所有这些都失败了,您也可以将内部项分割出去。
希望这能有所帮助!
https://stackoverflow.com/questions/21162012
复制相似问题