如何在Mongoose / MongoDB中正确构建数据库?

时间:2015-12-28 23:21:12

标签: javascript node.js mongodb mongoose nosql

到目前为止,我一直在使用关系数据库,而且我现在很难调整我对数据库设计的思考方式,因为我已经切换到MongoDB(使用Mongoose with Express)。

我经常发现自己要去“那么为什么我不能只在那里引用一个id来引用?...等等”并且只是默认回到关系数据库的思考。 / p>

我理解MongoDB的意思是嵌套JSON结构。但我发现,如果我使用这种方法,我可以在技术上将我的整个应用程序嵌套在一个集合中。但不知怎的,我觉得这不是正确的方法......这是我的应用程序的简单示例布局:

{
  company: {
    collections: [{
      createdBy,
      documents: [{
        text,
        createdBy
      }],
      title
    }],
    templates: [{
      text,
      createdBy,
      placeholders
    }],
    users: [{
      email,
      firstName,
      lastName,
      password
    }]
  }
}

公司将拥有许多用户,每个用户都可以创建模板,用户还可以创建集合(如包含文档的文件夹),这些集合将包含许多文档,但文档不必属于集合。文档是从现有模板创建的(但它们不需要在数据库中有任何关系)。

  • 公司 - 有许多模板,文档,集合和用户。
  • 用户 - 属于公司,有许多文档,集合和模板
  • 收藏 - 属于用户和公司,有很多文件
  • 文档 - 属于用户,公司和集合
  • 模板 - 属于用户和公司

我觉得我可以在技术上制作一个名为company的集合,并将其他所有内容作为子文档嵌套在其下。或者我习惯的方式就是将id引用添加到所有内容中,并将所有内容都设置为单独的集合。

这两种方式似乎都不会有点不确定......有人可以使用我的示例并告诉我他们如何在MongoDB中正确设计数据库,并解释他们为什么选择以他们的方式做到这一点?

这将极大地帮助我更好地理解如何在Mongo中设计数据库模式。

非常感谢!

1 个答案:

答案 0 :(得分:2)

举个例子,让我们看一下users的{​​{1}}。

有多种方法可以设置它。

  • 作为company文档中的字段(与您一样);
  • 在另一个系列中。

如果您选择第二个选项,则需要将用户链接到公司。您可以通过外键以多种方式执行此操作:

  • 在每个company文档中添加user个ID数组;
  • 在每个company文档中添加company个ID数组;
  • 以上两点。

或者,您可以复制user集合的users字段中的部分或全部用户数据。在您的定义中,company集合中每个用户有4个字段; company集合可以包含有关每个用户的其他信息,例如帐号或家庭住址。

现在,最大的问题是:您应该选择哪个选项?

这主要取决于您期望运行的查询/搜索。一些例子:

如果您想显示公司的页面,其中包含该公司所有用户的列表,则在公司集合中包含相关的用户信息意味着您只需要1个查询即可查找显示此页面的所有信息。

如果您希望用户以某种方式登录,则有一个单独的users集合是有意义的。

如果用户可以在多家公司中,并且您希望能够在用户页面上显示用户所属的公司列表,则可以使用users中的companies数组集合。

遵循这些指南可能会对您有所帮助:

  • MongoDB不擅长JOIN。
  • 数据复制是可以接受的。

您可以找到更多指导on the mongodb blog