Mongodb:多个集合或一个带索引的大集合

时间:2013-03-09 19:11:50

标签: mongodb

我需要帮助在mongo中建模我的数据。我的大部分经验都是关系数据库,我刚刚开始使用mongo。我正在为不同的事件建模数据。

  1. 每个'事件'都有相同的字段。
  2. 每个'事件'将有数百到数百万个文档/行
  3. 事件是动态的,即将根据需要创建新事件。即 也许会创建一个新的“2016年夏季奥运会”活动。
  4. 可能最重要的是,在处理事件(CRUD操作)时,用户必须指定一个事件名称。

    到目前为止,我可以看到几种方法可以做到这一点,我不想在以错误的方式设置数据模型时犯下重大错误。

    1)一个'events'集合,包含所有事件的数据。 “事件”名称的索引。查询看起来像:

    db.events.find({event: 'Summer Olympics 2012');
    {event: 'Summer Olympics 2012', attributes: [{name: 'joe smith', .... }
    {event: 'Summer Olympics 2012', attributes: [{name: 'jane doe', .... }
    {event: 'Summer Olympics 2012', attributes: [{name: 'john avery', .... }
    {event: 'Summer Olympics 2012', attributes: [{name: 'ted williams', .... }
    
    db.events.find({event: 'Summer Olympics 2013'})
    {event: 'Summer Olympics 2013', attributes: [{name: 'steve smith', .... }
    {event: 'Summer Olympics 2013', attributes: [{name: 'amy jones', .... }
    

    2)每个新事件的集合,带有集合以跟踪所有事件名称。事件名称不需要索引,因为每个事件都存储在不同的集合中。

    // multiple collections, create new as needed
    db.summer2012.find() // get summer 2012 docs
    
    db.summer2016.find() // get summer 2016 docs
    
    //'events' collection
    db.events.find() // get all events that I would have collections for
    {name: 'summer2012', title: 'Summer Olympics 2012'};
    {name: 'summer2016', title: 'Summer Olympics 2016'};
    

    对于#1我有点担心,一旦我达到100个事件,每个事件有数百万条记录,即使其中一个事件只有500个文档,每个'事件'的查找也会很慢。

    对于#2我是否每次都会通过创建一个新的系列并且有一个事件来“绕过”mongo模型?

    任何评论/想法都是受欢迎的,因为我真的不知道哪一个最终会表现得更好,或者如果一个或另一个会让我在路上遇到更多麻烦。我环顾四周(包括mongo的网站),我真的找不到具体的答案。

1 个答案:

答案 0 :(得分:54)

来自mongo docs:data modeling

  

在某些情况下,您可以选择存储信息   几个集合而不是单个集合。

     

考虑存储日志文档的样本集合日志   各种环境和应用。日志集合包含   以下形式的文件:

     

{log:“dev”,ts:...,info:...} {log:“debug”,ts:...,info:...}

     

如果文档总数较少,您可以将文档分组   按类型收集。对于日志,请考虑维护不同的日志   集合,例如logs.dev和logs.debug。 logs.dev集合   将仅包含与开发环境相关的文档。

     

一般来说,拥有大量藏品并不重要   性能损失并导致非常好的性能。不同   集合对于高吞吐量批处理非常重要。

还讲了10gen的家伙。对于非常大的收藏品,他列出了分离成更小的更具体的收藏品的多种好处。他对所有数据使用一个集合并使用索引的评论是:

  

仅仅因为你可以做某事并不意味着你应该做。模型   适当的数据。可能很容易存储在一个大型集合中   和索引,但这并不总是最好的方法。

相关问题