【问题标题】:What are best practices for partitioning data in MongoDB?在 MongoDB 中分区数据的最佳实践是什么?
【发布时间】:2015-01-13 03:58:35
【问题描述】:

我正在使用平均堆栈创建一个社交网站,我需要一些关于 mongoDB 和 mongoose 的建议。 我是一家初创公司的一员,我们决定使用这些令人惊叹的技术来完成我们的任务。

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

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

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

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

为了澄清这一点,假设我使用用户模型进行用户注册,博客模型用于博客等。

如果您能简短地向我解释如何构建我的 mongoose 模型,如果所有数据都应该在一个集合中,或者如果一个用户应该为不同的功能拥有不同的集合,这对我来说真的很重要。如果您推荐多个集合,那么我如何将这些集合链接在一起并确保为一个用户保存所有数据等。

提前非常感谢!

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    如果您使用 mongoDB 作为 REST 接口的后端,最佳实践是在每个资源的集合上创建。例如,如果您打算拥有一个 /api/users 端点,您应该拥有 users 集合,并且它应该包含您打算在该端点上返回的所有内容。

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

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

    【讨论】:

    • 我们正在构建企业对企业的社交网络,我们将在这里拥有许多功能,不仅是博客,还有市场、广告和许多其他服务。据我了解,您是在建议我每个资源都应该有一个集合(帖子集合、用户集合和任何其他资源)。您能否为我提供一些关于如何链接所有这些集合的指南或参考,以便我的经过身份验证的用户可以保存所有这些并注销。我仍然不知道如何链接所有这些集合以供单个用户使用。再次提前非常感谢。
    • noSQL中不要链接资源,这是SQL的做事方式。 noSQL 和 MongoDB 是 JSON 文档存储。它与关系无关。您仍然可以通过添加引用主键的属性来创建链接,但这些链接很弱且未强制执行。见这里:stackoverflow.com/questions/4067197/mongodb-and-joins
    • 我的处理方式是将事务和关系数据存储在 SQL(通常是 PostgreSQL)和 JSON 文档中,在 noSQL(通常是 MongoDB)中,关系很弱,性能胜过完整性
    • 我现在面临的最大问题是不了解如何让经过身份验证的用户保存他的东西并简单地注销。我知道如何使用一个集合来做到这一点,因为我会在那里声明所有页面,但是我如何让经过身份验证的用户从所有这些集合中获取他的所有数据。例如,我使用集合用户进行注册和登录,我也可以在那里声明我的帖子和所有数据,但是我如何从不同的集合中为不同的用户获取数据。这是我现在面临的唯一问题。非常感谢:)
    • SQL和noSQL都存储用户不是没有道理的。例如,在 SQL 中创建一个用户,然后在 noSQL 中创建相同的用户,并将 _id 设置为 SQL pk。从那里,您可以在 SQL 中添加一条购买记录,并且您可以在 noSQL 中存储最近搜索的列表。
    【解决方案2】:

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

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

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

    为了解决这个问题,用户集合可以通过水平分区划分为多个集合(Users1(10-20岁)、Users2(20-30岁)、Users3(30-40岁))。现在根据您的查询谓词 monggoDB 是查找不同的集合。这是 MongoDB 像其他 SQL DB 一样应用的想法。您不必显式执行对块集合的查询,但 mongoDB 本身会处理。

    Shard key generation

    Mongoose shard key

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2023-03-14
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多