【写在前面】
比如 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';
结果如下:
【结语】
嗯感觉这样设计应该是可以的,当然我也希望有人能给出好的建议什么的啊哈哈~