2010-03-28 38 views
1

基本上是所有朋友最近發帖的直播。Twitter家/ Facebook牆的數據庫結構?

在一個愚蠢的排序方法,我想我會通過構建一個查詢一樣開始:

SELECT * FROM tblposts WHERE userid= friend_id_1 OR userid= friend_id_2 ......

哪裏friend_id_%是朋友的用戶ID,從你的朋友名單。但是這樣做肯定是一種非常低效的方式,對吧?有沒有更快的方式在MySQL中做到這一點?也許一些聰明的數據庫架構?

(我知道FB使用Hadoob但我沒有足夠的經驗去那麼遠:()

回答

2

如果你要查詢ID列表,那麼你應該使用:

SELECT * FROM tblposts WHERE userid IN (friend_id_1, friend_id_2, ...) 

但在這種情況下,我認爲你可以使用代替連接。

SELECT * FROM tblposts AS T1 
JOIN (
    SELECT friendid    -- I just made up this query. 
    FROM friends    -- You need to replace it with the 
    WHERE userid = 'youruserid' -- real query to get someone's friends. 
) AS T2 
ON T1.userid = T2.friendid 
+0

謝謝!這很有道理。它會和Twitter這樣的大熱門網站有什麼不同嗎? – mathon12 2010-03-28 21:58:29

+0

@ mathon12:一個大型網站肯定不會做到這一點。首先,一些用戶可能有1000個朋友,他們可能每個都發布了1000條消息,因此您需要一些分頁機制,以及排序,過濾等等。目前,此查詢可能會以不特定順序返回數百萬行。 – 2010-03-28 22:02:15

+0

是的,我認爲可能是這種情況。對此進行一次'黑客攻擊'可能會將結果限制爲按時間排序的前50到100場比賽,因爲通常只會顯示最近的帖子。謝謝。 – mathon12 2010-03-28 22:08:35

0

對不起顛簸,但我覺得上面的查詢意味着friends表中有大量的冗餘記錄?(x是y,y的朋友是x的朋友; 2個記錄?)

如果friends表中有場sender_idreceiver_idrequest_status代替,可以查詢之上的方式修飾,它返回對youruserid好友列表,receiver_id的即選擇值如果SENDER_ID == youruserid,反之亦然,從而我們得到youruserid的所有朋友的一個列表?我想不出一張更好的表來避免重複。