Firestore的根用户为每种类型的用户提供不同的集合

时间:2018-09-11 14:58:49

标签: java android database firebase google-cloud-firestore

我正在基于Cloud Firestore创建一个应用程序。应用程序在某种程度上将与uber相同。因此,问题出在我刚接触NoSQL数据库时,却在为数据库创建良好的结构时遇到了问题。这是我计划用于Android App的UML的LINK。我打算使用Firestore来存储有关用户和其他数据的信息,而使用实时数据库来进行实时地图更新。

我在这里主要关心的是,正如您在UML中看到的那样,它以某种方式显示了不同表之间的关系,但是NoSQL没有表和关系,这给我带来了很多麻烦。经过大约4个小时的持续互联网搜索,我仍然不确定该怎么做。我想在这里回答一些问题:

1)有什么方法可以在不同的收藏夹之间建立关系?

2)我应该将所有3种类型的用户保存在同一集合“用户”中,还是在根目录中为每种类型进行不同的收集。同时使用两种方法会有什么后果。

如果我使用第一种方法,该如何区分每种类型的用户。

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

4)我决定在同一应用中使用2个不同的数据库吗?

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

这些问题听起来太初学者了,因为我只是在学习。任何帮助,将不胜感激。指向一些有用的文档,文章或指南的任何链接也将不胜感激。

1 个答案:

答案 0 :(得分:2)

  

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

是的。您可以通过保存引用中的引用来创建不同集合之间的关系,如有关supported data types的官方文档中所示。例如:

projects/[PROJECT_ID]/databases/[DATABASE_ID]/documents/[DOCUMENT_PATH].

还有另一种解决方法,涉及duplicating data,为此,我建议观看此视频Denormalization is normal with the Firebase Database。用于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

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

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
Query query = rootRef.collection("users").whereEqualTo("userType", admin);
  

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

您最多可以深度链接最多 100 个子集合。根据有关usage and limits的官方文档:

  

子集的最大深度:100

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

据我所知,Firestore可以在1级和100级一样快地查找节点。因此,对于您这样的数据库,深度不应是影响技术级速度的因素。

  

4)我决定在同一应用中使用2个不同的数据库吗?

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

  

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

让我们推荐或找到书籍,工具和软件库的问题对于Stack Overflow来说是不合时宜的,因为它们倾向于吸引有思想的答案和垃圾邮件,但我认为是的。