我有时间试图绕过我认为简单的概念。
我有一个应用程序,我在其中注册用户,允许该用户设置一个' photoURL'他们的用户' Firebase Auth系统中的信息。这有效。当用户在我的应用程序中创建帖子时,我想显示标题,图像和 ' photoURL'创作者
目前,我保存帖子:
-Post {
-id
-title
-image
-photoURL <- from current logged in user }
我还允许用户通过路由/海报/&#39; displayName&#39;
访问海报页面所以稍后,当用户更新他们的个人资料信息(如displayName或photoURL)时,是否需要查找所有帖子,评论,消息,回复以及此用户有记录并更新photoURL的任何其他地方?
我认为我能做的是:(伪代码)
get all posts =>
foreach(post)
post = {
title: post.title.val()
image: post.image.val()
avatar: firebase.database().ref().child('users' + post.key)
}
我读到的所有内容都说我需要将photurL存储在我自己的“用户”中。表。如果我这样做,那么除非我每次发生更改时写一个服务器调用来执行此操作,否则所有帖子都不会更新。问题是,如果我有100K用户,并且其中10%用户更改了他们的photoURL,那么我必须在每个用户的帖子,评论,回复和消息中进行更改。如果普通用户有100个帖子,4000个评论,6000个回复,我们正在查看大约10K个位置* 10K用户必须更新,如果平均服务器呼叫是137毫秒,那么我的成本大约是175美元({{ 3}})
另一种选择是从两个表中提取信息并每次创建一个新对象。这将导致服务器呼叫和时间增加一倍,从而使我的成本翻倍。
这是最好的方法吗?我认为只需获取用户照片和显示名称就容易多了。
对于史诗般的长篇帖子感到抱歉,但我正在努力学习。谢谢大家!
答案 0 :(得分:3)
使用noSQL数据库时,您所描述的是一个典型问题。一方面,数据复制使您的应用及其查询运行得更快。另一方面,如果要更改任何重复数据,查找和替换所有实例可能会出现问题。
没有“最好”的方法来决定做什么。这完全取决于您的具体情况。听起来,如果你有大量的数据重复,更新成本很高,那么每次只查询用户记录而不是进行更新会更好。但同样,这最终取决于你。