2012-04-30 13 views
9

Reddit目前正在將其數據庫從PosgreSQL遷移到Apache Cassandra。有人知道Reddit在Cassandra中使用的數據庫模式嗎?Reddit中使用的Cassandra數據庫模式是什麼?

+0

我不知道,我不確定Reddit以外的任何人都能做到,但是它真的很重要嗎?我希望這裏有很多人可以幫助確定適用於* your *應用程序的模式。 –

+2

Reddit發佈了GitHub上的網站代碼:https://github.com/reddit/reddit。我可以在代碼中搜索並從那裏確定模式。但我認爲在這裏更容易提問。 –

+1

我瞥了一眼代碼,發現有二十多個不同的列家族以不同的方式創建和使用。有沒有特別想知道的區域,還是你正在尋找更多像cassandra-cli的'show schema'輸出這樣的東西? –

回答

-1

我也不知道確切的reddit的模式,但對於要存檔的東西,你是在正確的道路,節能的評論在基於文檔的數據庫,而不是關係數據庫中的層次結構。我建議爲每個根註釋保留一個文檔,然後將所有子項(以及子項的子項)添加到該註釋中。

在CouchDB和MongoDB中,您可以直接存儲JSON文檔。 在Cassandra中,我會將JSON保存爲字符串。因此,數據結構將是唯一

root-comments 
{ 
    root-comment-id 
    root-comment-json-string 
} 

每根帶註釋的JSON字符串應該是這樣的:

{ 
comment : "hello world" 
answers : 
[ 
    { 
    comment : "reply to hello world" 
    answers : 
    [ 
     { 
     comment : "thanks for the good reply" 
     answers : [] 
     }, 
     { 
     comment : "yes that reply was indeed awesome" 
     answers : [] 
     } 

    ] 
    } 

] 
} 

另外,你可能想添加一個用戶名,用戶名,時間戳,.. ..等各個評論的結構。

這種「非規範化」的結構將使得查詢非常快相比,規範化的關係stucture如果你有數據的很多。

在你將不得不採取一切例外的照顧任何情況下,當你實現了一個大的用戶規模,例如,這樣的系統可能發生。如果有人回覆評論A和評論B,但同時(或稍後)評論A被刪除,會發生什麼情況。

如果你搜索「卡桑德拉分層數據」互聯網你能找到一些其他的方法,但他們都回到正常化,否則將無法完成一個「無限」的層次結構。

+1

您描述的方法的問題是,每當添加新評論時,您都必須更新JSON,即解析它,合併註釋並將其寫入Cassandra。想象一下有數千條評論的樹。所以這種方法對於檢索來說更便宜,但在更新時很昂貴。關係型方法是相反的,在檢索評論樹時花費很大,而在更新時便宜。我認爲最好的方法是混合方式,存儲您描述的最重要的評論,以關係方式存儲最不重要的評論。 –

+1

@ Calin-AndreiBurloiu是的。我的理解是這樣的評論系統(比如在reddit中)比更新有更多的讀取。所以我的回答完全是正確的解決方案。 –

+0

因爲它是JSON,所以在客戶端的JavaScript中可以輕鬆完成結果的解析。 –

相關問題