
1) 【一句话结论】:采用分库分表结合消息队列(如Kafka)实现实时数据同步,通过事件溯源保证学习行为数据的实时性,结合最终一致性策略(如乐观锁或时间戳)保证多设备数据一致性,并设计复合索引(如用户ID+课程ID+时间戳)优化查询性能。
2) 【原理/概念讲解】:
首先,用户信息表存储用户基础信息(如用户ID、姓名、注册时间等),主键为用户ID。课程学习记录表记录用户学习某门课程的行为(如章节进度、学习时间戳、是否完成),主键为用户ID+课程ID(复合主键),并添加时间戳索引(如学习时间字段)。互动数据表(问答、讨论区)存储用户参与互动的信息(如问题ID、回复ID、讨论区ID、参与时间等),主键为互动ID。
实时性方面,采用事件溯源模式:用户学习行为(如点击章节、提交作业)触发事件,通过消息队列(如Kafka)发送事件,数据库消费事件并更新学习记录表,确保数据实时同步。一致性方面,多设备同步时,采用最终一致性:设备A更新学习进度后,通过消息队列通知其他设备,设备B消费后更新本地数据,允许短暂不一致(如1-2秒),避免强一致性带来的性能瓶颈。索引优化:对于查询“用户U学习课程C的最近学习记录”,使用复合索引(用户ID+课程ID+学习时间 DESC),加速范围查询;对于查询“课程C的参与互动数量”,使用课程ID作为索引。
3) 【对比与适用场景】:
| 表/索引类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 用户信息表 | 存储用户基础信息 | 主键唯一,数据不频繁变更 | 用户注册、登录 | 避免冗余字段 |
| 课程学习记录表 | 记录用户学习行为(章节、时间) | 复合主键(用户ID+课程ID),时间戳索引 | 查询用户学习进度 | 时间戳索引用于排序 |
| 互动数据表 | 存储问答、讨论区参与 | 主键唯一,按时间排序 | 分析用户互动活跃度 | 索引按互动类型分组 |
索引类型对比:
4) 【示例】:表结构设计(伪代码):
-- 用户信息表
CREATE TABLE user_info (
user_id INT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
register_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE (username),
UNIQUE (phone_number)
);
-- 课程学习记录表
CREATE TABLE course_learning_record (
user_id INT,
course_id INT,
chapter_id INT,
learning_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
is_completed BOOLEAN DEFAULT FALSE,
PRIMARY KEY (user_id, course_id, chapter_id),
INDEX idx_user_course_time (user_id, course_id, learning_time DESC)
);
-- 互动数据表(问答)
CREATE TABLE question_answer (
qa_id INT PRIMARY KEY,
user_id INT,
course_id INT,
question_content TEXT,
answer_content TEXT,
answer_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_user_course_qa (user_id, course_id, answer_time DESC)
);
-- 互动数据表(讨论区)
CREATE TABLE discussion (
discussion_id INT PRIMARY KEY,
user_id INT,
course_id INT,
content TEXT,
post_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_user_course_discussion (user_id, course_id, post_time DESC)
);
实时性实现:当用户点击“学习章节3”时,服务端生成事件(user_id=100, course_id=101, chapter_id=3),发送到Kafka主题“learning_events”。数据库消费该事件,更新course_learning_record表(is_completed=TRUE,learning_time=当前时间)。多设备同步:设备A更新后,发送消息到Kafka,设备B消费后更新本地表,允许1秒内数据不一致。
5) 【面试口播版答案】:各位面试官好,我来设计一个存储学员学习行为数据的数据库表结构。首先,核心表包括用户信息表、课程学习记录表和互动数据表。用户信息表存储用户ID、姓名等基础信息,主键为用户ID。课程学习记录表记录用户学习某门课程的章节进度和时间戳,用用户ID+课程ID+章节ID作为复合主键,并添加时间戳索引,方便查询最近学习记录。互动数据表分为问答和讨论区,存储用户参与的内容和时间,按用户ID和课程ID建索引。为了保证数据实时性,采用事件溯源模式,用户学习行为触发事件,通过消息队列(如Kafka)实时同步到数据库,确保学习进度更新及时。数据一致性方面,多设备同步时采用最终一致性,设备A更新后通过消息队列通知其他设备,允许短暂不一致(如1-2秒),避免强一致性带来的性能问题。索引优化方面,对课程学习记录表添加(用户ID、课程ID、学习时间)的复合索引,加速查询用户在某门课程的学习进度;对互动数据表按用户ID和课程ID建索引,提升互动内容的检索效率。这样设计既能保证数据实时更新,又能处理多设备同步的一致性问题,同时通过索引优化查询性能。
6) 【追问清单】:
7) 【常见坑/雷区】: