我正在基于Cloud Firestore创建一个应用程序。应用程序在某种程度上将与uber相同。因此,问题出在我刚接触NoSQL数据库时,却在为数据库创建良好的结构时遇到了问题。这是我计划用于Android App的UML的LINK。我打算使用Firestore来存储有关用户和其他数据的信息,而使用实时数据库来进行实时地图更新。
我在这里主要关心的是,正如您在UML中看到的那样,它以某种方式显示了不同表之间的关系,但是NoSQL没有表和关系,这给我带来了很多麻烦。经过大约4个小时的持续互联网搜索,我仍然不确定该怎么做。我想在这里回答一些问题:
1)有什么方法可以在不同的收藏夹之间建立关系?
2)我应该将所有3种类型的用户保存在同一集合“用户”中,还是在根目录中为每种类型进行不同的收集。同时使用两种方法会有什么后果。
如果我使用第一种方法,该如何区分每种类型的用户。
3)我可以在一个集合(即集合中的子集合)中进行多少深层嵌套?
4)我决定在同一应用中使用2个不同的数据库吗?
5)Firebase是我正在创建的应用的正确选择吗?
这些问题听起来太初学者了,因为我只是在学习。任何帮助,将不胜感激。指向一些有用的文档,文章或指南的任何链接也将不胜感激。
答案 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来说是不合时宜的,因为它们倾向于吸引有思想的答案和垃圾邮件,但我认为是的。