我有一个计划任务,每个用户每天产生约50次传输。这是一个示例传输,存储在MongoDB中收集的传输中:
transfer = {
_id: 'ObjectId("...")',
transferScheduleId: 'ObjectId("...")',
TargetA: 'ObjectId("...")',
TargetB: 'ObjectId("...")', <-- optional
SourceA: 'SourceId("...")',
SourceB: 'SourceId("...")', <-- optional
value: 1234.5678, <-- can be variable or constant
date: '1900-01-01'
}
我仍在学习NoSQL / MongoDB,所以我想了解更多有关存储这种数据的不同方式的优缺点,并且我正在寻找反馈和想法。
目标与设置:由于我的应用旨在扩大用户数量,因此我想有效地存储转账以降低成本。传输在Web应用程序中生成,然后存储在MongoDB中。用户将定期访问此数据,并且当用户登录阵列时,该数据将通过带有mongoose的node.js API发送到Web应用程序。
我的问题是关于存储每次传输以及是否使用集合或嵌入式文档。鉴于MongoDB中BSON文档的限制为16MB,我首先得出结论,将转移文档存储在集合中。
此外,transferSchedule集合具有以下属性,可用于配置传输:
transferSchedule = {
_id: 'ObjectId("...")',
userId: 'ObjectId("...")',
endDate: '1900-01-01' <-- optional
startDate: '1900-01-01'
}
我希望将转移嵌入到transferSchedule文档中,因为我假设这样可以更快地获取数据,因为用户的个人资料最多可以包含50个transferSchedules。我还假设我可以压缩嵌入式文档中的数据,但在下一段中将对此进行更多介绍。我的假设正确吗?通过userId获取50个transferSchedule对象(每个对象都有一个嵌入式传输数组)是否更快?还是更快地从集合中获取所有传输并通过transferScheduleId查找每个传输?
好的,因此在嵌入时,仍然存在文档的16 MB大小限制的问题。为了减少数组的大小,我想到了a。)压缩数组中的数据,但这需要每个用户和transferSchedule来获取完整的压缩数组,对其进行解压缩,添加新的传输,进行压缩并将其放入回到数据库。 相反,我想到的是b。)创建一个自定义压缩算法,该算法仅存储所需的属性以完全重新创建传输数组。该算法将仅存储已知传输执行的开始日期和结束日期,以及该时间段内所有传输上不会更改的属性。只要值,源或目标发生更改,就会创建一个新条目。如下所示:
transferSchedule = {
_id: 'ObjectId("...")',
userId: 'ObjectId("...")',
endDate: null <-- optional
startDate: '2019-01-01'
transfers: [
{
startDate: '2019-01-01',
endDate: '2019-03-26', <-- inclusive
value: 100
SourceA: 'SourceId("abc123")',
TargetA: 'ObjectId("def456")',
},
{
startDate: '2019-03-27',
endDate: '2019-05-03', <-- current date of most recent transfer
value: 2000 <-- change in data between March 26 & 27
SourceA: 'SourceId("abc123")',
TargetA: 'ObjectId("def456")',
},
]
}
将文档加载到Web应用程序中后,可以使用上面的transfers数组来重建该数组。
我不确定我是否考虑得过多。从SQL背景来看,我仍然不确定集合的可伸缩性和性能影响,也涉及CRUD操作。我的方法是否有效?我将不胜感激任何反馈,技巧和想法。谢谢!