四时宝库

程序员的知识宝库

分享一个好友系统的数据库设计+实现,聪明的程序员都会这样设计(PHP+MYSQL)

最近我手头的一个网站,新增了社交功能,用户可以互相加好友。

通常来说,对好友列表设计是新增一个好友,就往好友列表处新增一行,当要查询一个用户好友的时候

我们会这样子做

这是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|零|五|二四领取

大家有问题的可以互相探讨

在互联网上我觉得每个人都要有乐于分享,乐于助人的精神,反正我做到了!

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接