【写在前面】

比如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;


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

那么要快速地进行好友列表的查询,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';
结果如下:



【结语】 

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

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信