Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB数据建模:文档嵌入困境_Mongodb_Data Modeling - Fatal编程技术网

MongoDB数据建模:文档嵌入困境

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

假设我有一个应用程序,它接收带有两个参数的请求:X和Y。我要做的就是计算这些请求的数量,并且我想使用MongoDB来完成任务

我可以想出两种方法在MongoDB中存储这些信息:

一,。 对于X和Y的每个组合都有一个文档:

{
  _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,对吗?因为如果我查询多个类型,我必须查询多个文档(比第二种方法中查询的文档要多),据我所知,您查询的文档越多,结果就越糟,不是吗?