假设我有一个应用程序接收带有两个参数的请求:X和Y.我想要做的就是计算这些请求,我想使用MongoDB来完成任务。
我可以想到在MongoDB中存储这些信息的两种方法:
1。 为X和Y的每个组合准备一份文件:
{
_id : "X+Y",
count : 34
}
2。 将Y嵌入X中,意味着每个X都有一个文档,该文档总结了该X的所有请求:
{
_id : "X",
total_count : 47,
y: {
"Y1" : 34,
"Y2" : 13
}
}
这些方法的优点和缺点是什么? 一种方法是否是最佳实践?我还缺少另一种合法的方法吗?这是一个常见的困境吗?
我一直在阅读MongoDB的手册data modeling部分和a FAQ discussing this issue,但我并不满意。
由于
更新
我的应用程序预计每天处理大约50M个请求,而每个请求包含一些属性(例如X和Y),但是它们的数量相对较少(4-5),并且应该计算每个请求(通过插入或更新) 每小时左右将查询一次这些数据,并且查询将使用聚合。这些查询通常会查询过去几天(最多一周)的数据。
答案 0 :(得分:0)
如果您认为有可能需要获得按X分组的总计数,那么请坚持使用第二种方法。此外,如果有可能需要按Y分组,那么将数据非规范化并存储嵌入Ys中的X以及嵌入Ys中的X并不是一种不好的做法。 这是因为mongo的聚合性能很差。
如果您确定不需要任何类型的聚合,那么第一种方法在更快的读/写和更少的磁盘空间使用方面会更好。
或者,如果您不完全确定,请将其存储为:{x: "X", y: "Y", count: 42}
。确保为此创建索引{x: 1, y: 1}
。这样您仍然可以选择通过“X”或“Y”检索所有文档。请注意,拥有{x: 1, y: 1}
索引意味着您不需要创建{x: 1}
索引来查询“X”,只需要{y: 1}
来查询“Y”。
答案 1 :(得分:0)
拥有这样的抽象文档会使建议变得困难,但请避免使用非描述性键(或值作为键)。请使用您的文档的实际示例以及您认为需要使用的查询(插入,更新和查找)来更新您的问题。这些是可用于设计正确模式的唯一标准。