【问题标题】:Mongodb: multiple collections or one big collection w/ indexMongodb:多个集合或一个带索引的大集合
【发布时间】:2013-02-25 05:22:10
【问题描述】:

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

  1. 每个“事件”都有相同的字段。
  2. 每个“事件”将包含数亿到数百万个文档/行
  3. 事件是动态的,即会根据需要创建新事件。 IE。 也许创建一个新的“2016 年夏季奥运会”活动。

可能最重要的是,在处理事件(CRUD 操作)时,用户必须指定事件名称。

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

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

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 模型?

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

【问题讨论】:

  • 这些属性是什么?人们?那么,您是否有活动 x 人参加活动?这些人是否已在您的系统中注册?如果您刚开始使用 MongoDB,请查看以下内容:code.google.com/p/morphia/wiki/QuickStart
  • 对不起,糟糕的例子:(。真的是它的地理空间数据。所以我将为每个文档设置一个 x,y。用户可以轻松地在地图上添加/删除他们当前位置的图钉并附加一些元数据关于那个位置。即图片/视频,标题,天气等。所以想象一下奥运会上有一群人添加新数据。人/位置相同的差异。问题是因为每个“事件”可能有数百万个文档应该每个单独的事件存在于自己的集合中,还是将所有事件文档放入同一个集合中?一个集合有 1000 万个文档,或者 10 个集合,每个集合有大约 100 万个文档。
  • 也刚刚开始使用 Mongo。我认为手册的这一部分很重要:docs.mongodb.org/manual/applications/indexes。它让我觉得 MongoDb db design 可以而且应该与 db design 非常相似,因此,我会选择 pulmp 作为第一选择,特别是如果您打算进行“跨事件”查询
  • 如果我有一个包含所有事件的集合怎么办。它有 3000 万份文档。我有一个新活动,该活动只有 10 个文档。现在总共有 30,000,010 个文档。如果用户试图获取新事件的所有文档(只有 10 个文档),那么性能会因为一个集合的整体大小而受到影响。作为用户,我希望这 10 个文档很快就会回来。
  • 没有跨事件查询,我说“可能最重要的是,在处理事件(CRUD 操作)时,用户必须指定事件名称。”您将需要一个事件名称来从事件中读取/创建/更新/删除文档。

标签: mongodb


【解决方案1】:

来自 mongo 文档:data modeling

在某些情况下,您可能会选择将信息存储在 多个集合而不是单个集合。

考虑一个示例收集日志,用于存储日志文档 各种环境和应用。日志集合包含 以下形式的文件:

{ log: "dev", ts: ..., info: ... } { log: "debug", ts: ..., info: ...}

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

一般来说,拥有大量的集合并没有显着的意义 性能损失并导致非常好的性能。清楚的 集合对于高通量批处理非常重要。

还与 10 代人交谈过。对于非常大的收藏,他列出了将其分成更小更具体的收藏的多种好处。他对对所有数据使用一个集合并使用索引的评论是:

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

【讨论】:

    猜你喜欢
    • 2015-07-11
    • 2012-03-22
    • 2021-04-17
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多