首页 > 解决方案 > 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(),

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

标签: firebasedartflutternosqlgoogle-cloud-firestore

解决方案


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

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

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

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

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


推荐阅读