每个用户有多个集合的 Firestore 数据建模

Firestore data modeling with more than one collection for each user

到目前为止,在我的 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": [],
      },
    );
  }

我的建议是在收集“计划”下,创建名称与用户 user_id 匹配的文档,并将其数据存储在那里。您可以更轻松地根据 user_id.

创建 select 文档

您可以在每个用户文档中创建一个子集合plans。结构看起来像这样:

users -> {userId} -> plans -> {planId}
(col)     (doc)      (col)     (doc)

这里每个计划都有专门的文档。这也将阻止您通过不将所有计划都放在同一文档中的数组中来达到 1 MB max document size。您可以通过以下方式轻松查询用户的所有计划:

FirebaseFirestore.instance.collection('users').doc("userId").collection("plans")

虽然@Dharmaraj 的回答可行,但另请注意,这是一个替代解决方案,您可以在其中使用更扁平的数据库结构。我前几天回答过一个问题叫:

你的情况是:

Firestore-root
  | 
  --- users (collection)
  |     |
  |     --- $uid (document)
  |          |
  |          --- //user details
  | 
  --- plans (collection)
        |
        --- $planId (document)
             |
             --- uid: $uid

通过这种方式,您还可以将每个“计划”作为“计划”顶级集合中的单独文档。