基础分析

第一步,有一张用户表,表内包含用户的基本信息,比如账号、姓名、性别等信息。这里用tb_user表示用户信息表。

ID用户名

1张三

2李四

3王五

4赵六

第二步,需要将用户与用户直接建立好友关系。这里有两种情况:单向好友关系、互为好友关系。

- 单向好友关系就是张三在李四的好友列表中,但李四没有在张三的好友列表中;

- 互为好友关系,如果张三和李四为好友,则双方都在彼此的好友列表中;

好友关系设计

无论上面两种关系的哪一种,好友关系表都可以使用下面的设计,表tb_friend:

IDuser_idfriend_id

112

213

示例中,张三拥有李四和王五两个好友。

单向好友模式

如果是单向好友模式,那么两个人互为好友关系则插入的数据应该是这样:

IDuser_idfriend_id

112

221

也就是张三是李四的好友,李四也是张三的好友。此时使用sql语句查询时只用限定user_id作为条件即可查询出用户的好友列表:

select * from tb_friend where user_id = 1

1

互为好友关系

因为是互为好友关系,则只需要插入一条数据即可。对应的查询语句为:

select * from tb_friend where user_id = 1 or friend_id = 1

1

2

当然也可以使用UNION ALL来实现:

select friend_id as friends from tb_friend where user_id = 1

UNION ALL --使用UNION ALL,因为不存在重复的

select user_id as friends from tb_friend where friend_id = 1

1

2

3

注意事项:

- user_id1–>friend_id2和user_id2–>friend_id1是相同的记录,不需要重复插入;

- 为了快速判断两个人是不是好友,可在程序层插入数据前添加一个限制user_id1 < user_id2;

- 可加入缓存层(Redis或Memcached)来提高性能;

- 可从数据库层限制(user_id,friend_id)不可重复;

加入分组

如果好友数量比较多,关系比较复杂,可引入好友分组,可进行如下改造:

IDuser_idfriend_iduser_groupfriend_group

112好友同学

213同学同学

在数据库中添加了user_group,当前user给friend设置的分组,friend_group是当前user的朋友对其设置的分组类别。

于是,查询好友列表的SQL如下:

select friend_id as friends ,user_group as my_group from tb_friends where user_id = 1

UNION ALL

select user_id as friends , friend_group as my_group from friend_id = 1

1

2

3

4

5

小结

至此社交系统中好友关系的设计及SQL语句使用基本完成。可根据具体的业务情况进行修改。在查询除好友的id列表之后就可以进行好友信息的查询。此处需要注意的是如果用in语句来查询会有不走索引、sql语句大小限制、性能等问题,可考虑使用左连接进行查询。

关于好友(社交)关系的数据库设计

比如QQ或者一些社交网站,好友关系的数据库应该如何设计?于是我自己大概的进行了一些尝试。

一开始,好友关系比较简单,比如:

这样1,2,3,4互为好友,它的数据库可以这样设计:

CREATE TABLE IF NOT EXISTS users

(

user_id char(10) NOT NULL,

friend_id char(10) NOT NULL

);

INSERT INTO users VALUES('1', '2');

INSERT INTO users VALUES('1', '3');

INSERT INTO users VALUES('1', '4');

INSERT INTO users VALUES('2', '3');

INSERT INTO users VALUES('2', '4');

INSERT INTO users VALUES('3', '4');

SELECT *

FROM users;

用两个字段来构成好友之间的关系,因为双方互为好友就不必重复存储。

那么要快速地进行好友列表的查询,sql应该这么写:

-- 查询id: 4的好友列表

SELECT friend_id AS friends

FROM users

WHERE user_id = '4'

UNION ALL --使用UNION ALL,因为不存在重复的(UNION会判重, 实际在插入时就知道了)

SELECT user_id AS friends

FROM users

WHERE friend_id = '4';

结果如下:

然鹅,当好友关系比较复杂时,比如加入了好友分组后,我便尝试进行一些改造,假设有如下一种好友关系:

每个人有自己的分组,两人之间可以在不同的分组中,比如3在1的同学分组中,而1在3的好友分组中,那么就必须加入两个字段,一个存储user_id的分组,一个存储friend_id的分组,重新设计如下:

CREATE TABLE IF NOT EXISTS users_g

(

user_id char(10) NOT NULL,

friend_id char(10) NOT NULL,

user_group char(10) DEFAULT '默认分组',

friend_group char(10) DEFAULT '默认分组'

);

INSERT INTO users_g VALUES('1', '2', '好友', '好友');

INSERT INTO users_g VALUES('1', '3', '同学', '好友');

INSERT INTO users_g VALUES('1', '4', '亲人', '好友');

INSERT INTO users_g VALUES('2', '3', '亲人', '亲人');

INSERT INTO users_g VALUES('2', '4', '朋友', '朋友');

