Firebase - 组织排名系统。连同喜欢的历史
Posted
技术标签:
【中文标题】Firebase - 组织排名系统。连同喜欢的历史【英文标题】:Firebase - organising ranking system. Along with history of likes 【发布时间】:2017-06-01 15:44:13 【问题描述】:我正在构建一个应用程序,用户可以在其中发布、删除和排名(喜欢、不喜欢)彼此的帖子。 在个人资料页面上,用户还可以查看他曾经喜欢的帖子。
目前我正在考虑制作类似的结构(true - 表示喜欢,false 表示不喜欢,空表示没有评分):
"ranks":
"post1":
"user1": "true",
"user2": "false",
"user3": "false"
,
"post2":
"user1": "true",
"user3": "true"
,
"post3":
"user1": "false",
"user2": "true",
"user3": "true"
在我需要检索用户曾经喜欢的所有帖子之前,一切看起来都不错。 例如。对于 user1 将是 [post1,post2]。对于用户 2 - [post3]。
然后我想通过以下方式对其进行重组:
"ranks_by_user":
"user1":
"post1": "true",
"post2": "true",
"post3": "false"
,
"user2":
"post1": "false",
"post3": "true"
,
"user3":
"post1": "false",
"post2": "true",
"post3": "true"
然而,这更不方便:如果我删除一个帖子,我怎么会删除所有相关的排名?无法找出查询来查找ranks_by_user 列表中具有后n 个孩子的所有用户。 如何解决这样的结构问题?
【问题讨论】:
【参考方案1】:所以你的结构是正确的。使用 firebase,普遍的共识是您将拥有重复的数据。至于如何删除的第二个问题,因为所有内容都已展平并且没有外键,您必须自己连接查询。根据您的模型,这样的事情可能会起作用:
...child('ranks_by_user').orderBy('post2').equalTo(true).once('value', function()
//delete record
);
...child('ranks_by_user').orderBy('post2').equalTo(false).once('value', function()
//delete record
);
问题是它会很慢,因为 post2 不会被索引。相反,使用您的第一个模型,您将能够查询该记录以查看谁喜欢/不喜欢它,然后去删除其他模型记录中的条目。这将是我的建议。这里有一些代码(在 angular1 中完成)可以为您做到这一点:
var postId = 'post1';
...child('ranks').child(postId).once('value', function(snapshot)
angular.forEach(snapshot.val(), function(value, userId)
...child('ranks').child(postId).child(userId).remove();
...child('ranks_by_user').child(userId).child(postId).remove();
);
);
【讨论】:
谢谢你的回答,伙计。所以,你是建议同时使用这两个模型,对吧(ranks_by_post 和ranks_by_user)? 很高兴为您提供帮助,您打赌。以上是关于Firebase - 组织排名系统。连同喜欢的历史的主要内容,如果未能解决你的问题,请参考以下文章