1. 程式人生 > >關於好友(社交)關係的資料庫設計

關於好友(社交)關係的資料庫設計

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

結果如下:

嗯感覺這樣設計應該是可以的,當然我也希望有人能給出好的建議什麼的啊哈哈~