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

【写在前面】

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

        结果如下:


【结语】 

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

评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦起丶

您的鼓励和支持是我创作最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值