案例:
我正在开发POS系统,我需要存储每个收银终端的每笔交易(产品信息,价格,数量等)。这当然意味着交易文件的数量会及时增长。
我目前的解决方案如下:
有两个名为' register'和'销售'。销售凭证有一个注册ID参考,所以我知道哪些销售文件属于哪个收银机。交易存储在每个销售凭证内的一个数组中(每个该死的日子大约有300个新的交易文件)。
为了在更新已经很大的数组时获得更好的性能,我设计了一个小型的缓存'在每个销售文档中,数组(大约50个文档 - 所以我只在大多数时间更新小数组),当缓存数组已满时,我会将它们移动到主事务数组中。
由于MongoDB中文档的最大大小限制为16MB,因此我为销售文档设置了10000个事务的计数限制,如果事务数超过计数限制,我将创建一个新的销售文档并且它们的id引用存储在寄存器文档的数组中,以保存销售单据的顺序。
我对这个设计不太满意,因为我必须编写非常复杂的查询来检索每个查询的大约200个事务,其方式是事务处理以保持分页,并处理极端情况。 / p>
代价:
因此,我正在考虑制作一个非常大的(不断增长的)集合,称为“交易”,我会将每个收银机的所有交易扔到一堆,然后每笔交易会有自己的注册ID引用。
问题:我应该这样做吗?
更新: 我需要如何访问数据:
优点:
缺点:
说明:
一些视觉效果:
答案 0 :(得分:0)
如果你想从复杂的查询中解脱出来,我认为横向方法(制作大型事务收集)会更好,如果你通过索引和分片正确管理数据库,mongodb可以处理数十亿条记录。
您可以查看此博文作为示例 - http://blog.mongodb.org/post/79557091037/processing-2-billion-documents-a-day-and-30tb-a
正如您所提到的那样,通常不会有任何更新和删除,这对索引很有帮助。索引将有助于读取,并且不会太昂贵,因为它们只会在插入时更改。
为什么你在寄存器集合中有销售数组?更改模型后,我不建议您将所有事务ID保存在寄存器集合中的数组中。未绑定的数组在mongodb中不好。
最后上面提到的是我个人的建议,据我在互联网上研究。我不是专家,我只是在一家软件公司工作了两年mongodb。