原創 社交系統中使用者好友關係資料庫設計
在社交類系統中,使用者與使用者的好友關係的設計必不可少,那麼如何設計好友的資料庫至關重要,本篇文章帶大家學習一下相關的設計方案。
基礎分析
第一步,有一張使用者表,表內包含使用者的基本資訊,比如賬號、姓名、性別等資訊。這裡用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
互為好友關係
因為是互為好友關係,則只需要插入一條資料即可。對應的查詢語句為:
select * from tb_friend where user_id = 1 or friend_id = 1
當然也可以使用UIO/">NION ALL來實現:
select friend_id as friends from tb_friendwhere user_id = 1 UNION ALL --使用UNION ALL,因為不存在重複的 select user_id as friends from tb_friend where friend_id = 1
注意事項:
- 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
小結
至此社交系統中好友關係的設計及SQL語句使用基本完成。可根據具體的業務情況進行修改。在查詢除好友的id列表之後就可以進行好友資訊的查詢。此處需要注意的是如果用in語句來查詢會有不走索引、sql語句大小限制、效能等問題,可考慮使用左連線進行查詢。