2016-11-15 84 views
0

什麼是在mysql數據庫中存儲「喜歡」或「upvotes」的最佳方式?最有效的方式來存儲像Facebook和Stackoverflow的「喜歡」

這裏是我的想法是:

likes (table) 
    id (auto increment) 
    post_id 
    user_id 

,但會在likes表具有數百萬甚至數十億行的,因爲每一個想後的人會插入1行,每個人都可以像不止有一次,並且有多個用戶。

Facebook或stackoverflow如何管理在數據庫中做到這一點?任何鏈接或指南表示讚賞。謝謝。

+0

太寬泛,可能會吸引輿論的答案。請就SO提出更具體的問題。 –

+0

此表中有數百萬行沒有內在問題。但是您可能還希望在posts表中使用非規範化的列來緩存所有投票結果的「得分」(因此您不必每次都計算)。 – MatBailie

回答

1

難道你不需要一個列進行反向投票嗎?

擺脫id;相反,使用PRIMARY KEY(post_id, user_id)

通過首先讓post_id,您可以有效地找到給定帖子的所有投票。同時,user_id的所有選票列表效率較低。如果你需要,那麼也有INDEX(user_id)

+0

什麼會擺脫'ID'做什麼和主鍵做什麼? – packnob890

+0

@ packnob890刪除id列可節省1/3所需的數據存儲空間。主鍵選項允許您說一行由兩列的組合唯一標識,因此也可以強制這兩列的組合唯一。 – MatBailie

+0

@packnob890 - 並且在InnoDB中,數據與PK集羣。所以,一旦它查找PK,數據就在那裏;沒有額外的步驟。 –

0

存儲用逗號分隔的用戶id的字符串(或json)。 不需要額外的表格,只需將其添加爲郵政專欄即可。 額外的列可以用於喜歡的總數(計數)。

+0

作爲單個字段中的字符串逗號分隔的值是SQL反模式和代碼異味。它違反了字段的原子性質 – MatBailie

+0

@MatBailie如果你想堅持數據庫系統提供的功能,那麼在更現代的數據庫(比如Postgres或mariaDB)中還有一個json列(mysql也在計劃這個)。如果您更深入地瞭解數據庫中的json或csv是什麼樣子,您會發現兩者之間沒有太大的區別。在這裏,超常化是反模式,imho。 – FeedTheWeb

+0

由RDBMS本機支持的JSON數據類型,數組,結構等保留強大的數據類型執行,啓用索引和約束等,等等。使用字符串和任意分隔符模擬它引入了一長串潛在失敗,調試困難,性能開銷和維護成本。從工程角度來看,它應該是最後的手段,而不是第一選擇。 – MatBailie

相關問題