Skip to content

数据库设计

1. 当前设计原则

  1. 关系型事实来源统一落在 PostgreSQL。
  2. 结构变更统一通过 Flyway 管理,不手工改表。
  3. 当前仓库使用 BIGINT IDENTITY 作为主键策略。
  4. 状态字段显式建模,避免用隐含布尔值拼接业务状态。
  5. 平台治理身份与课程成员关系分开建模。

2. 平台治理表

2.1 org_units

字段说明
id组织主键
parent_id上级组织
code组织编码,大小写不敏感唯一
name组织名称
typeSCHOOL / COLLEGE / COURSE / CLASS
level固定层级 1 ~ 4
sort_order排序号
statusACTIVE / DISABLED

2.2 users

字段说明
id用户主键
primary_org_unit_id默认归属组织
username登录名,大小写不敏感唯一
display_name显示名称
email邮箱,大小写不敏感唯一
phone手机号,可为空
password_hash密码哈希
account_statusACTIVE / DISABLED / LOCKED / EXPIRED
failed_login_attempts连续失败次数
locked_until锁定截止时间
expires_at账号失效时间
last_login_at最近登录时间

2.3 academic_profiles

字段说明
id画像主键
user_id用户主键,1:1 关联
academic_id学号/工号,大小写不敏感唯一
real_name真实姓名
identity_typeTEACHER / STUDENT / ADMIN
profile_statusACTIVE / SUSPENDED / GRADUATED / LEFT
phone画像手机号,可为空

2.4 user_org_memberships

字段说明
id成员关系主键
user_id用户主键
org_unit_id组织节点
membership_typeENROLLED / TEACHES / ASSISTS / MANAGES / BELONGS_TO_GROUP
membership_statusACTIVE / INACTIVE / COMPLETED / REMOVED
source_typeMANUAL / IMPORT / SYNC / SSO_BIND
start_at起始时间
end_at结束时间

2.5 user_scope_roles

字段说明
id记录主键
user_id用户主键
scope_org_unit_id作用域组织
role_codeSCHOOL_ADMIN / COLLEGE_ADMIN / COURSE_ADMIN / CLASS_ADMIN
created_at创建时间

2.6 platform_configs

字段说明
id主键
platform_name平台名称
platform_short_name平台简称
logo_urlLogo 地址
footer_text页脚文案
default_home_path默认首页路径
theme_key主题标识
login_notice登录页提示
module_flags模块开关 JSON
updated_by_user_id最近更新人

2.7 audit_logs

字段说明
id审计主键
actor_user_id操作人
action动作编码
target_type目标类型
target_id目标标识
resultSUCCESS / FAILURE
request_id请求链路标识
ip来源地址
metadata扩展上下文 JSON
created_at创建时间

2.8 auth_sessions

字段说明
id会话主键
user_id用户主键
sid会话标识,JWT 中携带
refresh_token_hashrefresh token 哈希
status会话状态
created_at创建时间
expires_at过期时间

3. 课程主数据表

3.1 academic_terms

字段说明
id学期主键
term_code学期编码,大小写不敏感唯一
term_name学期名称
school_year学年
semesterSPRING / SUMMER / AUTUMN / WINTER
start_date开始日期
end_date结束日期
statusPLANNING / ONGOING / ENDED / ARCHIVED

3.2 course_catalogs

字段说明
id课程模板主键
course_code课程编码,大小写不敏感唯一
course_name课程名称
course_typeREQUIRED / ELECTIVE / GENERAL / PRACTICE
credit学分
total_hours总学时
department_unit_id所属学院
description课程描述
statusACTIVE / DISABLED

3.3 course_offerings

字段说明
id开课实例主键
catalog_id关联课程模板
term_id关联学期
offering_code开课编码,大小写不敏感唯一
offering_name开课名称
primary_college_unit_id主学院
org_course_unit_id对应组织树中的 COURSE 节点
delivery_modeONLINE / OFFLINE / HYBRID
languageZH / EN / BILINGUAL
capacity课程容量
selected_count已选人数
statusDRAFT / PUBLISHED / ONGOING / FROZEN / ENDED / ARCHIVED
start_at / end_at开课起止时间

3.4 course_offering_college_maps

字段说明
id主键
offering_id开课实例
college_unit_id共同管理学院
relation_typePRIMARY / SECONDARY / CROSS_LISTED

3.5 teaching_classes

字段说明
id教学班主键
offering_id所属开课实例
class_code班级编码,课程内大小写不敏感唯一
class_name班级名称
entry_year入学年份
org_class_unit_id对应组织树中的 CLASS 节点
capacity班级容量
statusACTIVE / FROZEN / ARCHIVED
announcement_enabled公告功能开关
discussion_enabled讨论区功能开关
resource_enabled资源功能开关
lab_enabled实验功能开关
assignment_enabled作业功能开关

3.6 course_members

字段说明
id课程成员主键
offering_id所属开课实例
teaching_class_id所属教学班,可空
user_id平台用户
member_roleINSTRUCTOR / TA / STUDENT / OBSERVER
member_statusPENDING / ACTIVE / DROPPED / COMPLETED / REMOVED
source_typeMANUAL / IMPORT / SYNC
remark备注
joined_at / left_at加入和离开时间

3.7 course_resources

字段说明
id课程资源主键
offering_id所属开课实例
teaching_class_id可选教学班范围;为空表示开课级资源
uploader_user_id上传人
title资源标题
description可选资源说明,保存原始 Markdown,最长 5000 字
object_key对象存储键
original_filename原始文件名
content_typeMIME 类型
size_bytes文件大小

