Firestore 根目录中每种类型用户的不同集合

Ali*_*sam 2 java database android firebase google-cloud-firestore

我正在创建一个基于 Cloud Firestore 的应用程序。应用程序的工作方式将与 uber 相同。所以问题是,由于我对 NoSQL 数据库相当陌生,我在为数据库创建良好的结构时遇到了问题。这是我计划用于我的 Android 应用程序的 UML 的链接。我计划使用 Firestore 存储有关用户的信息和其他数据,而实时数据库用于实时地图更新。

我主要关心的是,正如您在 UML 中看到的,它以某种方式显示不同表之间的关系,但 NoSQL 没有表和关系,这让我在这里遇到困难。经过大约 4 个小时的连续互联网搜索后,我仍然不知道该怎么办。我在这里有一些问题希望得到解答:

1)有什么方法可以在不同集合之间创建关系吗?

2)我应该将所有 3 种类型的用户保存在同一集合“用户”中,还是为根中的每种类型创建不同的集合。使用这两种方法会产生什么后果。

如果我使用第一种方法,我可以做什么来区分每种类型的用户。

3)我可以在单个集合(即集合中的子集合)中进行多少深度嵌套?

4)我在同一个应用程序中使用两个不同数据库的决定正确吗?

5)Firebase 是我正在创建的应用程序的正确选择吗?

这些问题可能听起来太初学者了,因为我才刚刚学习。任何帮助,将不胜感激。任何有用的文档、文章或指南的链接也将不胜感激。

Ale*_*amo 7

1)有什么方法可以在不同集合之间创建关系吗?

就在这里。您可以通过保存有关支持的数据类型的官方文档中所示的引用来创建不同集合之间的关系。例如:

projects/[PROJECT_ID]/databases/[DATABASE_ID]/documents/[DOCUMENT_PATH].
Run Code Online (Sandbox Code Playgroud)

还有另一种解决方法,其中涉及duplicating data,为此我建议观看此视频,非规范化在 Firebase 数据库中是正常的。适用于 Firebase 实时数据库,但相同的原则也适用于 Cloud Firestore。

2)我应该将所有 3 种类型的用户保存在同一集合“用户”中,还是为根中的每种类型创建不同的集合。使用这两种方法会产生什么后果。

为了简单起见,您可以使用单个集合并将用户的类型添加为属性,如下所示:

Firestore-root
   |
   --- users
        |
        --- uid
        |    |
        |    --- userType: "admin"
        |    |
        |    --- //other user details
        |
        --- uid
        |    |
        |    --- userType: "driver"
        |    |
        |    --- //other user details
        |
        --- uid
             |
             --- userType: "rider"
             |
             --- //other user details
Run Code Online (Sandbox Code Playgroud)

要查询特定用户类型的所有用户,可以使用以下查询:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
Query query = rootRef.collection("users").whereEqualTo("userType", admin);
Run Code Online (Sandbox Code Playgroud)

3)我可以在单个集合(即集合中的子集合)中进行多少深度嵌套?

您最多可以深度链接100个子集合。根据有关使用和限制的官方文档:

子集合的最大深度:100

您可能想知道,这是一个问题吗?

据我所知,Firestore在1级查找节点的速度与在100级查找节点的速度一样快。因此,对于像您这样的数据库,深度不应该成为技术层面上影响速度的因素。

4)我在同一个应用程序中使用两个不同数据库的决定正确吗?

是的。事实上,这是一种很常见的做法。根据这两种价格计划,您可以选择更适合您需求的一种。

5)Firebase 是我正在创建的应用程序的正确选择吗?

要求我们推荐或查找书籍、工具、软件库的问题对于 Stack Overflow 来说是偏离主题的,因为它们往往会吸引固执己见的答案和垃圾邮件,但在我看来,是的。