MongoDB数据存储策略

Posted

技术标签:

【中文标题】MongoDB数据存储策略【英文标题】:MongoDB data storage strategy 【发布时间】:2014-12-10 04:14:47 【问题描述】:

我正在使用 MongoDB,但我对它很陌生,所以我希望您能帮助我了解如何为我的数据建模。什么是最有效的方法?

这是我的用例。

假设我有三个收入来源,分别命名为 Income1、Income2、Income3。明天他们可能是 4 或 20 岁。每个新的收入来源都会假设要实施新的整合。

假设我有十个用户,分别命名为 User1、User2...User10。明天他们可能是 1000 个。(我希望 ;-))。在这里,新用户无需集成。

假设我有兴趣存储用户1 从Income1、Income2、...用户2 从Income1、Income2...得到的钱,等等。甚至有一天我会汇总所有这些。

还在关注我吗?

我应该如何建模?

第一个想法:分离集合和分离文档

3 集合:Income1、Income2、Income3。如果出现 Income4,没问题,因为我必须添加一些代码,我还可以创建一个新集合。没什么大不了。

在每个集合中,一个用户的数据,每个用户和每个日期都有一个文档,如下所示:

Income 1
name:'user1', date:'2014-12-07',money:'24.32'
name:'user1', date:'2014-12-08',money:'14.20'
name:'user2', date:'2014-12-07',money:'0.00'
name:'user2', date:'2014-12-08',money:'0.00'
name:'user2', date:'2014-12-09',money:'10.00'
name:'user3', date:'2014-12-09',money:'124.32'

Income 2
name:'user1', date:'2014-12-05',money:'4.00'
name:'user2', date:'2014-12-06',money:'0.20'

第二个思路:分离集合,同文档+内嵌文档

3 集合和以前一样。在每个集合中,一个用户的数据,每个用户一个文档:

Income 1
name:'user1', incomes: 
    [date:'2014-12-07',money:'24.32',date:'2014-12-08',money:'14.20']
name:'user2', incomes:
    [date:'2014-12-07',money:'0.00',date:'2014-12-08',money:'0.00',date:'2014-12-09',money:'10.00']
name:'user3', incomes:
    [date:'2014-12-09',money:'124.32']

Income 2
name:'user1', incomes: [date:'2014-12-05',money:'4.00']
name:'user2', incomes:[date:'2014-12-06',money:'0.20']

第三个想法:相同的集合,并为每个人提供单独的文档。

income_type:1,name:'user1', date:'2014-12-07',money:'24.32'
income_type:1,name:'user1', date:'2014-12-08',money:'14.20'
income_type:1,name:'user2', date:'2014-12-07',money:'0.00'
income_type:1,name:'user2', date:'2014-12-08',money:'0.00'
income_type:1,name:'user2', date:'2014-12-09',money:'10.00'
income_type:1,name:'user3', date:'2014-12-09',money:'124.32'
income_type:2,name:'user1', date:'2014-12-05',money:'4.00'
income_type:2,name:'user2', date:'2014-12-06',money:'0.20'

这些是一些想法。我确定还有其他人。

我经常需要针对每个用户查询最近的文档(即最近的日期)。我可能不时需要每周、每月汇总信息……最后,我想我会从每晚运行的 cron 更新表格(为每个收入来源和用户添加相应的收入)

这清楚吗?我来自关系数据库背景(这很明显吗?)所以也许有一些我什至没有考虑过。

提前致谢。

【问题讨论】:

【参考方案1】:

在这一点上,我会推荐第三个想法。使用aggregation pipeline 将每个用户和/或每个收入流的数据汇总起来非常简单。根据我的经验,使用子文档比它的价值更痛苦。

【讨论】:

同意。数字 3 的聚合非常清晰和简单。特别是数组子文档是一个痛苦的臀部。你需要 $addtoset、$push 和一堆其他容易出错的丑陋的东西。 更不用说不可避免的文档迁移等了。

以上是关于MongoDB数据存储策略的主要内容,如果未能解决你的问题,请参考以下文章

在 MongoDB 中快速搜索数十亿个小文档的策略

云数据库核心集群索引优化实践

mongodb 磁盘空间啥时候释放

MongoDB 数据存储引擎

数据存储之非关系型数据库存储----MongoDB存储

【Python基础】mongodb存储文件的优缺点?