高效的MongoDB数据库结构

时间:2016-12-28 08:16:51

标签: json node.js mongodb mongoose

我正在使用MongoDB构建一个简单的数据库,我对有效的文档结构有一些疑问。我基本上有三个不同的部分:用户事件成本。请参阅下面的我当前的方法。

{
  "first_name": "John",
  "last_name": "Doe",
  "email": "john@doe.com",
  "phone": "123456",
  "events": [
    {
      "_id": "*MongoId reference to event*",
      "status": 0,
      "owner": 1,
      "costs": [
        {
          "id": 1,
          "name": "Test",
          "amount": 59.99,
          "created": "27/12/16 16:47:34 UTC",
          "updated:": "27/12/16 16:47:34 UTC"
        }
      ],
      "created": "27/12/16 16:47:34 UTC",
      "updated": "27/12/16 16:47:34 UTC"
    }
  ],
  "created": "27/12/16 16:47:34 UTC",
  "updated": "27/12/16 16:47:34 UTC"
}

多个用户将连接到同一事件,因此是MongoID引用,但成本显然只属于一个用户事件组合。我有一些示例用例:

  1. 按user_id(快速)列出用户的事件
  2. 按event_id(速度?)列出活动的用户
  3. 按event_id(速度?)
  4. 列出活动的费用
  5. 按user_id,event_id和cost_id(快速)
  6. 查找费用

    用例2和3是否在可接受的范围内,这是否符合我的需求?

1 个答案:

答案 0 :(得分:1)

恕我直言,就非规范化而言,你的方法是正确的,你想把数据和关系放在一起。

我在这里看到的问题是你在对象数组中使用对象数组(在事件内部的成本)。虽然Mongo查询通常很好,但它们对嵌套数组的效率不高。嵌套对象更容易处理imo。

另外在嵌套数组中放置一个索引会很麻烦,可能无法带来理想的结果。

现在它完全取决于您想要的要求,但如果我不得不考虑它,我的模型将如下所示。

{
  "first_name": "John",
  "last_name": "Doe",
  "email": "john@doe.com",
  "phone": "123456",
  "events": [
    {
      "_id": "*MongoId reference to event*",
      "status": 0,
      "owner": 1,
      "created": "27/12/16 16:47:34 UTC",
      "updated": "27/12/16 16:47:34 UTC"
    }
  ],
  "costs": [
        {
          "id": 1,
          "event_id": "*Appropriate event id*"
          "name": "Test",
          "amount": 59.99,
          "created": "27/12/16 16:47:34 UTC",
          "updated:": "27/12/16 16:47:34 UTC"
        }
      ],
  "created": "27/12/16 16:47:34 UTC",
  "updated": "27/12/16 16:47:34 UTC"
}

此外,出于性能原因,我会在事件和成本上加上索引。

我认为专业人士认为,就性能而言,它适用于所有用例,根据用户和事件ID更新成本数据更容易。

缺点是您可能必须在应用程序级别上执行事件和成本的映射,其次,如果要删除事件,则必须编写更新以删除相应的成本。值得庆幸的是,两者都可以在单个更新中实现,这对于单个文档是原子的。

可能会有进一步的方法,但你必须在某个地方做出决定。