2009-08-06 58 views
3

這可能是一個問題毛狀但是。假設我有PHP/MySQL的活動(ALA臉譜)

Followers: 
-user_id 
-follower_id 

Activities: 
-id 
-user_id 
-activity_type 
-node_id 

提取用戶活動相當容易。但是,獲得追隨者活動的最佳方式是什麼?子選擇?隨着用戶獲得越來越多的關注者,它似乎非常慢。任何想法來加速這一點?

另外,在一個更概念層次。分組工作如何?這是否全部使用單個查詢完成?或者是所有的活動數據被拉入,然後在PHP端進行排序和分組?

用戶X,Y和Z做活動A 用戶j活動做B的3

回答

4

子選擇往往比JOIN的慢,但它實際上取決於你與他們做什麼。要回答你的主要問題,我會得到追隨者數據與JOIN:

SELECT * FROM followers f 
LEFT JOIN activities a ON f.follower_id=a.user_id 
WHERE f.user_id=$followedPerson 

這是假設的追隨者表中使用user_id用戶,有人誰與follower_id發生這種情況下他們是在一個user_id用戶表也是如此。

它永遠不會是令人難以置信的只要你有一個索引followers.user_id緩慢。但是,查詢可能返回的數據量可能會比您真正想要處理的數量大。你需要確定你的應用程序將要顯示什麼樣的活動,並嘗試相應的過濾,這樣你不賺取豐厚的查詢所有的時間,但只使用返回的結果中的一小部分。

拉出來的數據和分組它PHP一邊是好的,但如果你能避免在沒有首先選擇它,你會更好。在這種情況下,我可能會添加一個ORDER BY f.follower_id,activity_date DESC,假設一個日期存在,並試圖拿出一些過濾條件的活動表。然後我遍歷PHP中的行,輸出由追隨者分組的數據。

+0

我認爲日期的概念非常重要,但也許這只是Josh的遺漏。 – Wookai 2009-08-11 07:11:29

0

我不知道如果我明白你需要正確的話,但 我會嘗試這個選擇,如果我是正確的,你應該得到所有活動的#USERID#

SELECT a.* FROM Activities AS a 
INNER JOIN Followers AS f1 
ON a.user_id = f1.follower_id 
WHERE f1.user_id = #USERID# 
2

所有信徒的活動日誌有潛力對於大量的記錄,因爲它通常混合了當前用戶的活動和他們的所有朋友。如果您加入各種表格,並且用戶有100多個朋友,那麼可能會有很多數據被抽出。

一種方法是denormalise數據,把它作爲一個大的日誌,其中應該出現在用戶的活動日誌網頁上的所有條目存儲在針對該用戶活動日誌表。例如,如果用戶A有兩個朋友,用戶B和用戶C,當用戶A確實是創造了一種3活動日誌記錄:

record 1: "I did this" log for user A 
record 2: "My friend did this" log for user B 
record 3: "My friend did this" log for user C 

你會得到重複,但它其實並不重要。選擇速度很快,因爲它來自一個表格,並僅根據用戶ID進行索引。而且很可能你會保存一個活動日誌表(即刪除超過1個月的條目)。

活動日誌表可以是這樣的:

-id 
-user_id (user who's activity log this is) 
-action_user_id (user who took the action, or null if same as user_id) 
-activity_type 
-date 

要選擇所有最近的活動日誌,爲單個用戶是那麼容易:

SELECT * from activity_log WHERE user_id = ? ORDER by date DESC LIMIT 0,50 

爲了使這種方法確實有效,你需要在單個活動日誌表中有足夠的信息不需要進一步選擇。例如,您可以存儲原始日誌消息,而不是實時構建它。

+0

如果我只是把你添加爲朋友,我想看看你最近的活動,該怎麼辦?我們是否必須追溯性地將用戶的活動添加到新的追隨者? – Wookai 2009-08-11 07:10:38

+0

好點。在上面的例子中,你不會在自己的活動流中看到用戶的最後活動。你只會看到新的條目。我認爲這是可以接受的。您可以隨時前往用戶的公共頁面查看他們自己的活動日誌(如果該活動日誌是其他用戶公開的)。 – simonrjones 2009-08-11 16:44:09

+1

所以你說什麼,如果我有5000個朋友/追隨者,我發了一篇文章,我應該爲每個動作創建5000個條目到數據庫中。我希望我誤解了你的答案,否則這將是一個可怕的答案,沒有不尊重。 – JasonDavis 2009-09-20 22:46:05