从Firebase

时间:2017-06-11 11:56:07

标签: firebase data-structures firebase-realtime-database scalability nosql

我正在构建一个社交应用程序,允许用户互相关注并获取他们关注的用户发布的帖子。目前,我正在计划如下所示存储我的数据,但是,我不确定它是否会扩展。

{
  "users": {
    "alovelace": {
      "name": "Ada Lovelace",
      "follows": { 

                   "ghopper": true,
                   "eclarke": true,
                   "john": true
                   //+100 more maybe
      },
    },
    "ghopper": { ... },
    "john": { ... },
    "eclarke": { ... }

    //all the users....
  },

  "posts": {

      "p1": {
        "user": "eclarke",
        "post": "Its a wonderful day today.",
        "timestamp": 1459361875337
      },
      "p2": {
        "user": "john",
        "post": "The laptop seems to be malfunctioning.",
        "timestamp": 9454361875332
      },
      "p3": {
        "user": "ghopper",
        "post": "The bus is late.",
        "timestamp": 6593618235336
      },
      "p4": {
        "user": "someotheuser",
        "post": "The relay seems to be malfunctioning.",
        "timestamp": 1459361875337
      },
      "p5": {
        "user": "eclarke",
        "post": "The relay seems to be malfunctioning.",
        "timestamp": 5459361875331
      },
      "p6": {
        "user": "alovelace",
        "post": "The relay seems to be malfunctioning.",
        "timestamp": 3459361875334
      }
      //1,000,000+ posts maybe present. 
  }
}

所有用户都与他们关注的人一起存储在users节点中。并且所有用户发布的所有帖子都存储在节点帖子中。虽然该平台的用户可以扩展到1000的,但是没有。帖子应该很容易扩展到1,000,000+。我需要通过以下方式查询数据:

  1. 对于用户,alovelace获取用户最近的用户帖子 跟随。在我们的案例中,帖子为ghoppereclarkejohn。这个 必须按时间排序并分页。因为我们可能只显示10个帖子 一次。

  2. 对于用户`john',在他的个人资料中显示他的所有帖子。

  3. firebase是否适用于此类用例的正确数据库。结构是否遵循可扩展性?还有什么我需要考虑的吗?

1 个答案:

答案 0 :(得分:2)

我刚刚解决了这个问题,你必须使用一种名为扇动的技术。它涉及复制一些数据,但Firebase在某些文档中明确指出数据比时间便宜,所以如果它有利,它可以复制。

在数据库中创建一个timeline节点:

{
    123456: {
        user: "Ada Lovelace",
        posts: {
            32gb2gjkb2g: {
                "user": "someotheuser",
                "post": "The relay seems to be malfunctioning.",
                "timestamp": 1459361875337
            },
            23g23gg2g2: {
                "user": "someotheuser",
                "post": "The relay seems to be malfunctioning.",
                "timestamp": 1459361875337
            },
            ...
        }
    }
}

其中123456是Ada lovelace的uid32gb2gjkb2g以及23g23gg2g2是发布的用户的uid

每次用户创建帖子时,请获取所有关注者:

"ghopper": { ... },
"john": { ... },
"eclarke": { ... }

当用户发帖时,遍历每个关注者并将其展开到对象中:

this.fanoutObj= {};
followers.forEach((follower_uid) => {
    this.fanoutObj['/timelines/' + follower_uid + '/' + some_post_id] = some_post_obj;
});
this.AF.database.object("/").update(this.fanoutObj);

现在,您只需使用uid查询时间线即可查询用户的以下帖子。

要获取所有约翰的帖子,只需查询指定其姓名的posts节点。

fanout