社交网站好友储存设计和实现(PHP+MySQL)
最近手头的一个网站新增社交功能,用户可以互加好友。
通常,对好友列表设计是新增一个好友,就往好友列表新增一行,当要查询一个用户好友
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)的更多相关文章
- 图标集锦:10套免费的社交媒体 & 社交网站图标
社交网络是最近几年互联网领域最热门的关键词之一,如今社会网络化媒体也成为我们信息获取和传播的重要途径,很多网站都有把内容分享到社交媒体的功能. 社交媒体图标作为向用户传递信息的重要媒介,不管是在网页还 ...
- 超赞!12套你没见过的社交媒体 & 社交网站图标
如今,社交网络成为我们信息获取和传播的重要途径,很多网站都有把内容分享到社交媒体的功能.社交媒体图标作为向用户传递信息的重要媒介,不管是在网页还是 Web 应用程序中都非常需要.今天这篇文章和大家分享 ...
- [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 ...
- 校园社交网站app
1.项目说明 1.1 项目背景 虽然公共社交网络系统能够满足大多数高校校园用户在校园网络社交的需求,但是针对校园学习.工作和文化生活等方面的支持以及学校个性化需求方面却存在不足.利用电子校务平台的数据 ...
- jquery制作论坛或社交网站的每天打卡签到特效
效果:http://hovertree.com/texiao/jquery/50/ 现在许多社区,购物等网站都设置签到功能,打开可以收获经验.虚拟币等,提高用户粘性,增加浏览量,是一个不错的功能.本文 ...
- 国外社交网站获取分享数量APIs
之前有一篇文章详细介绍了如何获取网页在Facebook,Twitter和LinkedIn社交平台上分享的数量,点击这里查看.这里再扩充一下! Twitter GET URL: http://cdn.a ...
- ImitateLogin新增插件机制以及又一个社交网站的支持
我的文章里已经多次介绍 imitate-login ,这是我最近一直在维护的一个使用c#模拟社交网站登录的开源项目,现在新增了对插件的支持以及一个新的网站(由于某种原因,会在文章结束部分介绍:而且仅会 ...
- SpringSocial业务系统与社交网站的绑定与解绑
SpringSocial提供了了以下三个服务,我们要做的仅仅是调用它们的服务,但是SpringSocial仅仅只提供了数据,没有提供视图 ⒈拿到所有社交网站与业务系统的绑定信息 SpringSocia ...
- 网站app原型设计工具:axure,Mockups,墨刀
网站app原型设计工具:axure,Mockups,墨刀 Balsamiq Mockups 3 网站原型设计工具非常高效,非常简单,几分钟就能搞定比axure好用很多 墨刀 - 免费的移动应用原型与线 ...
随机推荐
- android network develop(1)----doing network background
Develop network with HttpURLConnection & HttpClient. HttpURLConnection is lightweight with Http ...
- window下使用vnc远程登录阿里云ECS/ubuntu图形界面
通常我们都使用putty.secureCRT等软件来远程登录linux系统,但这些软件仅提供字符终端界面,若要像windows的远程桌面连接那样登录linux的图形界面,我们可以使用VNC这类的软件. ...
- 【JavaScript】JQuery中$.fn、$.extend、$.fn.extend
Web开发肯定要使用第三方插件,对于一个炫丽的效果都忍不住想看看对方是如何实现的,刚下载了一个仿京东商品鼠标经过时局部放大的插件.看了两眼JQuery源码,看看就感觉一头雾水.JQuery本来自己学的 ...
- Dos
一.简介 https://zh.wikipedia.org/wiki/DOS 二.系统下载 http://www.cn-dos.net/newdos/doswarea.htm 三.实用命令 1)查看系 ...
- 在VMware Workstation11虚拟机上安装黑苹果
图文详解如何在VMware Workstation11虚拟机上安装黑苹果Mac OS X 10.10系统-网络教程与技术 -亦是美网络 http://www.yishimei.cn/network/5 ...
- php databases support off fail zabbix
php 安装参数./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable- ...
- 匈牙利算法 cojs.tk 搭配飞行员
cojs.tk 搭配飞行员 ★★☆ 输入文件:flyer.in 输出文件:flyer.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 飞行大队有若干个 ...
- css中table tr:nth-child(even)改变tr背景颜色: IE7,8无效
例如: .my_table tr:nth-child(even){ background:#E6EDF5; } .my_table tr:nth-child(odd){ background:#F0F ...
- ZOJ 3157 Weapon --计算几何+树状数组
题意:给一些直线,问这些直线在直线x=L,x=R之间有多少个交点. 讲解见此文:http://blog.sina.com.cn/s/blog_778e7c6e0100q64a.html 首先将直线分别 ...
- java 21 - 6 字符缓冲流的特殊方法以及该方法高效复制文件
字符缓冲流的特殊方法: A.BufferedWriter: public void newLine():根据系统来决定换行符 private static void write() throws IO ...