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 - 为关注/关注用户帖子建模数据的方法

在多个 firestore 集合中使用 orderby

如何使用 Flutter 获取 Firestore 中每个集合的子集合

Firebase Firestore - 使用多个“数组包含”过滤数据

Google如何对拥有多个大型火库数据库的帐户收费