INSERT INTO users_g VALUES('3', '4', '好友', '同学');

SELECT *

FROM users_g;

于是查询好友列表的sql就变成了:

-- 查询id: 4的好友列表,及其分组

SELECT friend_id AS friends, user_group AS my_group

FROM users_g

WHERE user_id = '4'

UNION ALL

SELECT user_id AS friends, friend_group AS my_group

FROM users_g

WHERE friend_id = '4';

结果如下:

嗯感觉这样设计应该是可以的,当然我也希望有人能给出好的建议什么的啊哈哈~

mysql好友关系数据表设计_社交系统中用户好友关系数据库设计相关推荐

  1. mysql好友关系数据表设计_即时通讯数据库好友关系(一对多)应该怎样设计?...

    [MYSQL里面有如下的表  user:id username photo:id name photo_favour(图片收藏关系表):photo_id user_id假设这几个表都相当大,需要进行分 ...

  2. mysql 录入窗体设计_在Access中,可用于设计输入界面的对象是   A)窗体 B)报表 C)查询 D)表...

    展开全部 在Access中,可用于设计输入界面的对象是窗体.不属于Access数据类型62616964757a686964616fe4b893e5b19e31333431373330的是报表. 窗体对 ...

  3. php三级分销思路 数据库设计_分销系统的用户关系,用户与推广链接的数据库设计。设计思路...

    简单点说二三级分销系统, 1.用户通过分享链接促成商品卖出,获取到一定比例的商品利润.2.用户促成交易获得一定比例的利润时,其上级用户也会获得一定比例的利润. 对于本人所设计的分销系统,与二三级分销系 ...

  4. figma设计_在Figma中使用隔片移交设计

    figma设计 I was quite surprised by how much the design community resonated with the concept of spacers ...

  5. 原子设计_您需要了解的有关原子设计的4件事

    原子设计 重点 (Top highlight) Industries such as Architecture or Industrial Design have developed smart mo ...

  6. mysql status关键字 数据表设计中慎重使用

    mysql status关键字  数据表设计中慎重使用 转载于:https://www.cnblogs.com/toSeeMyDream/p/5574894.html

  7. mysql tiqu mssql_mysql数据表如何导入MSSQL中

    本案例演示所用系统是windows server 2012.其它版本windows操作系统类似. 1,首先需要下载mysql odbc安装包. http://dev.mysql.com/downloa ...

  8. 从零开始学 MySQL —数据库和数据表操作

    ​前言 今天我们学习下核心的内容,学习并实践如何对数据库表和表中的内容做修改,删除,重命名等操作.(想看看周末还有多少爱学习的小伙伴,你们在哪里呀,O(∩_∩)O哈哈~) 1.目录 数据库操作:删除数 ...

  9. php如何在mysql数据库里创建表_php创建mysql数据库以及数据表

    php创建mysql数据库以及数据表 用php链接到mysqli,成功后利用,mysqli_query()创建数据库以及数据表. $con = mysqli_connect("localho ...

最新文章

  1. 构建商品评价的分类器
  2. java joptionpanel_JOptionPane用法--java
  3. java 代码性能优化_Java代码性能优化(四)
  4. ABAP日期操作函数
  5. 字符输出流写数据的其他方法
  6. 用Linux命令行生成随机密码的十种方法
  7. ORACLE客户端与服务器连接
  8. minio 并发数_c#(asp.net)线程配置总结
  9. 前端学习(3054):vue+element今日头条管理-状态展示处理
  10. C++——构建单链表的方法
  11. 20165211 我期望的师生关系
  12. webStorm关闭自动保存
  13. vmware 网络连接
  14. sun java认证真题,sun scjp考试心得_java认证
  15. 如何选择企业数据加密软件?
  16. 计算机一进制一加一等于一,1加1等于几所有答案_灯谜一加一打一字的答案
  17. 对封装的ajax的应用-查询商铺
  18. 队列的图文介绍及C/C++的实现实例(转自http://www.cnblogs.com/skywang12345/p/3562279.html)
  19. C语言趣味题:猜数字游戏(含代码创建思路与过程)
  20. 通达信软件接口是什么?能看得到五档报价吗?

热门文章

  1. 【转】获取Activity启动时间的三种方式
  2. 干货 | 日访问过亿,办公IM及开放式平台在携程的实践
  3. Google 出了款小程序:原来你们都是神笔马良!
  4. 物联网技术周报第 126 期: 使用 Yocto 构建 Raspberry Pi 系统
  5. 2条CSS通关flexboxfroggy第24关最后一关
  6. 35、基于51单片机的金属探测器
  7. php服装商城网站毕业设计源码241505
  8. python计算本息总和_[Python]等额本息房贷计算器
  9. 求正多边形的面积JAVA_计算正多边形的面积 Gym - 101840G
  10. 优漫动游今年流行什么UI配色