Firebase - 组织排名系统。随着喜欢的历史

时间:2017-01-17 14:19:31

标签: angular firebase firebase-realtime-database data-modeling angularfire2

我正构建一个应用程序,用户可以在其中发布,删除并对其他人进行排名(比如,不喜欢)'帖子。 在个人资料页面上,用户还可以查看他喜欢的帖子。

目前我正在考虑使结构像这样(真的 - 因为喜欢,假的不喜欢,空的没有评级):

{
"ranks": {
    "post1": {
      "user1": "true",
      "user2": "false",
      "user3": "false"
    },
    "post2": {
      "user1": "true",
      "user3": "true"
    },
    "post3": {
      "user1": "false",
      "user2": "true",
      "user3": "true"
    }
  }
}

在我需要检索用户喜欢的所有帖子之前,所有内容似乎都很好。 例如。对于user1将是[post1,post2]。对于user2 - [post3]。

然后我想以下列方式对其进行重组:

{
"ranks_by_user": {
    "user1": {
      "post1": "true",
      "post2": "true",
      "post3": "false"
    },
    "user2": {
      "post1": "false",
      "post3": "true"
    },
    "user3": {
      "post1": "false",
      "post2": "true",
      "post3": "true"
    }
  }
}

然而,这更不方便:如果我删除帖子怎么办,怎么还会删除所有相关的排名?无法找出查询以查找rank_by_user列表中包含post-n子项的所有用户。 如何解决这样的结构问题?

1 个答案:

答案 0 :(得分: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();
    });
});