2016-09-26 95 views
0

我將爲社交網絡樣式的網站構建一個MySQL數據庫,其中用戶關注其他用戶,然後從其用戶獲得更新。構建追隨者/關注MySQL數據庫的最佳實踐

我的DB是由一個表與用戶的基本信息構成:

| ID | username | password | email | ... other few columns | 

的「ID」是主要的,「用戶名」和「電子郵件」是獨特的和索引。

然後我有用戶飼料的表應該如果另一個用戶按照它只能顯示,「ID」始終是主要的:

| ID | feed_to_show_in_home | 

然後與跟隨者統計數據的表格,以加快用戶的個人資料頁:

| ID | followers_count | following_count | 

而且至少真正的追隨者網表存儲在那裏誰跟着誰:

| ID | following | 

在此表中,「ID」和「跟隨」都是主要的,因爲用戶只能跟隨其他用戶一次。

現在我想問一下,從性能的角度來看,我的結構是否良好。我特別擔心如何檢查用戶是否關注其他用戶,停止關注用戶,以及如何僅在我關注特定用戶時才顯示供稿。

在這種情況下,我想到的解決方案總是掃描整個表的長度,但我認爲這不是一個好的選擇,因爲這個DB計劃存儲超過10,000個用戶。

回答

0

簡答:10,000是很少的,任何設計都會「足夠好」。

龍答:欲瞭解更多縮放,請考慮以下...

這些設計通常不好的做法:1的關係:在1

  • 兩個表。
  • 存儲可以計算的東西。

我說「通常是」,因爲你正在涉及例外情況的保證。但首先,請允許我提一些其他架構設計:

CREATE TABLE Follow (
    er ..., -- user id of the the follower 
    ed ..., -- user id of the the followed 
    PRIMARY KEY(er, ed), 
    INDEX(ed, er) 
) ENGINE=InnoDB; 

SELECT COUNT(*) FROM Follow WHERE ed = ?; -- number of followers for `ed`. 
SELECT er FROM Follow WHERE ed = ? -- list of such followers 
(Similarly for the flip direction) 

注:

  • 沒有替代AUTO_INCREMENT,因爲有一個完美的PK。 查詢將運行得更快,我們將在一分鐘內看到。
  • 直到你有100K追隨者,COUNT查詢是「足夠快」,所以你不需要預先計算計數。

如果您要計算「喜歡」的數量,那麼爲該頻繁更新的值設置一個單獨的表格會比較謹慎。這樣的表格與用戶表格是1:1,因此違反了第一個不好的做法。這裏的理由是將非常高的寫入活動中,從,但重要活動在其餘的「用戶」信息。

0

對於這樣的事情,我更喜歡圖數據庫,因爲你試圖解決的現實世界問題有一個圖作爲它的自然結構。

從關係的角度來看,你的想法看起來不錯。我不太清楚你是否已經擁有所有你需要的關係,但是基本的概念你可能是正確的。

對於性能問題,您應該使用一些任意測試數據和EXPLAIN語句(see this)進行一些測試。現在,您可以嘗試在要過濾的列上設置一些索引並再次進行測試。哪些索引最適合您的查詢,哪些索引最好不要設置取決於更新/插入內容的頻率或次數。還有很多其他文章可以比我更好地解釋它,所以您應該查看一些索引編制中的一些最佳實踐,並在實際發生時詢問具體的性能問題。

+0

感謝您提供'EXPLAIN'提示。你認爲作爲一個開始的項目足夠使用MySQL而不是圖形數據庫嗎? – Philip

+0

當然。這並不是真的依賴於特定的DBMS。即使在生產環境中,我也喜歡MySQL,但它忽略了例如'CHECK'約束,您必須手動強制執行此操作。所以我不斷放棄它的使用。這對草圖來說絕對可以。對於圖形數據庫,您必須習慣其他查詢語言,例如neo4j中的Cypher。所以當你從關係圖移植到圖時,你將面臨更多的努力。 –