我正在构建一个社交应用程序,允许用户互相关注并获取他们关注的用户发布的帖子。目前,我正在计划如下所示存储我的数据,但是,我不确定它是否会扩展。
{
"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+。我需要通过以下方式查询数据:
对于用户,alovelace
获取用户最近的用户帖子
跟随。在我们的案例中,帖子为ghopper
,eclarke
和john
。这个
必须按时间排序并分页。因为我们可能只显示10个帖子
一次。
对于用户`john',在他的个人资料中显示他的所有帖子。
firebase是否适用于此类用例的正确数据库。结构是否遵循可扩展性?还有什么我需要考虑的吗?
答案 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的uid
和32gb2gjkb2g
以及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
节点。