我有一个SQL背景,并且正在努力使自己了解文档存储。对于Firebase数据库结构,如下所示:
我正在使用CollectionGroup来获取特定餐厅的所有评论(餐厅ID在评论文档中)。这很好。我还想获取有关用户的一些元数据。在遍历返回的每个评论时,我可以通过辅助查询来实现此目的:
restaurantReviewsSnapshot.forEach(reviewSnap => {
reviewSnap.ref.parent.parent.get().then(reviewerSnap => {
...
但是,这效率不高。是否可以一口气通过某种联接操作获得这些相关数据?
答案 0 :(得分:2)
在您的情况下,NoSQL世界中的一种经典方法是以一种易于构建和执行查询的方式对数据进行非规范化。
更具体地说,这意味着您将在每个Review文档中复制其作者的数据。
此方法的一个副作用是您需要使值保持同步(即,用户/作者文档中的值和审阅文档中的值)。如果修改了作者文档,则可以通过触发Cloud Function来完成此同步。
同样,您不必害怕重复数据和使数据模型非规范化。这是有关NoSQL数据建模方法的“著名”文章:https://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/