gpt4 book ai didi

firebase - Firestore 为 noSQL 和 Flutter 复制 SQL Join

转载 作者:IT王子 更新时间:2023-10-29 07:09:37 26 4
gpt4 key购买 nike

我意识到在使用 NoSql 文档数据库(例如 FireStore)复制连接方面存在很多问题,但是我无法找到将 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"

在 flutter 我的 flutter 应用程序中,我有一个 fireStore 查询起点:

stream: Firestore.instance.collection('profile')
.where('uid', isEqualTo: "xyc4567").snapshots(),

显然它只从一个集合中返回。我如何以多对多关系加入集合?

最佳答案

不幸的是,Cloud Firestore 和其他 NoSQL 数据库中都没有 JOIN 子句。在 Firestore 中查询很浅。这意味着他们只能从运行查询的集合中获取项目。无法在单个查询中从两个顶级集合中获取文档。 Firestore 不支持一次跨不同集合的查询。单个查询只能使用单个集合中文档的属性。

所以我能想到的最简单的解决方案是查询数据库以从profile 集合中获取用户的uid。获得该 ID 后,进行另一个数据库调用(在回调内),并使用以下查询从 connection 集合中获取所需的相应数据:

stream: Firestore.instance.collection('connection').where('uid', isEqualTo: "xyc4567").snapshots(),

另一种解决方案是在每个用户下创建一个名为 connection 的子集合,并在其下添加所有 connection 对象。这种做法称为 非规范化,是 Firebase 的常见做法。如果您是 NoQSL 数据库的新手,我建议您观看此视频 Denormalization is normal with the Firebase Database 以便更好地理解。它适用于 Firebase 实时数据库,但同样的规则适用于 Cloud Firestore。

此外,当您复制数据时,需要牢记一件事。以与添加数据相同的方式,您需要维护它。换句话说,如果你想更新/删除一个项目,你需要在它存在的每个地方进行。

关于firebase - Firestore 为 noSQL 和 Flutter 复制 SQL Join,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54650261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com