2012-01-10 58 views
-1

這是關於一個社交網站。讓Facebook成爲我們的典範。改善Facebook風格牆壁頁面的數據庫性能

在mysql服務器中有一個表:'posts'保留所有帖子的前綴(不包括評論爲簡單起見)。其列是:

id,post,user_id,frnd_id_1,frnd_id_2。

id:主鍵,自動遞增。

職位:職位寫在牆上(無論是登錄用戶或任何他/她的朋友們的一個壁)

的user_id:的ID登錄的用戶(假設A)

friend_id_1:登錄用戶的朋友(假設B)。當A寫在B的牆上時使用這個字段。的朋友的朋友(假設C)的登錄用戶

如果存在被記錄在MySQL表acccordingly A和B之間的任何消息對應:

friend_id_2。

假設B在C的牆上寫東西,然後B的朋友會在他們的個人牆上看到它。假設B有100個朋友。我們可以用這種方式將它記錄在上述表格中:frnd_id_2將用於保存C的id的記錄;

如果frind_2有'0'記錄,則消息通信僅在user_id和frnd_id_1之間,否則將意味着frnd_id_1已寫在frnd_id_2的牆上,而frind_id_1是user_id的朋友。

除此之外,我想,一切都與FACEBOOK完全相似。

但是 -

假設B有100個朋友。在這種情況下,如果B在C的牆上寫道(假設所有隱私設置都爲朋友的朋友開放)。如果採取上述政策,表中會有101條記錄:

1)一條記錄只是表示B在C的牆上張貼了(frnd_id_2 = 0)(我們稱之爲主記錄)

2)另外100個記錄爲B.(frnd_id_2!= 0)的100個朋友

這是我在我腦中的方式。我可以通過插入'post'列(或保留'post'列空白並創建另一個'main_record_id')而不是完整的消息,而是將主記錄的標識插入到主表中。

但事情是:對於單個帖子,101分貝查詢(在這種情況下)需要執行。任何其他方式來提高數據庫性能?

我使用PHP作爲腳本語言。

+0

爲什麼負號?任何解釋plz? – 2012-01-10 11:17:43

+0

首先誤解了這個問題。不要擔心。 – duffymo 2012-01-10 11:23:04

+0

不能刪除-ve等級? – 2012-01-10 11:29:47

回答

0

或者1個數據庫查詢,將一次網絡往返中的所有信息都帶回來。我會批處理他們到一個JOIN查詢。

如果您打算保留所有這些記錄,您不能脫身,但是您可以控制如何訪問它們。

另一個要牢記的想法是控制返回結果集的大小。你真的需要所有100個朋友嗎?你能一次做十個嗎?當您有1,000或10,000條記錄要返回時,這將變得尤爲重要。

+0

'1數據庫查詢,將一次網絡往返中的所有信息都帶回來。我將它們批量加入一個JOIN查詢。'請解釋,因爲我無法理解。什麼表加入? '你每次只能做十個' - 什麼時候處理剩餘的90個記錄? – 2012-01-10 11:20:35

+0

Google for SQL JOIN爲第一個。我假設用戶和朋友或用戶和帖子之間存在一對多的關係。如何處理剩餘的90條記錄?首先,編寫你的查詢,以便不返回它們。其次,爲用戶提供「下一個10」鏈接,以便他們可以獲取11-20,21-30等記錄。 – duffymo 2012-01-10 11:22:45

+0

我瞭解SQL連接。對於所有的用戶,牆上的帖子都要存儲在一張桌子上。那麼加入哪些表格?至於90條記錄,我不是在一次性顯示牆上的所有帖子。相反,當B在C的牆上寫字時,對於B有100個發起者,需要將100條記錄插入到db中,以便100個朋友在查看牆壁時獲得他們的牆壁。 100條記錄是關於在牆上頁面 – 2012-01-10 11:27:05

0

一個簡單的答案:不要使用MYSQL的Facebook類牆 - 這是非常無效的這種目的。

使用no-sql數據庫,例如MongoDB。我保證你會驚訝地發現用不同種類的對象進行現場新聞傳播更方便。

你也可以結合兩個數據庫:MongoDB的新聞源和MySQL的一切。