我需要帮助在mongo中建模我的数据。我的大部分经验都是关系数据库,我刚刚开始使用mongo。我正在为不同的事件建模数据。
可能最重要的是,在处理事件(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的网站),我真的找不到具体的答案。
答案 0 :(得分:54)
来自mongo docs:data modeling
在某些情况下,您可以选择存储信息 几个集合而不是单个集合。
考虑存储日志文档的样本集合日志 各种环境和应用。日志集合包含 以下形式的文件:
{log:“dev”,ts:...,info:...} {log:“debug”,ts:...,info:...}
如果文档总数较少,您可以将文档分组 按类型收集。对于日志,请考虑维护不同的日志 集合,例如logs.dev和logs.debug。 logs.dev集合 将仅包含与开发环境相关的文档。
一般来说,拥有大量藏品并不重要 性能损失并导致非常好的性能。不同 集合对于高吞吐量批处理非常重要。
还讲了10gen的家伙。对于非常大的收藏品,他列出了分离成更小的更具体的收藏品的多种好处。他对所有数据使用一个集合并使用索引的评论是:
仅仅因为你可以做某事并不意味着你应该做。模型 适当的数据。可能很容易存储在一个大型集合中 和索引,但这并不总是最好的方法。