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 - 组织排名系统。连同喜欢的历史的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:具有多对多关系的历史排名系统

Firebase 的喜欢/不喜欢功能

使用云功能在 Firebase 实时数据库中交换排名 - 游戏

Firebase 获取数据

口碑最好的净水器排名是啥?

推荐系统手把手带你学推荐系统 3 实现第一个推荐系统