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

How to properly structure a database in Mongoose/MongoDB?

到目前为止,我一直在使用关系数据库,现在我已经切换到 MongoDB(使用 Mongo与 Express 合影)。

我经常发现自己会“那么为什么我不能在那里放一个 id 来参考?...等等”然后默认回到思考的方式关系数据库。

我明白 MongoDB 的意义在于嵌套 JSON 结构之类的东西。但我发现,如果我使用这种方法,我可以在技术上将我的整个应用程序嵌套在一个 collection 中。但不知何故,我不觉得这是正确的方法......这是我的应用程序的一个简单示例布局:

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

一个公司会有很多用户,每个用户可以创建模板,用户也可以创建collections(比如包含文件的文件夹),里面会有很多文件,但是文件不一定属于一个collection。文档是从现有模板创建的(但它们不需要在数据库中有任何关系)。

我觉得我可以在技术上制作一个名为 company 的 collection,然后将其他所有内容嵌套为 sub-docs。或者我习惯的方式就是给所有东西添加 id refs,然后让所有东西都独立 collection.

这两种方式似乎都没有问题...有人可以使用我的示例并向我展示他们如何在 MongoDB 中正确设计数据库,并解释为什么他们选择这样做他们是怎么做的?

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

非常感谢!

举个例子,让我们看一下 companyusers

有多种设置方法。

  • 作为 company 文档中的一个字段(就像您所做的那样);
  • 单独 collection.

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

  • 在每个 company 文档中添加一组 user 个 ID;
  • 在每个 user 文档中添加一组 company 个 ID;
  • 以上都是。

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

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

这主要取决于 queries/searches 您期望成为 运行。一些例子:

如果你想显示一个公司的页面,其中包含该公司所有用户的列表,拥有公司内部的相关用户信息 collection 意味着你只需要 1 个查询就可以找到所有要显示的信息此页。

如果您想让用户能够以某种方式登录,那么有一个单独的 users collection.

是有意义的

如果用户可以在多个公司,而你希望能够在用户的页面上显示用户所属的公司列表,你可以在[=10]中使用companies数组=] collection.

遵循这些准则可能会对您有所帮助:

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

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