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

比如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,因为不存在重复的
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';

结果如下:


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

猜你喜欢

转载自blog.csdn.net/u011283226/article/details/80706784