Firestore 数据建模,每个用户拥有多个集合
Posted
技术标签:
【中文标题】Firestore 数据建模,每个用户拥有多个集合【英文标题】:Firestore data modeling with more than one collection for each user 【发布时间】:2021-10-18 17:33:09 【问题描述】:到目前为止,在我的 Fitness 应用程序中,我只有一个集合 users
,每个用户都有自己的文档。并且在此文档中存储了来自一个用户的所有数据。现在我想创建一个新集合plans
,这样每个计划也都有自己的文档。我该如何处理计划由正确的用户保存?因为现在计划不再保存在用户文档中。还是这是错误的数据建模方式?
class FireBaseHandler
Future is_user_registered(String email)
return FirebaseFirestore.instance
.collection('users')
.where('email', isEqualTo: email)
.get();
Future register_new_user(email, password)
print(email + "->" + password);
return FirebaseFirestore.instance.collection("users").doc(email).set(
"email": email,
"password": password,
"token": -1,
"plans": [],
,
);
【问题讨论】:
【参考方案1】:您可以在每个用户文档中创建一个子集合plans
。结构看起来像这样:
users -> userId -> plans -> planId
(col) (doc) (col) (doc)
这里每个计划都有一个专门的文档。这也将阻止您通过不在同一文档中的数组中包含所有计划来点击1 MB
max document size。您可以通过以下方式轻松查询用户的所有计划:
FirebaseFirestore.instance.collection('users').doc("userId").collection("plans")
【讨论】:
【参考方案2】:虽然@Dharmaraj 的回答会起作用,但还请注意,这是一个替代解决方案,您可以在其中使用更扁平的数据库结构。前几天我回答了一个问题:
What are the benefits of using a root collection in Firestore vs. a subcollection?你的情况是:
Firestore-root
|
--- users (collection)
| |
| --- $uid (document)
| |
| --- //user details
|
--- plans (collection)
|
--- $planId (document)
|
--- uid: $uid
这样,您还可以将每个“计划”作为“计划”***集合中的单独文档。
【讨论】:
谢谢!事实上,与@Dharmaraj 的其他变体相比,这个变体有什么优点/缺点吗? 不,它没有。两种解决方案的计费方式相同。 好的,users集合中的$uid会是用户的email地址吗?或者 $uid 到底是什么? UID是来自认证过程的用户ID。您可以根据需要使用 $emailAddress 来代替 $uid,但可以更改电子邮件地址,UID 始终保持不变。 没有任何主要的优点和缺点,但正如 Alex 在他的 answer 中提到的那样,“对于 NoSQL 数据库,推荐的做法是将数据库扁平化。” Firestore 中的子集合仅可用于使数据更有条理,即您不必使用基于 userId 的查询/过滤器也可以查看特定用户的计划。其他 NoSQL 数据库(例如 MongoDB)在技术上没有像 Firestore 这样的子集合。【参考方案3】:我的建议是在集合“计划”下,创建名称与用户的 user_id 匹配的文档并将他的数据存储在那里。您甚至可以更轻松地根据 user_id 选择文档。
【讨论】:
所以在用户集合中我需要添加一个字段user_id
,这样我可以在集合之间创建连接吗?如何在颤振中实现它?
user_id 不是一个字段,而是它在集合“计划”中的文档名称,我在答案中添加了图像。
我希望每个用户都可以有多个计划,每个计划都有自己的文档,这可能吗?以上是关于Firestore 数据建模,每个用户拥有多个集合的主要内容,如果未能解决你的问题,请参考以下文章
新的 Firebase Firestore DocumentDb 如何为大型子集合建模
Firestore/Firebase - 为关注/关注用户帖子建模数据的方法
如何使用 Flutter 获取 Firestore 中每个集合的子集合