最近我手头的一个网站,新增了社交功能,用户可以相互加好友。
常日来说,对好友列表设计是新增一个好友,就往好友列表处新增一行,当要查询一个用户好友的时候
我们会这样子做

这是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|零|五|二四领取
大家有问题的可以相互磋商
在互联网上我以为每个人都要有乐于分享,乐于助人的精神,反正我做到了!