我正在将我的应用程序从实时数据库 (RTDB) 移至 Firestore。我对某些对象的数据结构有一些疑问。在实时数据库中,我们本质上可以监听任何级别的实时更改,但在 Firestore 中,我们只能监听集合或文档中的实时更改。例如,我在RTDB中有以下数据
images
对象包含用户的个人资料图像。用户可以在其个人资料中看到该图像,也可以将其作为将该用户作为联系人的用户的联系人图像。当用户更新图像时,联系人图像也会自动更新。因此,我们监听图像对象的变化,并在变化时更新 images
。
将其移动到 Firestore 时,我将其复制如下:
但是现在我不能只监听
images
对象的更改并更新联系人图像。相反,我必须监听整个 userInfo 对象的更改,并在 userInfo 对象发生任何更改时更新图像。 userInfo 对象跟踪一堆东西,因此更改处理程序将被调用多次。
我想我应该将图像存储为顶级集合,并为每个用户存储图像并监听用户的图像文档。我想知道这是否是存储图像的更好方法,以及是否有一个通用指南来存储客户端需要在 Firestore 文档中侦听的对象。有许多此类对象可能会实时更改,这些对象在 RTDB 的以下数据模型中运行良好,但在 Firestore 中证明具有挑战性。
由于我无法监听 Firestore 文档中对象的更改,因此我试图找出从数据模型角度处理此类情况的最佳方法。
是的,这是正确的。您无法仅获取文档的一部分,这是使用 Web 或移动客户端 SDK 无法实现的。 Firebase 侦听器在文档级别触发,因此您可以阅读整个文档,也可以不阅读任何内容。
在这种情况下,最好的选择是对数据进行非规范化。这意味着您可以将图像存储在 Firestore 中的单独集合或子集合中,也可以将相同的非规范化数据保存在实时数据库中。后者将是首选解决方案,因为它提供了附加侦听器并仅从数据的特定部分获取实时更新的能力。