为类似数据结构选择MongoDB集合结构

3

在MongoDB中,将相似的结构存储在一个集合中,还是分别存储在多个集合中,哪种方式更好?是否拥有一个/几个集合会带来任何好处?

例如,我需要存储一些日志,以进行进一步的分析。每个结构都有一个共同的部分和一些特定于某些状态类型的数据,如:

{ 
  timestamp: ...,
  client: { ... },
  type: 'stats_for_item1',
  data: { 
     id: ObjectId('xxx'),
     field1: 1,
     field2: 2 
  } 
},
{ 
  timestamp: ...,
  client: { ... },
  type: 'stats_for_item2',
  data: { 
     id: ObjectId('zzz'),
     field3: 3,
     field4: {
        field5: [5, 1]
     }
  } 
}

你可以看到我们有一个共同的部分,以及一个data字段,对于item1item2,还有一些不同的字段。似乎只有timestamptype字段将被索引(当然还有_id)。这样的项类型数量有限,例如总共3种。会有大量写入操作和少量读取操作。
那么我的问题是,如何组织这样的结构?使用一个大的集合stats并将所有内容存储在其中?还是创建几个集合stats_item1stats_item2stats_item3?哪种方式更优?从mongo的角度来看,对于分片/索引/查询/锁定等方面有什么好处?
1个回答

3
我可能会保留一个集合。如果您以后获得另一种统计类型,则无需围绕新的集合重新构建代码,然后再进行添加。您可以在“类型”上创建索引,以便专门搜索具有特定类型的项目,但是您也可以搜索所有项目,因为您将它们全部放在带有“时间戳”索引的集合中。(请注意,MongoDB还会向每个文档添加一个_id字段,并向其中添加索引)。
对于分片,您需要为每个集合选择一个键。我不知道您的写入/读取比率以及您打算如何读取数据,但我怀疑您正在进行某种日志记录,并稍后进行一些分析。在这种情况下,“client”上的分片键可能是最合适的选择。时间戳可能是一个很差的选择,因为它会强制所有写入进入一个分片。
锁定方面,一个或三个集合之间的区别并不大,因为现在MongoDB不会针对每个集合进行锁定(仅在2.0中针对服务器实例进行锁定,而在即将推出的2.2中针对每个数据库进行锁定)。
祝好, Derick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接