2016-12-28 112 views
0

我正在用MongoDB构建一个简单的数据库,我对于高效的文档结构有一些疑问。我基本上有三个不同的部分:用户,事件成本。见下面我目前的做法。高效的MongoDB数据库结构

{ 
    "first_name": "John", 
    "last_name": "Doe", 
    "email": "[email protected]", 
    "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. 列表的事件的用户可以通过事项标识(速度?)
  3. 名单通过事项标识事件的成本(速度?)
  4. 查找USER_ID,event_id的和cost_id(快)一成本

会用例2和3处于可接受的限度,这是一种有效的结构,用于我的需要?

回答

1

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

我在这里看到的问题是,您正在使用对象数组(内部事件成本)内的对象数组。 Mongo查询虽然通常很棒,但对嵌套数组来说效率不高。嵌套对象更易于处理imo。

此外,在嵌套数组中放置一个索引将会是一团糟,并且可能不会带给您期望的结果。

现在它完全取决于您想要的配置,但是如果我必须考虑它,我的模型将如下所示。

{ 
    "first_name": "John", 
    "last_name": "Doe", 
    "email": "[email protected]", 
    "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更新成本数据会更容易。

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

有可能会有进一步的方法,但有些地方你必须决定之间。