社交网络分析的核心是对用户之间的关系、互动行为进行量化统计和挖掘,MySQL作为成熟的关系型数据库,凭借稳定的事务支持和高效的查询能力,非常适合存储和处理社交网络的结构化数据。通过合理的数据建模和针对性的SQL查询,我们可以实现好友关系梳理、互动热度统计、潜在好友推荐等常见分析需求。

社交网络数据建模
社交网络的核心数据包含用户基础信息、用户之间的关系、用户互动行为三类,我们需要设计对应的表结构来存储这些数据。
核心表结构设计
首先创建用户基础信息表,存储用户的基本属性:
-- 用户基础信息表
CREATE TABLE user_info (
user_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
user_name VARCHAR(50) NOT NULL COMMENT '用户昵称',
register_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',
INDEX idx_register_time (register_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户基础信息表';
接下来创建用户关系表,存储用户之间的关注、好友等关系,这里以双向好友关系为例:
-- 用户关系表,存储双向好友关系
CREATE TABLE user_relation (
relation_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '关系ID',
user_id INT NOT NULL COMMENT '用户ID',
friend_id INT NOT NULL COMMENT '好友用户ID',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立关系时间',
-- 联合唯一索引,避免重复的好友关系
UNIQUE KEY uk_user_friend (user_id, friend_id),
INDEX idx_friend_id (friend_id),
-- 外键关联用户表,保证数据一致性
FOREIGN KEY fk_user_id (user_id) REFERENCES user_info(user_id) ON DELETE CASCADE,
FOREIGN KEY fk_friend_id (friend_id) REFERENCES user_info(user_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户好友关系表';
最后创建用户互动行为表,存储点赞、评论、转发等互动数据:
-- 用户互动行为表
CREATE TABLE user_interaction (
interaction_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '互动ID',
from_user_id INT NOT NULL COMMENT '发起互动的用户ID',
to_user_id INT NOT NULL COMMENT '接收互动的用户ID',
interaction_type TINYINT NOT NULL COMMENT '互动类型:1点赞 2评论 3转发',
content TEXT COMMENT '互动内容,评论时有效',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '互动时间',
INDEX idx_from_user (from_user_id),
INDEX idx_to_user (to_user_id),
INDEX idx_create_time (create_time),
FOREIGN KEY fk_from_user (from_user_id) REFERENCES user_info(user_id) ON DELETE CASCADE,
FOREIGN KEY fk_to_user (to_user_id) REFERENCES user_info(user_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户互动行为表';
常见社交网络分析场景实现
查询用户的好友列表
查询指定用户的所有好友,只需要从user_relation表中匹配对应用户ID即可:
-- 查询用户ID为1的所有好友
SELECT
u.user_id,
u.user_name,
r.create_time AS become_friend_time
FROM user_relation r
INNER JOIN user_info u ON r.friend_id = u.user_id
WHERE r.user_id = 1
ORDER BY r.create_time DESC;
统计用户互动热度排名
统计近30天内被互动次数最多的用户,用于发现活跃用户或者热门用户:
-- 统计近30天被互动次数最多的前10名用户
SELECT
u.user_id,
u.user_name,
COUNT(i.interaction_id) AS interaction_count
FROM user_interaction i
INNER JOIN user_info u ON i.to_user_id = u.user_id
WHERE i.create_time >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
GROUP BY u.user_id, u.user_name
ORDER BY interaction_count DESC
LIMIT 10;
潜在好友推荐
基于好友的好友推荐逻辑,即推荐用户的好友的好友,同时排除已经是好友的用户:
-- 为用户ID为1推荐潜在好友,推荐好友的好友
SELECT
u.user_id,
u.user_name,
COUNT(DISTINCT r2.user_id) AS common_friend_count
FROM user_relation r1
INNER JOIN user_relation r2 ON r1.friend_id = r2.user_id
INNER JOIN user_info u ON r2.friend_id = u.user_id
-- 排除已经是好友的用户
LEFT JOIN user_relation r3 ON r3.user_id = 1 AND r3.friend_id = r2.friend_id
WHERE r1.user_id = 1
AND r2.friend_id != 1
AND r3.relation_id IS NULL
GROUP BY u.user_id, u.user_name
ORDER BY common_friend_count DESC
LIMIT 10;
共同好友数量统计
查询两个用户之间的共同好友数量,用于评估用户之间的关联度:
-- 查询用户1和用户2的共同好友数量
SELECT COUNT(DISTINCT r1.friend_id) AS common_friend_count
FROM user_relation r1
INNER JOIN user_relation r2 ON r1.friend_id = r2.friend_id
WHERE r1.user_id = 1
AND r2.user_id = 2;
分析性能优化建议
当社交网络数据量增长到千万级以上时,需要做对应的优化保证查询效率:
- 为关系表和互动表的常用查询字段建立合适的索引,比如用户ID、时间字段的联合索引
- 对于高频的聚合查询,可以建立汇总表定期更新数据,避免每次查询都做全表扫描
- 如果关系查询场景较多,可以考虑将双向关系拆分为两条记录存储,减少查询时的关联操作
- 定期清理过期的互动数据,或者将历史数据归档到冷存储,减少主表的数据量
注意事项
在进行社交网络分析时,需要注意数据隐私保护,用户关系、互动数据都属于敏感信息,存储和查询时都需要做好权限控制,避免数据泄露。另外如果涉及复杂的图计算需求,比如社群发现、最短路径计算,MySQL的处理效率会低于专门的图数据库,此时可以结合图数据库一起使用,MySQL负责存储基础数据,图数据库负责复杂分析计算。