tva
← Insights

构建包含数千道题目的备考应用:架构决策

规模挑战

备考应用在高考压力期间流量会出现峰值,其余时间流量较低。数据库模式需要支持数千道题目、多种认证科目、多个地区,以及每道题目的性能追踪。

题目数据模型

最关键的模式决策是题目内容与题目元数据的分离:

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 集成在本地存储。

相关洞见

相关文章