我有一段时间试图把我认为是一个简单的概念包围我的头脑。
我有一个应用程序,我注册了一个用户,允许该用户在Firebase系统中为他们的“用户”信息设置“photoURL”。这个很管用。当用户在我的应用程序中创建一个帖子时,我希望显示创建者的标题、图像和'photoURL‘。
目前,我保留这个职位:
-Post {
-id
-title
-image
-photoURL <- from current logged in user }我还允许用户通过路由/海报/“displayName”访问海报页面
因此,稍后,当用户更新他们的配置文件信息(如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)
}我读到的所有东西都说我需要将photoURL存储在我自己的“用户”表中。如果我这样做,那么所有的帖子都不会被更新,除非我每次都会写一个服务器调用来完成这个任务。问题是,如果我有100 K用户,其中10%的用户更改了他们的photoURL,那么我必须在每个用户的帖子、评论、回复和消息中更改它。如果平均每个用户有100个帖子,4000条评论,6000条回复,我们将看到大约10K个必须更新的10K用户,如果平均服务器呼叫是137 my,那么我的成本大约是175美元(成本)。
另一种选择是每次从两个表中提取信息并创建一个新对象。这将导致服务器调用和时间增加一倍,从而使我的成本翻一番。
这是最好的方法吗?我认为这会更容易得到用户的照片和显示名称。
很抱歉,这是一篇史诗般的长篇文章,但我正在努力学习。谢谢大家!
发布于 2017-11-16 16:22:17
在使用noSQL数据库时,您描述的是一个典型的问题。一方面,数据复制使您的应用程序及其查询运行得更快。另一方面,如果您想要更改任何重复的数据,则查找和替换所有出现的数据可能会有问题。
没有“最佳”的方法来决定该做什么。完全取决于你的特殊情况。听起来,如果您有大量的数据复制,而更新成本很高,那么最好每次只查询用户记录,而不是进行更新。但再说一次,这最终取决于你。
https://stackoverflow.com/questions/47334382
复制相似问题