【问题标题】:Firestore data modeling with more than one collection for each userFirestore 数据建模,每个用户拥有多个集合
【发布时间】: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": [],
      },
    );
  }

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore nosql


    【解决方案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 的回答会起作用,但还请注意,这是一个替代解决方案,您可以在其中使用更扁平的数据库结构。前几天我回答了一个问题:

      你的情况是:

      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 不是一个字段,而是它在集合“计划”中的文档名称,我在答案中添加了图像。
      • 我希望每个用户都可以有多个计划,每个计划都有自己的文档,这可能吗?
      猜你喜欢
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      • 2013-09-12
      • 2021-09-30
      • 1970-01-01
      • 2020-01-18
      • 1970-01-01
      • 2018-08-08
      相关资源
      最近更新 更多