【问题标题】:Firestore DB model, Attribute in document or subcollectionFirestore 数据库模型、文档或子集合中的属性
【发布时间】:2018-07-01 22:17:38
【问题描述】:

我在为 Firebase/Firestore 建模时经常遇到这种分岔路,也许您可​​以对此有所了解。

如果我有多个管理员可以以他们的名义为每个客户(100 多个)。管理员看不到其他管理员客户端(将它们视为单独的公司)。什么会更好?

1) 添加 Clients 根集合,并在其下添加一个 ID 为管理员电子邮件的文档,并在其下添加一个包含客户文档的子集合:

Firestore-root
   |
   --- Clients(collection)
         |
         --- Admin ID/Email(Collection)
              |
              ----------Clients Info (documents)

2) 或者添加客户端根集合及其下的客户端文档,但每个文档中的一个属性将是管理员电子邮件:

Firestore-root
   |
   --- Clients(collection)
         |
         --- Clients Info (documents)
             |
              --- AdminId: (email)

如果您想在测试/甚至生产期间在控制台中查看数据,我发现第一个更容易查询,最重要的是更具可读性。但我发现第二个关卡的数量较少。

解决这个问题的正确方法是什么? 谢谢

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

    数据库结构没有正确的方法。适合您的数据库的解决方案是适合您的需求并使您的工作更轻松的解决方案。我对您的数据库架构的看法实际上与您真正想要实现的目标有关。

    如果您想查询数据库以仅获取与特定管理员对应的客户端,那么您可以继续使用第一个选项。如果您想在某个时候从数据库中获取所有客户端,那么第二个选项将帮助您实现这一目标。因此,使用这两个选项可能是一种选择。

    但是,如果您想使用第二个选项实现相同的目的,则只有在您使用基于单个属性(uid 属性)的查询时才有可能,如下所示:

    FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
    CollectionReference clientsRef = rootRef.collection("Clients");
    Query query = clientsRef.whereEqualTo("uid", uid);
    

    但是,如果您想实现与第一个选项相同的目标并使用如下所示的查询:

    Query query = clientsRef.whereEqualTo("uid", uid).orderBy("aProperty", Query.Direction.ASCENDING);
    

    您需要知道您无法做到这一点。这是不可能的,因为在这种情况下您需要创建一个index,并且您不能为每个uid 手动创建一个索引。

    还有一点,我建议您使用uid 而不是email address 作为文档键。

    【讨论】:

    • 谢谢,所以选择第二个选项是有意义的,因为它允许灵活地获取所有客户端和每个管理员获取客户端。您能否详细说明为什么使用 uid 而不是电子邮件? admin id就是他的email地址,为什么需要映射?
    • 如果您实施匿名身份验证,然后您想将帐户链接到 Google 帐户或任何其他提供商,则需要使用 uid,因为这只能基于 uid 而不是基于电子邮件地址。
    • 噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢!我从来没有想过我会面临这样的问题。非常感谢
    猜你喜欢
    • 2018-06-03
    • 2018-10-21
    • 2021-11-04
    • 2023-03-18
    • 2020-02-27
    • 2018-07-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多