mongoDB应用程序设计

一. 范式与反范式

范式化:将不同数据放在不同集合,不同集合之间可以直接引用数据。避免数据存在于多个集合当中。

由于mongoDB不支持不同集合直接引用数据,类似关系型数据库中的join操作,mongoDB不支持。我们在设计的时候,要慎重考虑用范式还是非范式,参考原则见下图:

mongoDB应用程序设计

也就是,如果数据修改不频繁,比较小,读取频繁适合非范式设计。


二. 优化数据操作

2.1优化文档增长

mongoDB每一条文档都是紧凑的,中间没有间隙,如果一个文档修改增长了,就需要挪动位置了,这样非常影响性能。mongo识别到这种操作之后,会给后续的新增文档预留一定的空间,这个空间就是填充因子。如果文档的确会被大概率的增长,建议插入一个多余字段,来抢占空间,参考如下博客:http://www.cnblogs.com/smileberry/p/4171035.html


2.2 删除旧数据

有些数据过几个月没用了,常见删除旧数据的方式是:

使用固定集合  使用TTL集合,定期删除数据


三. 数据库和集合设计

1. 具有相近模式的文档放在一个集合里面,由于mongo不支持集合join,需要经常join的数据,放到一个集合里

2. 数据库最大的问题是锁机制,具体锁机制可参考如下博客:http://blog.csdn.net/liwenshui322/article/details/77630475

我们通常需要将访问量相近的数据放到一个库里面,比如用户,用户参与的活动,用户日志这3种属于不同访问量的数据,可以放到3个不同的数据库里面。


四.不适合mongoDB的场景

       1. mongoDB不支持事务,如果需要支持事务,建议采用别的存储

       2. 从多个维度对不同数据类型的数据进行连接,这是关系数据库擅长的事情