firebase - Firestore 为 noSQL 和 Flutter 复制 SQL 连接
问题描述
我意识到在使用 FireStore 等 NoSql 文档数据库复制连接方面存在很多问题,但是我无法找到将 Dart/Flutter 与 FireStore 结合使用的彻底解决方案。
我做了一些研究,我觉得在下面的例子中我会寻找一个“多对多”的关系(如果这是错误的,请纠正我)因为将来可能需要查看所有配置文件以及所有连接.
在firebase中,我有两个根级集合(配置文件和连接):
profile
> documentKey(Auto Generated)
> name = "John Smith"
> uid = "xyc4567"
> documentKey(Auto Generated)
> name = "Jane Doe"
> uid = "abc1234"
> documentKey(Auto Generated)
> name = "Kate Dee"
> uid = "efg8910"
connection
> documentKey(Auto Generated)
> type = "friend"
> profileuid = "abc1234"
> uid = "xyc4567"
> documentKey(Auto Generated)
> type = "family"
> profileuid = "abc1234"
> uid = "efg8910"
对于此示例,假设用户 John Smith (uid: xyc4567) 在连接到 Jane Doe (uid: abc1234) 和 Kate Dee (uid: efg8910) 时创建了“连接”文档。
这是我要复制的关系 SQL,以显示 John Smith 已连接的配置文件列表:
Select * FROM profile, connection
WHERE profile.uid = connection.profileuid
AND profile.uid = "xyc4567"
在颤振我的颤振应用程序中,我有一个 fireStore 查询起点:
stream: Firestore.instance.collection('profile')
.where('uid', isEqualTo: "xyc4567").snapshots(),
显然它只从一个集合返回。我如何以多对多关系加入集合?
解决方案
不幸的是,Cloud Firestore 和其他 NoSQL 数据库中都没有JOIN
子句。在 Firestore 中,查询很浅。这意味着他们只能从运行查询的集合中获取项目。无法在单个查询中从两个顶级集合中获取文档。Firestore 不支持一次性跨不同集合进行查询。单个查询只能使用单个集合中文档的属性。
所以我能想到的最简单的解决方案是查询数据库以从集合中获取uid
用户的。profile
获得该 ID 后,进行另一个数据库调用(在回调中),并connection
使用以下查询从集合中获取所需的相应数据:
stream: Firestore.instance.collection('connection').where('uid', isEqualTo: "xyc4567").snapshots(),
另一种解决方案是创建一个以connection
每个用户命名的子集合,并connection
在其下添加所有对象。这种做法称为denormalization
Firebase 的常见做法。如果您是 NoQSL 数据库的新手,我建议您观看此视频,为了更好地理解Firebase 数据库的非规范化是正常的。它适用于 Firebase 实时数据库,但同样的规则适用于 Cloud Firestore。
此外,当您复制数据时,需要记住一件事。与添加数据的方式相同,您需要对其进行维护。换句话说,如果你想更新/删除一个项目,你需要在它存在的每个地方都这样做。
推荐阅读
- validation - 方法 Illuminate\Http\Request::first 在 laravel 6 错误中不存在
- reactjs - React ERROR:TypeError:无法读取未定义的属性“路径名”
- python - 根据位数将整数四舍五入到下一个 99
- react-native - 如何让我的文本出现在反应原生的点击按钮上?
- java - Apache Tika 语言检测:亚洲语言增强
- apache-spark - 是否可以根据有时可能包含空值的列对数据进行分区?如何处理?
- android - Google InApp 更新不起作用 - 始终返回 UPDATE_NOT_AVAILABLE
- java - 我在使用 ClassLoader getResources 时犯了什么错误?
- java - 如何在file.txt中搜索包含字符串的行
- angular - Angular 应用程序中的资产缓存问题