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数据存储策略的主要内容,如果未能解决你的问题,请参考以下文章