MongoDB数据建模:文档嵌入困境
假设我有一个应用程序,它接收带有两个参数的请求:X和Y。我要做的就是计算这些请求的数量,并且我想使用MongoDB来完成任务 我可以想出两种方法在MongoDB中存储这些信息: 一,。 对于X和Y的每个组合都有一个文档:MongoDB数据建模:文档嵌入困境,mongodb,data-modeling,Mongodb,Data Modeling,假设我有一个应用程序,它接收带有两个参数的请求:X和Y。我要做的就是计算这些请求的数量,并且我想使用MongoDB来完成任务 我可以想出两种方法在MongoDB中存储这些信息: 一,。 对于X和Y的每个组合都有一个文档: { _id : "X+Y", count : 34 } 二,。 将Y嵌入X,这意味着每个X都有一个文档,其中用该X总结了所有请求: { _id : "X", total_count : 47, y: { "Y1" : 34, "Y2
{
_id : "X+Y",
count : 34
}
二,。
将Y嵌入X,这意味着每个X都有一个文档,其中用该X总结了所有请求:
{
_id : "X",
total_count : 47,
y: {
"Y1" : 34,
"Y2" : 13
}
}
每种方法的优缺点是什么?一种方法是否被视为最佳实践?我还缺少另一种合法的方法吗?这是一个常见的困境吗 我一直在阅读MongoDB的手册部分,但我并不满意 谢谢 更新 我的应用程序预计每天处理大约5000万个请求,而每个请求都包含一些属性(如X和Y),但数量相对较少(4-5),并且每个请求都应该计数(通过插入或更新)。
这些数据大约每小时查询一次,并且这些查询应该使用聚合。这些查询通常会查询最近几天(最多一周)的数据。如果您认为可能需要获得按X分组的总计数,请坚持使用第二种方法。此外,如果您可能需要按Y分组,那么将数据反规范化并将嵌入Ys的Xs与嵌入Ys的Xs一起存储在Ys中并不是一个坏做法。 这是因为mongo的聚合性能很差 如果您确信不需要任何类型的聚合,则第1种方法在更快的读/写速度和更少的磁盘空间使用方面会更好
或者,如果您不能完全确定,可以这样存储:
{x:x,y:y,count:42}
。确保为此创建索引{x:1,y:1}
。这样,您仍然可以保留按“X”或“Y”检索所有文档的选项。请注意,拥有{x:1,y:1}
索引意味着您不需要为按“x”查询创建{x:1}
索引,只需按“y”查询{y:1}
。这样的抽象文档很难给出建议,但请避免使用非描述性键(或值作为键)。请使用文档的真实示例更新您的问题,以及您认为需要使用的查询(插入、更新和查找)。这些是设计正确模式的唯一标准。我已经更新了这个问题,尽管我仍然认为这些方法可以用正反两方面来描述,而不管现实世界的例子如何。第一种方法在读/写方面会更好?!也许如果我查询一个特定的X和Y,对吗?因为如果我查询多个类型,我必须查询多个文档(比第二种方法中查询的文档要多),据我所知,您查询的文档越多,结果就越糟,不是吗?