社交系統中用戶好友關系數據庫設計


在社交類系統中,用戶與用戶的好友關系的設計必不可少,那么如何設計好友的數據庫至關重要,本篇文章帶大家學習一下相關的設計方案。

基礎分析
第一步,有一張用戶表,表內包含用戶的基本信息,比如賬號、姓名、性別等信息。這里用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語句大小限制、性能等問題,可考慮使用左連接進行查詢。
————————————————

https://blog.csdn.net/wo541075754/article/details/82733278


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM