MongoDB - 使用索引的一个集合

时间:2012-03-04 18:02:40

标签: mongodb collections indexing

好的,我在Mongodb中开发的越来越多,我开始怀疑需要多个集合与一个带索引的大型集合(因为与表格数据不同,每个文档的列和字段可能不同)。如果我试图以最有效的方式开发(意味着更少的代码和可重用的代码),那么我可以为所有文档使用一个集合,并且只对字段进行索引。通过将所有文档放在一个带索引的集合中,我可以重用所有的表单处理代码和其他代码,因为它将全部插入到同一个集合中。

例如:

让我们说我正在开发一个联系人经理,我有两种类型的联系人"个人"和"企业"。我最初的想法是创建一个名为个人的集合和第二个名为business的集合。但那是因为我习惯于在sql中开发,因为这是合适的,因为每个表的列都不同。我开始考虑文档dbs的灵活性越多,我开始思考的越多,"我真的需要两个集合吗?"如果我只是在每个文档中添加一个名为&#34的字段;联系人类型"和索引,我真的需要两个集合吗?由于每个文档中的字段/列不必对所有文档都相同(例如在sql中),因此每个文档都可以拥有自己的字段,只要我有一个"文档类型"字段和该字段的索引。

然后我接受了这个概念并开始思考,如果我只需要一个集合用于"个人"和"企业"那么我甚至需要一个单独的收集品来用于"用户"或"联系历史记录"或任何其他数据。理论上,我无法在一次收集中构建整个解决方案,并且每个文档中都有一个字段,用于指定"类型"和索引,例如"用户","个人联系","业务联系人","联系历史"等,如果是是一个与另一个文档相关的文档,我可以在"父键/外语"上编制索引。 Id字段......

这将允许我动态编码前端,因为表单处理代码都是相同的(插入到同一个集合中)。这将节省大量编码,但我想通过使用索引和二级索引确保数据库仍然可以快速运行,并且随着集合的增长不会导致未来的问题。可以想象,如果一切都在一个集合中,那么随着用户群的增长,该集合中可能会有数十万甚至数百万个文档,但它会有索引和二级索引来优化性能。

我的问题是:这是mongodb开发人员使用的常用方法吗?为什么或者为什么不?有什么垮台,如果有的话?如果这是一种常用的方法,请同样对使用此方法给予任何肯定。谢谢。

2 个答案:

答案 0 :(得分:2)

这在Mongo中非常重要,答案更多的是艺术而不是科学。拥有一个充满巨大文档的集合绝对是一种反模式,因为它可以抵御Mongo的许多功能。

例如,在检索文档时,您只能从集合中检索整个文档(不完全正确,但主要是)。因此,如果您有大量文档,那么每次都会检索大量文档。此外,拥有大量文档会使分片的灵活性降低,因为每个集合中只有顶级文档被索引(因此,分片)。您可以将值深入索引到文档中,但索引值与顶级文档相关联。

与此同时,纯粹的关系也是一种反模式,因为你首先去Mongo失去了很多参照完整性。此外,所有连接都在应用程序内存中完成,因此每个连接都需要完整的往返(慢速)。

所以答案是在两者之间做点什么。在这种情况下,我想你可能想要个人收藏和不同的商业收藏。我这样说是因为看起来企业有足够的元数据关联它可以大量增加。 (另外,我个人 - 商业关系似乎是多对多的)。但是,个人可能拥有Name个对象(具有firstlast属性)。将Name打成一个单独的集合是个不错的主意。

10gen关于架构设计的一些信息:http://www.mongodb.org/display/DOCS/Schema+Design

修改

此外,Mongo对交易的支持有限 - 以原子聚合的形式。将对象插入mongo时,插入或不插入整个对象。因此,您的应用程序域需要某些对象之间的一致性,您可能希望将它们保存在同一文档/集合中。

例如,考虑一个要求User始终拥有Name对象(包含FirstNameLastNameMiddleInitial)的应用程序。如果以某种方式插入User而没有相应的Name,则数据将被视为已损坏。在RDBMS中,您可以围绕操作包装事务以插入UserName。在Mongo中,我们确保NameUser位于同一文档(聚合)中,以达到同样的效果。

你的例子不太清楚,因为我不了解商业案例。有一点可以想到,Mongo对继承有很好的支持。将所有用户,个人和潜在的企业放在同一个集合中可能是有意义的(取决于应用程序的建模方式)。如果一个人有很多联系人,您可能希望个人拥有一系列ID。如果您的应用程序要求您快速预览联系人,则可以考虑复制某个人的一部分并存储一组联系人对象。

如果您已经习惯了RDBMS思维,那么您可能认为所有数据始终必须保持一致。事实是,这可能并非完全正确。最近,DDD社区大力宣传了将原子聚合应用于域的概念。当您深入了解您的域名时,就像您的业务用户一样,一致性边界应该变得截然不同。

答案 1 :(得分:-1)

MongoDB和NoSQL一般是关于对数据进行反规范化以及减少连接。这违背了正常的SQL思维。

在您的情况下,我没有看到任何理由您希望拥有单独的集合,因为它会带来不必要的复杂性和性能开销。例如,考虑一下您是否希望按字母顺序显示所有联系人的屏幕。如果你有一个单独的联系人集合,那么它真的很容易,但如果你有两个集合,它就会变得更加复杂。

如果您的应用程序有多个用户存储联系人,那么我将拥有多个集合。然后我会为每个用户提供一个集合。这使得提取用户联系人变得如此容易。