2009-09-14 68 views
4

你有沒有注意過Facebook如何說「3個朋友和33個人喜歡這個」?我想知道做這件事的最好方法是什麼。我不認爲通過朋友列表,並且「喜歡這個」的用戶列表並且比較它們是有效的!他們是否在數據庫中記錄了這一點?這將使數據庫規模非常巨大。 你們覺得怎麼樣?Facebook如何做到這一點?

謝謝!

回答

8

我猜他們外面加入他們的friends表和他們的likes表來同時計算普通喜歡和朋友喜歡。

有了合適的索引,它根本不會是一個緩慢的查詢。巨大的數據庫不一定很慢,所以沒有理由不將所有這些信息存儲在數據庫中。訣竅是確保索引和分區(如果有的話)設置良好。

+0

如何創建包含[UserId,LikedItemId,NumberOffriendsLiked]的「stats」表。但說實話,我對這個原因感覺不好,這會在這個表中產生大量的行! – OneDeveloper 2009-09-14 16:54:42

4

是的,他們肯定會保留在他們的數據庫中,因爲他們肯定有多個服務器需要訪問數據。

至於可伸縮性,我敢肯定他們使用了大量的緩存。

下面是一個例子:

如果你有一個百萬行的經歷,索引可以執行O(LOGN)= 20次(在最壞的情況下),才發現你所需要的。

對於200萬人,您只需要21次操作(在最壞的情況下)就可以找到您需要的東西。

每次用戶數量增加一倍時,只需要一個O(logn)索引就可以完成多一個操作(在最壞的情況下)。

它們也有分佈式架構或集羣數據庫。

0

有人可能喜歡的每個條目可能包含每個喜歡它的人(所有這些當然都在數據庫中)。當您查看該條目時,它們會將其與您的朋友列表進行匹配,以查看其中哪些是您的朋友。瞧。

+0

將喜歡該項目的人列表與動態中的整個朋友列表進行匹配。我認爲這是一項非常昂貴的操作。特別是,如果你正在實施時間線。 – OneDeveloper 2009-09-14 16:53:03

+0

這是O(n),其中n是最小值(喜歡它的人數,你朋友列表中的人數)。他們也可能在計算一次後緩存結果。 – patros 2009-09-14 18:02:41

2

在設計的社交網絡軟件(mothsorchid.com)我發現,解決,這是預先緩存通知的流的唯一途徑。在頁面加載時,人們不會查詢數據庫來計算有多少朋友和其他人喜歡這個',當某人'喜歡'記錄在該對象上的東西時,並且當檢索該對象時,可以與當前用戶的好友列表。如果有人更新他們的個人資料/發表評論/等,它會將通知對象發送給預先緩存在他們的供稿中的朋友。以磁盤空間爲代價大幅降低數據庫工作量,但磁盤空間便宜。

至於Facebook如何做到這一點,他們使用Cassandra DBMS,這可能與您的想法稍有不同。

5

Facebook使用Cassandra,NoSQL數據庫至少有一些東西。以下是對一些較大的社交媒體網站如何解決這些問題的更詳細的討論:如果你遵循它的鏈接,Digg的博客文章等

http://www.25hoursaday.com/weblog/2009/09/10/BuildingScalableDatabasesDenormalizationTheNoSQLMovementAndDigg.aspx

很多在那裏有趣的閱讀

+0

不正確,他們僅將其用於收件箱搜索功能cf:http://www.facebook.com/note.php?note_id=24413138919 – 2009-09-14 19:11:58

3

Facebook必須使用觸發器(只要事件發生,它就會自動執行)。例如,假設創建一個觸發器來存儲喜歡狀態的人的數量和名字,那麼每當有人喜歡你的狀態並且這種隱式(自動)時,它就會被執行。

這使操作方式太簡單了,Facebook不必手動更新數據庫或爲此存儲巨大的數據庫。而且,這種方法更快。