4. 作业与题库表

4.1 assignments

字段说明
id作业主键
offering_id所属开课实例
title作业标题
statusDRAFT / PUBLISHED / CLOSED
其他字段截止时间、提交限制、评分模式等

4.2 question_bank_questions

字段说明
id题目主键
offering_id所属开课实例
question_type题型
content题目内容
config_json题目配置(含编程题隐藏测试点)
category分类/标签

4.3 question_bank_question_options

字段说明
id选项主键
question_id所属题目
option_content选项内容
is_correct是否正确答案

4.4 assignment_sections

字段说明
id大题主键
assignment_id所属作业
section_name大题名称
sort_order排序号

4.5 assignment_questions

字段说明
id试卷题目主键
section_id所属大题
question_bank_question_id关联题库题目
score分值
sort_order排序号
config_json题目配置快照

4.6 assignment_question_options

字段说明
id选项主键
assignment_question_id所属试卷题目
option_content选项内容
is_correct是否正确答案

4.7 assignment_judge_profiles

字段说明
id评测配置主键
assignment_id所属作业
评测脚本、语言、环境等配置

4.8 assignment_judge_cases

字段说明
id测试用例主键
judge_profile_id所属评测配置
input输入
expected_output期望输出
score分值

5. 提交与工作区表

5.1 submissions

字段说明
id提交主键
assignment_id所属作业
user_id提交用户
submit_no提交序号
status提交状态
accepted_at受理时间

5.2 submission_answers

字段说明
id答案主键
submission_id所属提交
assignment_question_id对应试卷题目
answer_content答案内容
auto_score客观题自动评分
manual_score人工评分
final_score最终评分

5.3 submission_artifacts

字段说明
id附件主键
submission_id所属提交
file_name文件名
storage_key对象存储键
file_size文件大小

5.4 programming_workspaces

字段说明
id工作区主键
user_id用户
assignment_id所属作业
assignment_question_id所属编程题
language编程语言
files_snapshot目录树源码快照
latest_input最近一次标准输入

5.5 programming_workspace_revisions

字段说明
id修订主键
workspace_id所属工作区
revision_no修订序号
revision_kind修订类型
files_snapshot源码快照

6. 评测与成绩表

6.1 judge_jobs

字段说明
id评测作业主键
submission_answer_id关联分题答案(结构化题)
assignment_id关联作业(legacy)
submission_id关联提交
status评测状态
result_json评测结果
report_storage_key详细报告对象存储键

6.2 programming_sample_runs

字段说明
id样例试运行主键
user_id用户
assignment_id所属作业
assignment_question_id所属编程题
workspace_id关联工作区
revision_id关联修订
input输入
output输出
status运行状态

6.3 成绩册读模型

当前 V48 后不再保留独立 grade_appealsgrade_publish_snapshot_batchesgrade_publish_snapshots 或 assignment 级 grade_weight。成绩册和统计报告直接聚合 assignments / submissions / submission_answers / course_members,成绩发布状态仍由 assignments.grade_published_atassignments.grade_published_by_user_id 表达。

7. 实验表

7.1 labs

字段说明
id实验主键
teaching_class_id所属教学班
title实验标题
description实验说明
statusDRAFT / PUBLISHED / CLOSED
open_at / due_at开放和截止时间

7.2 lab_reports

字段说明
id实验报告主键
lab_id所属实验
user_id学生
content报告内容
statusDRAFT / SUBMITTED / REVIEWED / PUBLISHED
review_comment教师评语
review_score教师评分

7.3 lab_report_attachments

字段说明
id附件主键
report_id所属报告
file_name文件名
storage_key对象存储键
file_size文件大小

8. 通知表

8.1 notifications

字段说明
id通知主键
type通知类型
title通知标题
content通知内容
created_at创建时间

8.2 notification_receipts

字段说明
id收件记录主键
notification_id关联通知
user_id收件用户
is_read是否已读
read_at阅读时间

9. 索引约定

  • org_unitslower(code) 唯一索引、parent_id + sort_order + id
  • userslower(username) 唯一索引、lower(email) 唯一索引
  • academic_profilesuser_id 唯一索引、lower(academic_id) 唯一索引
  • user_org_membershipsuser_id + org_unit_id + membership_type 唯一索引
  • user_scope_rolesuser_id + scope_org_unit_id + role_code 唯一索引
  • academic_termslower(term_code) 唯一索引
  • course_catalogslower(course_code) 唯一索引
  • course_offeringslower(offering_code) 唯一索引
  • course_offering_college_mapsoffering_id + college_unit_id 唯一索引
  • teaching_classesoffering_id + lower(class_code) 唯一索引
  • course_membersINSTRUCTORoffering_id + user_id 唯一、STUDENToffering_id + user_id 唯一
  • audit_logsactor_user_id + created_ataction + created_at

10. 设计边界

  • 平台治理身份只解决平台配置、组织、用户、审计等后台治理问题。
  • 教师、助教、学员等课程业务角色不落在 usersuser_scope_roles 的全局字段上。
  • 学号/工号和成员关系已落到独立表,不再把这类业务信息塞进 users 主表。
  • 成绩册聚合继续挂接在 assignments / submissions / submission_answers / course_members,当前不引入独立成绩表。
  • 当前实现明确禁止学生自主选课;课程成员仅由教师批量添加或导入既有系统用户。