1

我正在構建一個社交應用程序,該應用程序允許用戶彼此關注並獲取他們關注的用戶發佈的帖子。目前,我計劃將數據存儲爲如下所示,但是,我不確定它是否會縮放。從Firebase中的節點查詢多個用戶的帖子的有效方法

{ 
    "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拿到最近的用戶的用戶 後續的職位。在我們的案例中,帖子爲ghopper,eclarkejohn。這 必須按時間和分頁。因爲我們一次只能顯示10個帖子 。

  2. 對於用戶'john',在他的個人資料中顯示他的所有帖子。

Firebase是這種用例的正確DB。結構是否遵循可伸縮性?還有什麼我需要考慮的嗎?

回答

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是洛夫萊斯阿達的uid32gb2gjkb2g23g23gg2g2uid小號誰張貼的用戶。

每當用戶創建一個帖子,讓他們所有的追隨者:

"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來查詢用戶的以下信息。

要獲取所有john的帖子,只需查詢指定他名字的posts節點。

fanout

+0

如果我們不扇出,將查詢職位節點上是慢? – esafwan

+1

假設有人有500個關注者。你將不得不提出500個請求。所以是的,非常緩慢。 – theblindprophet

相關問題