【问题标题】:How to properly structure a database in Mongoose/MongoDB?如何在 Mongoose/MongoDB 中正确构建数据库?
【发布时间】:2016-04-02 19:37:27
【问题描述】:

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

我经常发现自己会“为什么我不能放一个 id 来引用?...等等”,然后默认回到关系数据库的角度。

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

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

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

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

我觉得我可以在技术上创建一个名为 company 的集合,然后将其他所有内容作为子文档嵌套在它下面。或者我习惯的方式只是将 id refs 添加到所有内容中,并将所有内容都设为自己的单独集合。

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

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

非常感谢!

【问题讨论】:

    标签: javascript node.js mongodb mongoose nosql


    【解决方案1】:

    作为一个例子,让我们看一下companyusers

    有多种设置方法。

    • 作为company 文档中的一个字段(与您一样);
    • 在单独的集合中。

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

    • 在每个company 文档中添加一个user id 数组;
    • 在每个user 文档中添加一组company id;
    • 以上两者。

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

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

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

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

    如果您想让用户以某种方式登录,那么拥有一个单独的 users 集合是有意义的。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-11
      • 2017-10-19
      • 2012-08-04
      • 1970-01-01
      • 2020-09-25
      • 1970-01-01
      • 2015-02-06
      • 2020-04-01
      相关资源
      最近更新 更多