一、數據結構分析
用戶關注粉絲是一個多對多的數據模型,分析對象的數據特征,我們給每個用戶設計一個關注者屬性和粉絲屬性,用於存儲用戶的關注者id和粉絲id,如用戶1:
$arr1 = [ 'follow' => '[2,3,4],
'fans' => [4,5,6], ]
二、用戶邏輯關系梳理
在用戶關注粉絲模型中,有兩種常見場景:
1.查看自己的粉絲或者關注列表:
這種情況下最多會出現三種關系:
其中1表示僅為本人所關注的人,2表示僅為本人的粉絲,3表示互粉
2.查看別人的粉絲或者關注列表:
此時是以別人的粉絲或關注者與自己的關系進行判定:
其中find表示別人的粉絲或關注列表,在這里統稱為other,1表示other是本人所關注的,2表示other與本人互粉,3表示other是本人的粉絲,4表示和本人沒有任何關系
三、數據庫設計
CREATE TABLE `tb_vip_follow` ( `id` bigint NOT NULL AUTO_INCREMENT, `vip_id` bigint DEFAULT '0' COMMENT '用戶ID(粉絲ID)', `followed_vip_id` bigint DEFAULT '0' COMMENT '關注的用戶ID', `status` tinyint(1) DEFAULT '0' COMMENT '關注狀態(0關注 1取消)', `create_time` datetime DEFAULT NULL COMMENT '創建時間', `update_time` datetime DEFAULT NULL COMMENT '修改時間', PRIMARY KEY (`id`), UNIQUE KEY `vip_followed_indx` (`vip_id`,`followed_vip_id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='會員關注關系表';
用戶每關注一個人,都會在表中添加一條數據,eg:
用戶1關注了用戶2,用戶3;
用戶2關注了用戶1,用戶3和用戶4;
用戶1有粉絲用戶2;
用戶2有粉絲用戶1;
用戶3有粉絲用戶1,用戶2;
用戶4有粉絲用戶2;
用戶1和用戶2互粉。
四、應用
這里為了省事,就沒有考慮status字段,實際應用中,一定要補上,另外在關注之前記得要先查詢是否存在取關,存在取關時只需要更新status字段
1.查看自己的粉絲或者關注列表:
以followed_vip_id字段查詢,可以獲取粉絲列表,以vip_id字段查詢,可以獲取關注者列表。
如查找用戶1的粉絲:
select vip_id from tb_vip_follow where followed_vip_id = 1
如查找用戶1的關注:
select followed_vip_id from tb_vip_follow where vip_id = 1
2.查看別人的粉絲或者關注列表:
查看別人的粉絲或者關注時就會復雜一些了,需要用到子查詢或者連表
1)、用內連接查找所有互粉(可以根據自身需求在后面把查詢范圍補上,如用戶1&用戶2的關注/粉絲列表):
select a.* from tb_vip_follow as a inner join tb_vip_follow as b on a.followed_vip_id = b.vip_id and a.vip_id = b.followed_vip_id
2)、用子查詢查找用戶1和用戶2的共同關注
select followed_vip_id from tb_vip_follow where followed_vip_id in (select followed_vip_id from tb_vip_follow where vip_id = 1) and vip_id = 2
3)、用子查詢查找用戶2和用戶3的共同粉絲
select vip_id from tb_vip_follow where vip_id in (select vip_id from tb_vip_follow where followed_vip_id = 3) and followed_vip_id = 2
缺點:
1.當用戶量大時表數據量會非常龐大,因此必需要采用水平分表的方式將用戶分散到多個表。
2.每一次使用該表時都要將整條數據取出進行計算,對資源耗費太過嚴重。
3.數據庫瓶頸,並發受限。
基於mysql存在的缺點,使用redis的Hash數據類型配合使用。
五、使用redis的Hash數據類型
Redis hash是一個string類型的field和value的映射表。
Redis 中每個 hash 可以存儲 232 - 1 鍵值對(40多億)。
每個用戶分一張hash表,表名為用戶id(可加前綴或后綴)
用戶每關注一個人,便在hash表中添加一條數據
優點
1.查詢處理速度快。
缺點
1.消耗服務器內存和CPU。最好使用一台單獨的服務器來運行 Redis
2.數據查詢,處理不如關系型數據庫靈活。
3.開發步驟復雜,學習成本高。