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

时间:2013-08-01 15:54:50

标签: mongodb data-modeling

假设我有一个应用程序接收带有两个参数的请求: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),并且应该计算每个请求(通过插入或更新) 每小时左右将查询一次这些数据,并且查询将使用聚合。这些查询通常会查询过去几天(最多一周)的数据。

2 个答案:

答案 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)

拥有这样的抽象文档会使建议变得困难,但请避免使用非描述性键(或值作为键)。请使用您的文档的实际示例以及您认为需要使用的查询(插入,更新和查找)来更新您的问题。这些是可用于设计正确模式的唯一标准。