对于如附件图片所示的由帖子组成的新闻提要,使用Firestore时加载与每个帖子对应的用户名和用户图片的最佳方法是什么? < / p>
Firestore集合:
user
- userId
- userName
- userPic
post
- postContent
- postDate
- userId // refers to the userId of a user stored in the users collection
在Firestore中,如何以最有效的方式加载最近发布的10条帖子-分别附有用户名和用户图片?
我认为对我不起作用的解决方案:
在应用启动时加载所有用户数据,然后手动将帖子中存储的用户ID与加载的用户进行比较,以获取用户详细信息。为什么不呢?用户太多,无法全部预先加载!
将帖子发布到Firestore时,将用户名和用户图片保存在帖子文档中。为什么不呢?因为帖子发布后用户名和/或用户图片可能会更改!
从Firestore中获取帖子,然后在应用程序中针对每个单独的帖子,根据用户ID从Firestore中获取相应的用户数据。为什么不呢?向Firestore提出了许多其他要求。例如,如果我想加载10个帖子,那么这是10个帖子的一个请求,再加上10个通过id获取每个用户的请求,总共有11个请求。
在将结果发送给我之前,是否可以让Firestore将用户数据与其末尾的帖子进行合并? (就像在实际的DBMS中一样)
答案 0 :(得分:0)
在前两种情况下,您猜对了,但第三种情况可以解决您的问题。由于在Cloud Firestore中,Reference
是supported data types,因此您可以利用此功能:
项目/ [PROJECT_ID] /数据库/ [DATABASE_ID] /文档/ [DOCUMENT_PATH]
因此,您可以保留对用户对象的引用,因此可以非常轻松地获取其详细信息。确实,您需要额外阅读,但这是我能想到的最简单的方法,您可以实现自己想要的。
您还可以通过将用户对象添加为发布对象的属性来对数据进行非规范化,但这意味着如果用户更改名称,则会对所有用户对象进行额外的更新。因此,在这种情况下,您还有太多额外的写操作。这种做法称为denormalization
,是Firebase的常见做法。为了更好的理解,我建议您观看此视频Denormalization is normal with the Firebase Database。它适用于Firebase实时数据库,但相同的规则适用于Cloud Firestore。因此,多少复制数据与额外的数据库调用最适合您,取决于您的应用程序用例,您的需求以及您是否愿意放弃“单点定义”思维方式。