在社交類系統中,用戶與用戶的好友關系的設計必不可少,那么如何設計好友的數據庫至關重要,本篇文章帶大家學習一下相關的設計方案。
基礎分析
第一步,有一張用戶表,表內包含用戶的基本信息,比如賬號、姓名、性別等信息。這里用tb_user表示用戶信息表。
ID 用戶名
1 張三
2 李四
3 王五
4 趙六
第二步,需要將用戶與用戶直接建立好友關系。這里有兩種情況:單向好友關系、互為好友關系。
- 單向好友關系就是張三在李四的好友列表中,但李四沒有在張三的好友列表中;
- 互為好友關系,如果張三和李四為好友,則雙方都在彼此的好友列表中;
好友關系設計
無論上面兩種關系的哪一種,好友關系表都可以使用下面的設計,表tb_friend:
ID user_id friend_id
1 1 2
2 1 3
示例中,張三擁有李四和王五兩個好友。
單向好友模式
如果是單向好友模式,那么兩個人互為好友關系則插入的數據應該是這樣:
ID user_id friend_id
1 1 2
2 2 1
也就是張三是李四的好友,李四也是張三的好友。此時使用sql語句查詢時只用限定user_id作為條件即可查詢出用戶的好友列表:
select * from tb_friend where user_id = 1
1
互為好友關系
因為是互為好友關系,則只需要插入一條數據即可。對應的查詢語句為:
select * from tb_friend where user_id = 1 or friend_id = 1
1
2
當然也可以使用UNION ALL來實現:
select friend_id as friends from tb_friend where user_id = 1
UNION ALL --使用UNION ALL,因為不存在重復的
select user_id as friends from tb_friend where friend_id = 1
1
2
3
注意事項:
- user_id1–>friend_id2和user_id2–>friend_id1是相同的記錄,不需要重復插入;
- 為了快速判斷兩個人是不是好友,可在程序層插入數據前添加一個限制user_id1 < user_id2;
- 可加入緩存層(Redis或Memcached)來提高性能;
- 可從數據庫層限制(user_id,friend_id)不可重復;
加入分組
如果好友數量比較多,關系比較復雜,可引入好友分組,可進行如下改造:
ID user_id friend_id user_group friend_group
1 1 2 好友 同學
2 1 3 同學 同學
在數據庫中添加了user_group,當前user給friend設置的分組,friend_group是當前user的朋友對其設置的分組類別。
於是,查詢好友列表的SQL如下:
select friend_id as friends ,user_group as my_group from tb_friends where user_id = 1
UNION ALL
select user_id as friends , friend_group as my_group from friend_id = 1
1
2
3
4
5
小結
至此社交系統中好友關系的設計及SQL語句使用基本完成。可根據具體的業務情況進行修改。在查詢除好友的id列表之后就可以進行好友信息的查詢。此處需要注意的是如果用in語句來查詢會有不走索引、sql語句大小限制、性能等問題,可考慮使用左連接進行查詢。
————————————————