如何在 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。文档是从现有模板创建的(但它们不需要在数据库中有任何关系)。
- 公司 - 有许多模板、文档、collection和用户。
- 用户 - 属于公司,有很多文档、collection和模板
- Collection - 属于用户和公司,有很多文档
- 文件 - 属于用户、公司和collection
- 模板 - 属于用户和公司
我觉得我可以在技术上制作一个名为 company
的 collection,然后将其他所有内容嵌套为 sub-docs。或者我习惯的方式就是给所有东西添加 id refs,然后让所有东西都独立 collection.
这两种方式似乎都没有问题...有人可以使用我的示例并向我展示他们如何在 MongoDB 中正确设计数据库,并解释为什么他们选择这样做他们是怎么做的?
这会极大地 帮助我更好地理解如何在 Mongo 中设计数据库模式。
非常感谢!
举个例子,让我们看一下 company
的 users
。
有多种设置方法。
- 作为
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。
到目前为止,我一直在使用关系数据库,现在我已经切换到 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。文档是从现有模板创建的(但它们不需要在数据库中有任何关系)。
- 公司 - 有许多模板、文档、collection和用户。
- 用户 - 属于公司,有很多文档、collection和模板
- Collection - 属于用户和公司,有很多文档
- 文件 - 属于用户、公司和collection
- 模板 - 属于用户和公司
我觉得我可以在技术上制作一个名为 company
的 collection,然后将其他所有内容嵌套为 sub-docs。或者我习惯的方式就是给所有东西添加 id refs,然后让所有东西都独立 collection.
这两种方式似乎都没有问题...有人可以使用我的示例并向我展示他们如何在 MongoDB 中正确设计数据库,并解释为什么他们选择这样做他们是怎么做的?
这会极大地 帮助我更好地理解如何在 Mongo 中设计数据库模式。
非常感谢!
举个例子,让我们看一下 company
的 users
。
有多种设置方法。
- 作为
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。