范式化与反范式化
范式化是将数据分散到多个不同的集合,不同集合之前可以相互引用数据。如果要修改某一块数据,只需要修改保存这一块数据的那一个文档就行了
反范式化是将每个文档所需的数据都嵌入在文档内部。如果数据发生变化,所有相关文档都需要进行更新。但是在执行查询时,只需要查询一次就可以得到所有数据
如果数据更新频繁,那么反范式化更好
内嵌数据与引用数据的比较:
更适合内嵌 更适合引用 子文档较小 子文档较大 数据不会定期改表 数据经常改变 最终数据一致即可 中间阶段的数据必须一致 文档数据小幅增加 文档数据大幅增加 数据通常需要执行二次查询才能获得 数据通常不包含在结果中 快速读取 快速写入
优化数据操作
对读取操作的优化通常包括正确使用索引,以及尽可能将所需信息放在单个文档中返回。对写入操作的优化通常包括减少索引数量以及尽可能提高更新效率
① 优化文档增长
更新数据时,需要明确更新是否会导致文件体积增长,以及增长程度。
如果增加程度是可预知的,可以为文档预留足够的增长空间,这样可以避免文档移动,可以提高写入速度。可以在创建文档时创建一个占空间比较大的字段,文档创建成功后再将这个字段移除。这样就提前为文档分配了足够的空间供后续使用。
如果文档中有一个字段需要增长,应该尽可能将这个字段放在文档最后的位置,这样可以稍微提高一点性能,因为不需要重写该字段以后的字段。
② 删除旧数据
可用方法:使用固定集合、使用TTL集合、定期删除集合