Firestore 中的集合结构
collection structure in Firestore
我是 firebase/backend 世界的新手。我最近开始学习了。所以我决定做一个示例项目来学习。该项目更像是 LinkedIn/Smartr 等职位简介。我正在努力决定我应该如何构建我的数据库。
我在前端使用 Angular 13,在后端使用 Firebase(@angular/fire)。
所以我要构建的项目非常简单。它将包含用户的一些基本信息,例如 firstName
、lastName
、age
、title
、location
。这些是完成个人资料所需的基本信息。
所以在 Firestore 中,我创建了一个名为 Users 的集合,其中每个用户都有一个使用以下信息生成的文档 ID .
{
age: 23,
email: "demo.user@mail.com",
firstName: "Demo",
lastName: "User",
title: "Engineer"
location: "USA"
uid: "232dsf23"
}
系统也会有一个认证系统。使用已经定义的 firebase 身份验证系统。
所以我保留的 uid
是我在用户注册后收到的 id
响应。我将其用作 Users
文档 ID.
到目前为止我已经做到了。所以接下来我想在我的演示项目中添加的是工作经验部分。
该功能将与我们在 LinkedIn/Smartr 中看到的完全一样。使用 modal/dialog.
用户一次只能 add/edit 一次工作经验
所以我的查询是:
我是否应该在 users
集合的每个文档中包含 workExperience
一个新对象 属性。如果我在 users
集合的文档中保留一个名为 workExperience
的新 属性,那么如果我没记错的话,每次体验都需要一个 ID,因为用户可以 [=70= 】 一次只能体验一次。因此,由于 firebase 不支持自动增量 ID(据我所知),那么我应该如何处理它?
如果我创建一个名为 work-experience
的单独集合,其中添加新体验会在该集合中为每个用户创建一个新文档,那么我将如何连接哪些体验与之相关用户?以及我应该如何查询以获得预期的数据。
我应该遵循哪个程序?如果您有其他建议我应该如何处理,请提出建议。
答案在很大程度上取决于您将如何在 front-end 中显示此数据。
如果您打算在同一屏幕上显示基本用户信息和工作经验 那么最好的办法是将工作经验添加到用户的 Firestore 文档中:您只对该屏幕执行一个查询。
另一方面,如果您打算先显示一个包含 基本用户信息 的屏幕,其中 link/button 可以打开 另一个屏幕 显示 工作经验 然后将工作经验数据存储在其他文档中是有意义的。您仅在最终用户决定显示此数据时查询此数据。
为此,您可以像您提到的那样拥有一个“名为 work-experience
的单独集合”,并且对于每个用户,您使用 userID 作为工作体验 Firestore 文档的 ID(您可以很好地重复使用相同的跨不同集合的文档 ID)。这样查询特定用户的工作经历文档就非常容易了:只需在查询中交换集合名称即可。
- users (collection)
- userId1 (doc)
- userId2 (doc)
...
- work-experiences (collection)
- userId1 (doc)
- userId2 (doc)
...
如果您打算增加一些类似于工作经验部分的额外部分,例如教育或爱好,您可以使用相同的方法
- users (collection)
- userId1 (doc)
- userId2 (doc)
...
- work-experiences (collection)
- userId1 (doc)
- userId2 (doc)
...
- educations (collection)
- userId1 (doc)
- userId2 (doc)
...
- hobbies (collection)
- userId1 (doc)
- userId2 (doc)
...
但另一种有趣的方法是为每个用户创建一个 sub-collection,例如 details-sections
,您可以在其中存储具有固定 ID 的文档:
- users (collection)
- userId1 (doc)
- details-sections (sub-collection)
- work-experience (doc)
- education (doc)
- hobbies (doc)
- userId2 (doc)
- details-sections (sub-collection)
- work-experience (doc)
- education (doc)
- hobbies (doc)
此数据模型的主要优点是可以轻松地从 Firebase 控制台导航到用户数据。从查询性能或成本的角度来看,它与之前的数据模型完全相似。两种模型之间的安全规则略有不同,但不会真正影响这两种模型之间的选择。
我是 firebase/backend 世界的新手。我最近开始学习了。所以我决定做一个示例项目来学习。该项目更像是 LinkedIn/Smartr 等职位简介。我正在努力决定我应该如何构建我的数据库。
我在前端使用 Angular 13,在后端使用 Firebase(@angular/fire)。
所以我要构建的项目非常简单。它将包含用户的一些基本信息,例如 firstName
、lastName
、age
、title
、location
。这些是完成个人资料所需的基本信息。
所以在 Firestore 中,我创建了一个名为 Users 的集合,其中每个用户都有一个使用以下信息生成的文档 ID .
{
age: 23,
email: "demo.user@mail.com",
firstName: "Demo",
lastName: "User",
title: "Engineer"
location: "USA"
uid: "232dsf23"
}
系统也会有一个认证系统。使用已经定义的 firebase 身份验证系统。
所以我保留的 uid
是我在用户注册后收到的 id
响应。我将其用作 Users
文档 ID.
到目前为止我已经做到了。所以接下来我想在我的演示项目中添加的是工作经验部分。
该功能将与我们在 LinkedIn/Smartr 中看到的完全一样。使用 modal/dialog.
用户一次只能 add/edit 一次工作经验所以我的查询是:
我是否应该在
users
集合的每个文档中包含workExperience
一个新对象 属性。如果我在users
集合的文档中保留一个名为workExperience
的新 属性,那么如果我没记错的话,每次体验都需要一个 ID,因为用户可以 [=70= 】 一次只能体验一次。因此,由于 firebase 不支持自动增量 ID(据我所知),那么我应该如何处理它?如果我创建一个名为
work-experience
的单独集合,其中添加新体验会在该集合中为每个用户创建一个新文档,那么我将如何连接哪些体验与之相关用户?以及我应该如何查询以获得预期的数据。
我应该遵循哪个程序?如果您有其他建议我应该如何处理,请提出建议。
答案在很大程度上取决于您将如何在 front-end 中显示此数据。
如果您打算在同一屏幕上显示基本用户信息和工作经验 那么最好的办法是将工作经验添加到用户的 Firestore 文档中:您只对该屏幕执行一个查询。
另一方面,如果您打算先显示一个包含 基本用户信息 的屏幕,其中 link/button 可以打开 另一个屏幕 显示 工作经验 然后将工作经验数据存储在其他文档中是有意义的。您仅在最终用户决定显示此数据时查询此数据。
为此,您可以像您提到的那样拥有一个“名为 work-experience
的单独集合”,并且对于每个用户,您使用 userID 作为工作体验 Firestore 文档的 ID(您可以很好地重复使用相同的跨不同集合的文档 ID)。这样查询特定用户的工作经历文档就非常容易了:只需在查询中交换集合名称即可。
- users (collection)
- userId1 (doc)
- userId2 (doc)
...
- work-experiences (collection)
- userId1 (doc)
- userId2 (doc)
...
如果您打算增加一些类似于工作经验部分的额外部分,例如教育或爱好,您可以使用相同的方法
- users (collection)
- userId1 (doc)
- userId2 (doc)
...
- work-experiences (collection)
- userId1 (doc)
- userId2 (doc)
...
- educations (collection)
- userId1 (doc)
- userId2 (doc)
...
- hobbies (collection)
- userId1 (doc)
- userId2 (doc)
...
但另一种有趣的方法是为每个用户创建一个 sub-collection,例如 details-sections
,您可以在其中存储具有固定 ID 的文档:
- users (collection)
- userId1 (doc)
- details-sections (sub-collection)
- work-experience (doc)
- education (doc)
- hobbies (doc)
- userId2 (doc)
- details-sections (sub-collection)
- work-experience (doc)
- education (doc)
- hobbies (doc)
此数据模型的主要优点是可以轻松地从 Firebase 控制台导航到用户数据。从查询性能或成本的角度来看,它与之前的数据模型完全相似。两种模型之间的安全规则略有不同,但不会真正影响这两种模型之间的选择。