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

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

SELECT  *  FROM WHERE userid="100"
userid nickname
100 小智
101  小苍
102 joker
103 JY

table: users

user_id friend_id
100 101
100 102
100 103
101 102
101 103

table:friendlist

我的思路是:

将所有好友以键值对(键=userid,值=昵称)添加到数组中,因为userid在users表中是唯一,所以不用担心键会重复,再把数组序列化(serialize)存入到friend_id中,

当读取好友表时反序列化得到数组,形如:array('101'=>'小苍','102'=>'joker','103'=>'JY'),这表示用户100的好友,这样有一个好处是可以直接显示好友的昵称,而不用再查users表得到好友的昵称。

*这里强调一下,将数组插入数据库之前,一定要对数组序列化,否则当取出时,单个字符表示数组中的一个元素,而不是一组键值对。

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";}

table:friendlist

这样的好友存储设计在用户量百万级以上用户量效果很明显。

假设一个社交网站有110W用户,平均每个用户好友数为25,那么数据库就有110W * 25 = 2750W行,如果用户量和人均好友数上升,那么friendlist表行数超亿都是有可能的。

更如腾讯新浪用户亿级别的,好友数量几百上千,新增一个好友新加一行很显然是行不通的。

以数组形式存储好友,每个用户的好友列表只占一行,如果新增好友,只需往数组添加键值对就行了。这种方法有点事减少了数据库的开销,但是把添加键值对、序列化和反序列化的任务交给了web服务器,增加了服务器的开销,所以二者之间要有个权衡。

1.新增好友添加到数据库

                 //取出好友ID和名字 ,登录时已经把用户id和名称取出
$res = mysql_query("select friendList from friend where userid='$userid'");
$row = mysql_fetch_assoc($res); if($row == ""){ //如果好友列表为空 $arr = array($FromId['userid']=>$FromId['username']);
$friends = serialize($arr);
mysql_query("insert into friend values('$userid','$friends')");
}else{ //如果好友列表不为空,将‘ID’=》'用户名',插入到数组当中
$arr = unserialize($row['friendList']);
if(array_keys($arr) == ""){//防止重复添加
$arr[$FromId['userid']] = $FromId['username'];//添加到数组中
$friends = serialize($arr);//插入数据库之前序列化
mysql_query("update friend set friendList = '$friends' where userid = '$userid'");
}
}

  2.读取好友

	         $friendSql = mysql_query("select * from friend where userid='$row[userid]'");
$friendRow = mysql_fetch_array($friendSql);
$friendList = unserialize($friendRow['friendList']);//反序列化

  

社交网站好友储存设计和实现(PHP+MySQL)的更多相关文章

  1. 图标集锦:10套免费的社交媒体 & 社交网站图标

    社交网络是最近几年互联网领域最热门的关键词之一,如今社会网络化媒体也成为我们信息获取和传播的重要途径,很多网站都有把内容分享到社交媒体的功能. 社交媒体图标作为向用户传递信息的重要媒介,不管是在网页还 ...

  2. 超赞!12套你没见过的社交媒体 & 社交网站图标

    如今,社交网络成为我们信息获取和传播的重要途径,很多网站都有把内容分享到社交媒体的功能.社交媒体图标作为向用户传递信息的重要媒介,不管是在网页还是 Web 应用程序中都非常需要.今天这篇文章和大家分享 ...

  3. [CareerCup] 10.2 Data Structures for Large Social Network 大型社交网站的数据结构

    10.2 How would you design the data structures for a very large social network like Facebook or Linke ...

  4. 校园社交网站app

    1.项目说明 1.1 项目背景 虽然公共社交网络系统能够满足大多数高校校园用户在校园网络社交的需求,但是针对校园学习.工作和文化生活等方面的支持以及学校个性化需求方面却存在不足.利用电子校务平台的数据 ...

  5. jquery制作论坛或社交网站的每天打卡签到特效

    效果:http://hovertree.com/texiao/jquery/50/ 现在许多社区,购物等网站都设置签到功能,打开可以收获经验.虚拟币等,提高用户粘性,增加浏览量,是一个不错的功能.本文 ...

  6. 国外社交网站获取分享数量APIs

    之前有一篇文章详细介绍了如何获取网页在Facebook,Twitter和LinkedIn社交平台上分享的数量,点击这里查看.这里再扩充一下! Twitter GET URL: http://cdn.a ...

  7. ImitateLogin新增插件机制以及又一个社交网站的支持

    我的文章里已经多次介绍 imitate-login ,这是我最近一直在维护的一个使用c#模拟社交网站登录的开源项目,现在新增了对插件的支持以及一个新的网站(由于某种原因,会在文章结束部分介绍:而且仅会 ...

  8. SpringSocial业务系统与社交网站的绑定与解绑

    SpringSocial提供了了以下三个服务,我们要做的仅仅是调用它们的服务,但是SpringSocial仅仅只提供了数据,没有提供视图 ⒈拿到所有社交网站与业务系统的绑定信息 SpringSocia ...

  9. 网站app原型设计工具:axure,Mockups,墨刀

    网站app原型设计工具:axure,Mockups,墨刀 Balsamiq Mockups 3 网站原型设计工具非常高效,非常简单,几分钟就能搞定比axure好用很多 墨刀 - 免费的移动应用原型与线 ...

随机推荐

  1. iOS Xcode7上真机调试

    在Xcode7上进行真机调试,不需要证书,步骤如下: 1. 2. 3. 4. 5.添加Apple ID后会显示两个Free,表示可以免费真机调试iOS应用和Mac应用,选中高亮选项,点击view de ...

  2. 很好的UI动效设计参考

    toolBar下拉:

  3. LeetCode 8 String to Integer (string转int)

    题目来源:https://leetcode.com/problems/string-to-integer-atoi/ Implement atoi to convert a string to an ...

  4. UVa 111 - History Grading (by 最长公共子序列 )

     History Grading  Background Many problems in Computer Science involve maximizing some measure accor ...

  5. javascript的模块化解读

    AMD是RequireJS在推广过程中对模块定义的规范化产出. 异步加载模块,依赖前置,提前执行. Define定义模块 define(['require','foo'],function(){ret ...

  6. 在类库项目中使用log4net(RollingFileAppender)记录日志

    1.创建解决方案 2.创建类库项目 3.根据需要修改命名空间,修改(和/或)添加类到类库 4.引用log4net 5.类库项目根目录下创建leg4net配置文件,如D3CallTriggerPlugi ...

  7. 解决 Eclipse 项目有红感叹号的方法

    原因:显示红色感叹号是因为jar包的路径不对 解决: 在项目上右击:Build Path -> Configure Build Paht...(或Propertise->Java Buil ...

  8. 烂泥:ubuntu安装vmtools

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 最近由于工作需要,需要使用桌面版的linux系统,所以就选择了ubuntu.同时为了方便使用,就在VM中安装ubuntu. 但是为了文件以及操作的方便就 ...

  9. Error && MFC

    Error:MSB6006 "rc.exe" exited with code 2. 目录含有中文 Error:no instance of overloaded function ...

  10. hdu 1542 Atlantis(线段树,扫描线)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...