构建包含数千道题目的备考应用:架构决策
规模挑战
备考应用在高考压力期间流量会出现峰值,其余时间流量较低。数据库模式需要支持数千道题目、多种认证科目、多个地区,以及每道题目的性能追踪。
题目数据模型
最关键的模式决策是题目内容与题目元数据的分离:
questions
id, content, explanation, difficulty, created_at
question_metadata
question_id, certification_id, region_id, topic_id
user_attempts
user_id, question_id, correct, time_taken, attempted_at这种分离允许在不修改题目内容的情况下,将同一道题目与多个认证科目关联。
自适应测验逻辑
有效的备考不是随机展示题目,而是识别薄弱环节并集中练习那些方面。我们使用了一个简化的间隔重复模型:根据用户近期的答对率来权重选择题目,优先展示那些历史上答错率较高的题目。
这个逻辑在 PostgreSQL 函数中实现,以避免往返于应用服务器的额外延迟:
SELECT * FROM questions
JOIN question_metadata USING (id)
LEFT JOIN user_performance USING (question_id, user_id)
WHERE certification_id = $1
ORDER BY COALESCE(accuracy_rate, 0.5) ASC
LIMIT 10内容版本控制
认证考试会随时间更新其题目库。题目数据模型需要支持版本控制,以便旧版本的学习历史不会在内容更新时变得无效。我们通过将 version_id 添加到 question_metadata 来处理这个问题,而不是直接修改题目内容。
移动端离线支持
备考应用通常在没有可靠网络连接的地方使用(通勤途中、图书馆)。我们实现了题目子集的离线缓存,当连接恢复时进行同步,使用 React Native 的 SQLite 集成在本地存储。