摘要
我如何在Firebase中建模我的数据库,以保持,例如,在特定页面中的评论与用户信息更新,这就是说,如果用户改变了它的头像或名称,评论也应该显示用户的更新数据。我大部分时间都在使用MongoDB,Mongoose,现在我正在使用Firebase开发一个移动的应用程序。在Mongo中,我只需要在评论中存储一个用户的引用,然后填充字段以从文档中检索我想要的数据。Firebase中是否有类似的东西,它甚至是一个好的或可接受的实践?
快速提问
- Firebase中是否有类似“.populate()”的东西?
1.我是否应该尽可能多地对文档进行建模,以使其具有view
中将要使用的数据,并避免“连接”?
示例
我们有一个用户集合,和一个商店集合与评论在它。
据我所知,您应该最小化doc读取,因此我们应该使用view
所需的特定值来建模数据,这样我们只需要执行一次查询。
为了简化起见,我们假设:
用户有姓名、电子邮件、头像
users: {
user_id_1: {
email: "user1@gmail.com",
name: "John Doe",
avatar: "some_firestore_url"
}
}
字符串
商店收藏应:
1.有嵌套的评论集合像这样
stores: {
store_id_1: {
name: "Dat Cool Store!",
reviews: {
user_id_1: {
name: "John Doe",
avatar: "some_firestore_url",
text: "Great store love it!",
timestamp: "May 07, 2020 at 03:30"
}
}
}
}
型
我看到的问题是,除非我们使用一个函数来更新每个文档中的每个字段,否则没有其他方法来更新名称和头像中的数据。
1.在字段中设置user_id,然后在以下位置查询用户信息:
stores: {
store_id_1: {
name: "Dat Cool Store!",
reviews: {
review_id_1: {
user: "user_id_1",
text: "Great store love it!",
timestamp: "May 07, 2020 at 03:30"
}
}
}
}
型
这就是我在MongoDB中的模仿方式。
抱歉,如果有些听起来很混乱,或者我没有用最好的方式解释自己,但现在是凌晨4点,我只是想让它正确:)
2条答案
按热度按时间tsm1rwdh1#
我如何在Firebase中建模我的数据库,以保持,例如,在特定页面中的评论与用户的信息更新,这就是说,如果用户更改了其头像或名称,评论也应该显示用户的更新数据。
如果不知道要执行的查询,就很难提供可行的模式。我们通常根据我们想要执行的查询来构建Firestore数据库。
在Mongo中,我只需要在评论中存储一个用户的引用,然后填充字段以从文档中检索我想要的数据。Firebase中是否有类似的东西,它甚至是一个好的或可接受的实践?
是的,有。根据有关Firestore supported data-types的官方文档,DocumentReference是其中之一,这意味着您只能存储文档的路径,而不是整个文档。在NoSQL世界中,复制数据是很常见的,因此在多个地方拥有相同的数据。同样,在不知道应用程序的用例的情况下,很难说使用规范化是否比只保存引用更好。为了更好地理解,我建议你阅读下面文章中的答案:
回答你们的问题:
如果只存储DocumentReference,并不意味着引用所指向的文档数据将自动填充。不,首先需要从文档中获取引用,然后基于该引用,必须执行另一个数据库调用,以实际从引用的文档中获取数据。
1.我是否应该尽可能多地对文档建模,以获得将在视图中使用的数据,并避免“连接”?
是的,您应该只存储实际需要在视图中显示的数据。关于JOIN子句,Firestore中不支持类似的内容。查询一次只能获取单个集合中的文档。例如,如果您希望从两个集合中获取数据,则至少需要执行两个查询。
另一种解决方案是添加第三个集合,其中包含已经从两个集合合并的数据,以便您可以执行单个查询。这在上面的链接中已经解释过了。
其他一些可能有用的信息在我的回答中解释了以下帖子:
您可以在其中找到将数据保存到文档、集合或子集合的最佳实践。
cx6n0qe32#
对我来说,构建json集合的方式也取决于我试图存储在集合中的数据的大小。
让我们说的用户数量如果小,我只想支持一个
thousand
用户。在这种情况下,我可以使用这个结构。字符串
现在,您可以将所有用户信息嵌入到
stores
集合中。这也会减少你的阅读量。但是如果你想扩展它,那么,我建议你只存储
users
元数据,然后再从users
集合中读取一次。希望这对你有帮助!