gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:15:38 25 4
gpt4 key购买 nike

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

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

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

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

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

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

我觉得从技术上讲我可以创建一个名为 company 的集合,并将其他所有内容作为子文档嵌套在它下面。或者我习惯的方式就是向所有内容添加 id 引用,并使所有内容成为自己单独的集合。

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

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

非常感谢!

最佳答案

作为示例,让我们看一下公司用户

有多种方法可以进行设置。

  • 作为公司文档中的字段(就像您所做的那样);
  • 在一个单独的集合中。

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

  • 在每个公司文档中添加用户 ID数组;
  • 在每个用户文档中添加公司 ID数组;
  • 以上两者。

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

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

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

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

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

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

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

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

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

关于javascript - 如何在 Mongoose/MongoDB 中正确构建数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34502243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com