61

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

  1. 每个“事件”都具有相同的字段。
  2. 每个“事件”将有数百到数百万个文档/行
  3. 事件是动态的,即会根据需要创建新的事件。即可能创建一个新的“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 模型并且出现一个事件?

欢迎提出任何意见/想法,因为我真的不知道哪一个最终会表现得更好,或者其中一个是否会给我带来更多麻烦。我环顾四周(包括mongo的网站),我真的找不到具体的答案。

4

1 回答 1

75

从这里的 mongo 文档:数据建模

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

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

{日志:“开发”,ts:...,信息:...} {日志:“调试”,ts:...,信息:...}

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

通常,拥有大量集合并没有显着的性能损失,并且性能非常好。不同的集合对于高通量批处理非常重要。

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

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

于 2013-03-27T15:12:15.390 回答