最近我手頭的一個網站,新增了社交功能,用戶可以互相加好友。
通常來說,對好友列表設計是新增一個好友,就往好友列表處新增一行,當要查詢一個用戶好友的時候
我們會這樣子做
這是user表格
SELECT * FROM WHERE userid="100"
userid nickname
01 小A
02 小B
03 小C
這是friendlist表格
user_id friend_id
01 101
02 102
03 103
後面讓我來分析一下我的思路
把所有好友以鍵值對(鍵=userid,值=暱稱)添加到數組中,因為userid在users表中是唯一的,所以不用擔心鍵會重複,把數組序列化(serialize)存入friend_id裡面,
當讀取好友表時反序列化得到數組,比如:array('101'=>'小蒼','102'=>'joker','103'=>'JY'),這個表示用戶100的好友,這樣有一個好處,就是可以直接顯示好友的暱稱,不用再查users表得到好友的暱稱。
在這裡強調一下,把數組插入數據庫之前,一定要對數組序列化,不然當取出的時候,單個字符表示數組中的一個元素,而不是一組鍵值對。
table:friendlist
userid friend_id
100 a:3:{ i: 101; s: 4:"小蒼"; i: 102; s: 5:"joker"; i: 103; s: 2:"JY"; }
101 a:2:{i:102;s:5:"joker";i:103;s:2:"JY";}
這樣的好友存儲設計在用戶量百萬級以上用戶量的時候效果非常明顯。
假設一個社交網站有110W的用戶,平均每個用戶好友數為25個,那麼數據庫就有110W * 25 = 2750W行,如果用戶量和人均好友數上升,那麼friendlist錶行數超億是有可能的。
更如騰訊新浪用戶億級別的,好友數量幾百上千,新增一個好友新加一行顯然是行不通的。
以數組形式存儲好友,每個用戶的好友列表只佔一行,如果新增好友的話,只需往數組添加鍵值對就OK了。這種方法有點事減少了數據庫的開銷,但是把添加鍵值對、序列化和反序列化任務交給了web服務器,增加了服務器開銷,二者之間要有個權衡。
小編有佳值八萬的資料可以勉費分享給你們,是我經過八年總結出來的。
歡迎大家添加我的|喂-~鈊|:H|F|C|零|五|二四領取
大家有問題的可以互相探討
在互聯網上我覺得每個人都要有樂於分享,樂於助人的精神,反正我做到了!