mongodb 如何设计包含收支明细的数据库?


  • 用一个集合还是分成两个集合?
  • 如果用一个集合,收和支里包含的不同类型的数据怎么处理?
  • 如果分成两个集合,要显示收支明细,怎么查询?

数据库 数据库设计 mongodb

lunli 11 years, 10 months ago

直观的想法:

  • 如果用一个collection的话,那么每个document里面需要有一个字段标识该document类型是收入明细还是支持明细;
  • 如果用2个collection的话,显示收支明细的时候,就需要通过两次查询分别查询收入collection和支出collection,再合并显示;

针对你问题中不是很具体的需求,再细致分析一下:

  • 对于一个collection的话,每条收支记录都是一个document放到collection,至于不同类型的数据,document是free schema的,在数据存储上是完全没有问题滴;你纠结的只是针对收支不同类型的数据的如何处理展示,这需要你很好定义收支明细的数据结构和各字段组成。对于查询,一个collection就很容易,完全可以根据时间来查询,然后在结果中根据标识收支类型的字段来分别处理显示;
  • 对于分成2个collection的话,收支不同类型的数据完全不是问题,因为你分开存储,此时的collection基本就是关系db中的2个不同table,各放各的数据,互不干扰;对于查询的话,就比较麻烦点,一般的话,需要先按照时间从mongodb中分2次拉出收入明细和支出明细,然后按照时间顺序把二者进行归并排序,此时排序的工作量从mongodb转移到应用端。

二种方案各有各的利弊,如果你的数据量不是很大,建议采用第一种方案,一个collection存放,存取操作方便;如果数据量很大,可采取第二种方案,将压力转移给应用端,毕竟应用的扩展相比数据库的扩展还是方便些。

个人意见建议采用第一种方案,用一个collection存放,对于数据量不大,没有压力;如果数据量很大的情况,可按照时间将不同时间段的收支明细分别存入多个collection,在前端展示的时候,按照时间段来展示。这样的话,随着时间增长,只需要水平增加collection,数据存取的代码都无需改动,在查询的时候,只是需要根据查询时间段简单切换不同的collection即可,简单且高效。

我不是一只树懒 answered 11 years, 10 months ago

Your Answer