【发布时间】:2013-02-25 05:22:10
【问题描述】:
我需要帮助我在 mongo 中建模我的数据。我的大部分经验都是在关系数据库中,我刚开始使用 mongo。我正在为不同的事件建模数据。
- 每个“事件”都有相同的字段。
- 每个“事件”将包含数亿到数百万个文档/行
- 事件是动态的,即会根据需要创建新事件。 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