MongoDB设计用于快速增长的文档

时间:2016-09-26 22:08:21

标签: mongodb mongoose nosql

案例:

我正在开发POS系统,我需要存储每个收银终端的每笔交易(产品信息,价格,数量等)。这当然意味着交易文件的数量会及时增长。

我目前的解决方案如下:

有两个名为' register'和'销售'。销售凭证有一个注册ID参考,所以我知道哪些销售文件属于哪个收银机。交易存储在每个销售凭证内的一个数组中(每个该死的日子大约有300个新的交易文件)。

为了在更新已经很大的数组时获得更好的性能,我设计了一个小型的缓存'在每个销售文档中,数组(大约50个文档 - 所以我只在大多数时间更新小数组),当缓存数组已满时,我会将它们移动到主事务数组中。

由于MongoDB中文档的最大大小限制为16MB,因此我为销售文档设置了10000个事务的计数限制,如果事务数超过计数限制,我将创建一个新的销售文档并且它们的id引用存储在寄存器文档的数组中,以保存销售单据的顺序。

我对这个设计不太满意,因为我必须编写非常复杂的查询来检索每个查询的大约200个事务,其方式是事务处理以保持分页,并处理极端情况。 / p>

代价:

因此,我正在考虑制作一个非常大的(不断增长的)集合,称为“交易”,我会将每个收银机的所有交易扔到一堆,然后每笔交易会有自己的注册ID引用。

问题:我应该这样做吗?

更新: 我需要如何访问数据:

  • 插入并且只读,永不更新或删除现有文档
  • 插入是最常用的操作
  • 读取查询应返回适合交易编号范围或创建时间范围的文档数组,数组不需要排序)
  • 阅读:大多数情况下,我只需要显示前200个最近的交易。然后,如果需要,用户可以查询更多。

优点:

  • 简单查询(不确定是否有效),例如在查询特定数量的交易时,按ID查找交易并按交易号/时间范围过滤
  • 避免不必要的重复
  • 离无阵列数据库更近一步
  • 适合分片(?)

缺点:

  • 索引太多(这被认为是一个问题吗?如果这些小文档有三十个索引会有问题吗?)
  • 我不知道在我这样做之后会发生什么。从理论上讲,它应该有效。但现实比我们所知道的更残酷

说明:

  • 也许我选择数组而不是单一集合的主要原因是我开始时没有任何使用MongoDB的经验。
  • 是的,我想确保交易保持秩序

一些视觉效果:

1 个答案:

答案 0 :(得分:0)

如果你想从复杂的查询中解脱出来,我认为横向方法(制作大型事务收集)会更好,如果你通过索引和分片正确管理数据库,mongodb可以处理数十亿条记录。

您可以查看此博文作为示例 - http://blog.mongodb.org/post/79557091037/processing-2-billion-documents-a-day-and-30tb-a

正如您所提到的那样,通常不会有任何更新和删除,这对索引很有帮助。索引将有助于读取,并且不会太昂贵,因为它们只会在插入时更改。

为什么你在寄存器集合中有销售数组?更改模型后,我不建议您将所有事务ID保存在寄存器集合中的数组中。未绑定的数组在mongodb中不好。

最后上面提到的是我个人的建议,据我在互联网上研究。我不是专家,我只是在一家软件公司工作了两年mongodb。