Database 在Firestore中处理复杂查询
我有一个由评论、关注和用户组成的数据库。其中,用户跟随其他用户是由下表建模的多对多关系。总的来说,我的模式如下所示:Database 在Firestore中处理复杂查询,database,firebase,google-cloud-firestore,nosql,Database,Firebase,Google Cloud Firestore,Nosql,我有一个由评论、关注和用户组成的数据库。其中,用户跟随其他用户是由下表建模的多对多关系。总的来说,我的模式如下所示: 跟随(收集)-键:fid 以下(uid) 跟随器(uid) 查看(收集)-关键字:rid 标题(字符串) 作者(uid) 已过帐(时间戳) 用户(集合)-密钥:uid 已创建(时间戳) 电子邮件(字符串) 我想运行一个查询来获取用户跟踪作者的T最新评论。在SQL环境中,我将使用两个连接和一个where子句来实现这一点 让我们考虑一个用户遵循代码> N< /代码>人
- 跟随(收集)-键:fid
- 以下(uid)
- 跟随器(uid)
- 查看(收集)-关键字:rid
- 标题(字符串)
- 作者(uid)
- 已过帐(时间戳)
- 用户(集合)-密钥:uid
- 已创建(时间戳)
- 电子邮件(字符串)
T
最新评论。在SQL环境中,我将使用两个连接和一个where
子句来实现这一点
让我们考虑一个用户遵循代码> N< /代码>人,他们跟随的每个人都有<代码> M< /代码>评论。我正在考虑查找所有
n
人的所有评论,然后丢弃所有早于T
的评论,但要知道读取次数将是n*m
。正如我们很容易预期的那样,n>100
和m>1000
,这不是一个可行的解决方案。我认识到在firestore中可能没有很好的方法来做到这一点。有什么建议吗
更新:对于一个类似的问题,给出了一个nk
(其中k
是一个任意限制)的读取次数解决方案。它还回答了一个更简单的问题:“获取每个关注者的T
最新评论”而不是“获取所有关注者的T
最新评论。”,建议在每次评论中保留所有关注者的最新副本,然后执行whererraycontains
子句查找关注者。但是,如果用户A
跟踪一个进行了B\m
审查的用户B\m
,我们将为每次跟踪或取消跟踪执行B\m
写入操作。我们还将对我们的数据库进行大规模的非规范化,在数千个位置存储和更新相同的信息。您的数据似乎高度相关,因此您最好的选择是切换到关系数据库。要在firestore中实现这一点,唯一的方法是完全反规范化您的数据,或者将大量查询链接在一起以获取您所需的所有数据,在我看来这两种方法都不理想。您的数据似乎高度相关,因此您最好的选择是切换到关系数据库。要在firestore中实现这一点,唯一的方法是完全反规范化您的数据,或者将大量查询链接在一起以获取您所需的所有数据,我认为这两种方法都不理想。Hi@thedeg123事实上,firestore并不适合这种类型的查询。您最好将数据读入数组/变量,并在此变量中进行搜索。一、 然而,我发现了一个与你类似的问题,其中有一些有趣的信息。你能检查一下这是否对你有帮助吗?@gso_gabriel只是稍微有点,最上面的答案()基本上是对我已经拥有的东西的分层解释。此外,它给出了与我上面考虑的相同的查询!通过对每个用户施加k个评论的任意限制进行调整,这意味着nk读取而不是nm。下一个答案是better(),但是如果用户A跟随一个有B_m评论的用户B,我们将为每个跟随执行B_m写入。Hi@thedeg123确实,Firestore不适合这种类型的查询。您最好将数据读入数组/变量,并在此变量中进行搜索。一、 然而,我发现了一个与你类似的问题,其中有一些有趣的信息。你能检查一下这是否对你有帮助吗?@gso_gabriel只是稍微有点,最上面的答案()基本上是对我已经拥有的东西的分层解释。此外,它给出了与我上面考虑的相同的查询!通过对每个用户施加k个评论的任意限制进行调整,这意味着nk读取而不是nm。下一个答案是better(),但是如果用户A跟随一个有B_m评论的用户B,我们将为每个跟随执行B_m写入。