Academic Suite 数据库设计

发布: (2025年12月29日 GMT+8 11:06)
5 min read
原文: Dev.to

Source: Dev.to

数据库是 Academic Suite 的核心基础。在在线考试系统中,若数据库模式设计不当,可能导致严重的瓶颈,尤其是当数百至数千名学生几乎同时提交答案时。

本章我们从 系统域 的角度讨论数据库设计,重点关注数据模式如何支持在线考试系统的可扩展性、一致性和可观测性需求。

2.1 数据模型概览

Academic Suite 采用关系型方法构建,使用 PostgreSQL,因为它能够处理事务、复杂关系并保持强数据一致性。

数据模型分为四大组:

  • 组织模型 – 机构、用户和班级
  • 学术模型 – 科目、测验和题库
  • 考试模型 – 考试执行和学生尝试
  • 审计与监控模型 – 答案和防作弊活动

这种划分有助于职责隔离,并促进高级功能的开发。

2.2 实体关系图 (ERD)

下面的图示说明了 Academic Suite 系统中实体之间的主要关系。

erDiagram
    INSTITUTION ||--|{ USER : has
    INSTITUTION ||--|{ SUBJECT : offers

    USER ||--|{ CLASS : "teaches/enrolled"
    USER ||--o{ ATTEMPT : takes

    SUBJECT ||--|{ CLASS : has
    SUBJECT ||--|{ QUIZ : contains

    QUIZ ||--|{ QUESTION : contains
    QUIZ ||--|{ EXAM_BATCH : scheduled_as

    QUESTION ||--|{ OPTION : has

    EXAM_BATCH ||--o{ ATTEMPT : records
    CLASS ||--|{ EXAM_BATCH : participates_in

    ATTEMPT ||--|{ ANSWER : contains
    ATTEMPT ||--|{ EVENT_LOG : generates

此 ERD 作为本章以及后续章节的主要参考。

2.3 组织模型(用户、机构、班级)

机构与用户

每个用户必须关联到单个机构,以实现多租户,便于未来扩展。

institutions

  • id (PK)
  • name
  • created_at

users

  • id (PK)
  • email (unique)
  • role (admin, teacher, student)
  • institution_id (FK)

这些关系确保了机构之间的数据隔离,同时在初始阶段不会增加过多复杂性。

班级

Class 实体用于将学生分组并便于安排考试。

  • student_idsJSON 文本 形式存储,内容为学生 ID 的数组。

设计决策
使用 JSON 而不是关联表 (class_students) 可以在考试期间优化读取性能。在高并发情况下,读取单行并解析 JSON 往往比对大型关联表进行 JOIN 更快。这会在数据库层面牺牲外键约束;一致性校验在应用层完成。

2.4 Academic Models (Subject, Quiz, Question)

Subject

表示机构提供的学科。

Quiz

Quiz 充当考试 蓝图 并存储全局配置:

  • time_limit
  • passing_score
  • exam_type

Question & Option

每个 Question 存储内容和类型(mcqessay 等)。对于多选题,答案选项存储在单独的表 (question_options) 中,提供选项数量的灵活性并支持未来的题型。

2.5 考试模型 (ExamBatch & Attempt)

ExamBatch(考试会话)

ExamBatch 代表一次具体的测验执行。

  • 同一测验可以为不同班级安排多次。
  • 包含用于考试入口的 token
  • 生命周期状态:scheduledactivefinished

Attempt(考试尝试)

每次学生开始考试时会创建一条 Attempt 记录。

关键字段:

  • statusACTIVESUBMITTED
  • remaining_time:剩余时间的快照(秒),确保页面刷新或中断后的一致性
  • score:最终得分

2.6 答案与事件日志(关键数据与防作弊)

答案

answers 表用于存储学生对每道题的作答。

  • 数据量极大
  • 考试期间写入强度高

优化方案:在 (attempt_id, question_id) 上建立复合索引,以在重新加载考试页面时保持查询快速。

事件日志

可疑行为会记录在 event_logs 表中,包括:

  • FOCUS_LOST
  • TAB_SWITCH
  • DEVICE_CHANGE

这些数据为后续章节中讨论的实时监控功能和考试完整性评估提供支撑。

章节概述

我们已经完成了 Academic Suite 数据库设计的学习,涵盖了组织结构、学术模型、考试事务模型以及活动日志。该设计在性能、数据一致性和开发灵活性之间取得了平衡。

接下来:第 3 章 – 构建身份验证和授权系统,这是保护对所有 Academic Suite 数据和功能访问的主要入口。

Back to Blog

相关文章

阅读更多 »

从块到意义:数据项与数据库

你好,我是Maneshwar。我正在开发FreeDevTools在线 https://hexmos.com/freedevtools,当前正在打造一个汇集所有 dev tools、cheat codes 和 TLDRs 的统一平台……