關於好友(社交)關係的資料庫設計
阿新 • • 發佈:2019-01-31
比如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';
結果如下:
嗯感覺這樣設計應該是可以的,當然我也希望有人能給出好的建議什麼的啊哈哈~