在MongoDB中分区数据的最佳实践是什么?

时间:2014-11-16 00:21:58

标签: node.js mongodb mongoose

我使用平均堆栈创建社交网站,我需要一些关于mongoDB和mongoose的建议。 我是创业公司的一部分,我们决定使用这些惊人的技术来完成我们的任务。

基本上,我需要一些建议。

目前,我已经完成了简单CRUD的创建并实现了本地护照JS。我目前在我的mongoDB中有一个名为users的集合。

我们的社交网站将拥有与单个用户相关的博客,市场和许多其他页面(功能)。

由于我之前从未使用过mongoDB,我很好奇mongoDB是应该为每个用户使用一个集合还是为每个功能设置多个集合。

为了澄清它,我们说我使用User模型进行用户注册,博客模型用于博客等等。

如果您不久将向我解释如何构建我的猫鼬模型,如果所有数据都应该在一个集合中,或者如果一个用户应该为不同的功能设置单独的集合,那么这对我来说真的意味着很多。如果您推荐多个集合,我如何将这些集合链接在一起,并确保为一个用户等保存所有数据。

提前多多感谢!

2 个答案:

答案 0 :(得分:3)

如果您使用mongoDB作为REST接口的后端,最佳做法是针对每个资源的集合创建。例如,如果您打算使用/api/users端点,则应该拥有用户集合,并且它应该包含您要在该端点上返回的任何内容和所有内容。

如果使用节点编译服务器端模板,则结构可以更灵活。在这种情况下,上面仍然适用(因为您可能最终希望公开REST服务),但是有更多的灵活性。实际上,如果多对多样式关系是合适的,则可以更容易地将这些集合分开并将它们一起加载到同一页面中。

顺便说一句,你提到有用户和市场。比将数据分成集合更大的问题是交易的使用。 每当您打算执行数据事务时,都应该在SQL事务中执行。 MongoDB中没有事务概念。这是设计使然,因为MongoDB被设计成一个快速,可扩展的数据存储。在这种情况下,合并SQL和noSQL数据并不是没有道理的。

答案 1 :(得分:0)

我将解释分区/分为两个级别。

  1. 当然,您将为不同的模型创建不同的集合。例如用户,博客,消息等。

  2. 如果我们谈论的是数百万的数据,现在是第2部分。如何对它们进行分区以便更快地查找数据 例如,您有1M个用户,您将把它们放在一个大的“用户”集合中。但是如果你找一个名字是' Imdad'并且年龄为28岁。现在,您的查询将查看单个“用户”集合中的这些1M项目,这将花费大量时间。

  3. 要解决这个问题,用户集合可以通过水平分区(Users1(年龄在10-20之间),Users2(年龄在20-30之间),Users3(年龄在30-40之间))分为多个集合。现在基于您的查询谓词monggoDB将查找不同的集合。这就是MongoDB像其他SQL DB一样应用的想法。您不必显式执行对块集合的查询,但mongoDB本身会处理此问题。

    Shard key generation

    Mongoose shard key