Skip to content

00_Eins 数据库 Schema (v3) — 作业系统增强版

本版本在 v2 基础上,主要增强作业系统功能,包括:

  • 作业状态管理和生命周期
  • 作业提交的详细信息和评分系统
  • AI 辅助评分和反馈
  • 章节级学习目标和扩展资源
  • 步骤类型化和配置系统

1. 版本变更摘要

1.1 主要变更(对比 v2)

  • 作业系统重构:移除 assignments.task_id,增强作业独立性和管理能力
  • 作业状态管理:新增 assignment_status 枚举,支持完整的作业生命周期
  • 评分系统增强:新增 grading_status 枚举,支持 AI 辅助评分
  • 章节级资源:新增章节级学习目标和扩展资源表
  • 步骤类型化:新增步骤类型和配置表,支持不同类型的步骤

1.2 新增枚举类型

sql
-- 作业状态
CREATE TYPE assignment_status AS ENUM (
  'draft', 'published', 'in_progress', 'closed', 'archived'
);

-- 评分状态
CREATE TYPE grading_status AS ENUM (
  'not_submitted', 'submitted', 'grading', 'graded'
);

-- 步骤类型(已在 v2 中定义,v3 中增强使用)
CREATE TYPE steptype AS ENUM (
  'courseware', 'ai_task', 'assignment'
);

2. 表结构变更

2.1 assignments(作业表 - 增强版)

sql
-- v3 变更:移除 task_id,增强作业管理能力
CREATE TABLE assignments (
    id              bigserial PRIMARY KEY,
    course_id       bigint REFERENCES courses(id) ON DELETE CASCADE,
    class_id        bigint REFERENCES classes(id) ON DELETE CASCADE,
    name            varchar(128) NOT NULL DEFAULT 'Untitled',  -- v3 新增
    description     text,                                      -- v3 新增
    guidance        text,                                      -- v3 新增
    deadline        timestamptz,
    status          assignment_status NOT NULL DEFAULT 'draft', -- v3 新增
    created_at      timestamptz DEFAULT now()
);

-- v3 新增索引
CREATE INDEX idx_assignments_status ON assignments(status);
CREATE INDEX idx_assignments_course_class ON assignments(course_id, class_id);

变更说明

  • 移除 task_id 字段,作业不再直接关联任务
  • 新增 namedescriptionguidance 字段,增强作业描述能力
  • 新增 status 字段,支持作业状态管理
  • 新增复合索引,优化查询性能

2.2 assignment_submissions(作业提交表 - 增强版)

sql
CREATE TABLE assignment_submissions (
    id                  bigserial PRIMARY KEY,
    assignment_id       bigint REFERENCES assignments(id) ON DELETE CASCADE,
    user_id             bigint REFERENCES users(id) ON DELETE CASCADE,
    answer_text         text,
    work_name           varchar(128),                          -- v3 新增
    work_description    text,                                  -- v3 新增
    score               numeric(5,2),
    feedback_text       text,                                  -- v3 新增
    ai_suggestions      jsonb,                                 -- v3 新增
    ai_adopted          boolean DEFAULT false,                 -- v3 新增
    grading_status      grading_status NOT NULL DEFAULT 'not_submitted', -- v3 新增
    submitted_at        timestamptz DEFAULT now(),
    graded_at           timestamptz,                           -- v3 新增
    graded_by           bigint REFERENCES users(id),           -- v3 新增
    ai_session_id       bigint REFERENCES ai_sessions(id),     -- v3 新增
    attachments         jsonb,                                 -- v3 新增
    is_public           boolean DEFAULT false,                 -- v3 新增
    
    UNIQUE(assignment_id, user_id)  -- v3 新增唯一约束
);

-- v3 新增索引
CREATE INDEX idx_assignment_submissions_assignment_id ON assignment_submissions(assignment_id);
CREATE INDEX idx_assignment_submissions_user_id ON assignment_submissions(user_id);
CREATE INDEX idx_assignment_submissions_grading_status ON assignment_submissions(grading_status);

变更说明

  • 新增 work_namework_description 字段,支持作业作品描述
  • 新增 feedback_text 字段,支持教师反馈
  • 新增 ai_suggestions 字段,存储 AI 评分建议
  • 新增 ai_adopted 字段,标记是否采用 AI 建议
  • 新增 grading_status 字段,支持评分状态管理
  • 新增 graded_atgraded_by 字段,支持评分追踪
  • 新增 ai_session_id 字段,关联 AI 会话
  • 新增 attachments 字段,支持附件管理
  • 新增 is_public 字段,支持公开分享
  • 新增唯一约束和索引,优化数据完整性

2.3 chapter_steps(章节步骤表 - 增强版)

sql
CREATE TABLE chapter_steps (
    id          bigserial PRIMARY KEY,
    chapter_id  bigint REFERENCES course_chapters(id) ON DELETE CASCADE,
    sort_order  int DEFAULT 0,
    step_type   steptype NOT NULL DEFAULT 'courseware'  -- v3 新增
);

CREATE INDEX idx_chapter_steps_chapter_id ON chapter_steps(chapter_id);
CREATE INDEX idx_chapter_steps_type ON chapter_steps(step_type);

变更说明

  • 新增 step_type 字段,支持步骤类型化
  • 步骤类型包括:courseware(课件)、ai_task(AI 任务)、assignment(作业)

2.4 step_ai_task_configs(AI 任务配置表 - 新增)

sql
CREATE TABLE step_ai_task_configs (
    step_id     bigint PRIMARY KEY REFERENCES chapter_steps(id) ON DELETE CASCADE,
    ai_type     aiinteractiontype NOT NULL,  -- 复用 v2 中的枚举
    task_desc   text,
    guide_text  text
);

说明:为 AI 任务类型的步骤提供配置信息

2.5 step_assignment_configs(作业配置表 - 新增)

sql
CREATE TABLE step_assignment_configs (
    step_id     bigint PRIMARY KEY REFERENCES chapter_steps(id) ON DELETE CASCADE,
    task_desc   text,
    guide_text  text
);

说明:为作业类型的步骤提供配置信息

2.6 chapter_coursewares(章节课件表 - 新增)

sql
CREATE TABLE chapter_coursewares (
    chapter_id          bigint PRIMARY KEY REFERENCES course_chapters(id) ON DELETE CASCADE,
    file_url            varchar(1024),
    page_count          int,
    learning_task_text  text
);

说明:为课件类型的步骤提供课件信息

2.7 chapter_learning_objectives(章节学习目标表 - 新增)

sql
CREATE TABLE chapter_learning_objectives (
    id          bigserial PRIMARY KEY,
    chapter_id  bigint REFERENCES course_chapters(id) ON DELETE CASCADE,
    content     text,
    sort_order  int DEFAULT 0
);

CREATE INDEX idx_chapter_learning_objectives_chapter_id ON chapter_learning_objectives(chapter_id);

说明:支持章节级的学习目标定义

2.8 chapter_extensions(章节扩展资源表 - 新增)

sql
CREATE TABLE chapter_extensions (
    id              bigserial PRIMARY KEY,
    chapter_id      bigint REFERENCES course_chapters(id) ON DELETE CASCADE,
    extension_type  extensiontype NOT NULL,  -- 复用 v2 中的枚举
    title           varchar(512),
    url             varchar(1024),
    sort_order      int DEFAULT 0
);

CREATE INDEX idx_chapter_extensions_chapter_id ON chapter_extensions(chapter_id);

说明:支持章节级的扩展资源定义


3. 外键关系变更

3.1 移除的外键关系

移除的外键说明
assignmentstask_id → tasks.id作业不再直接关联任务

3.2 新增的外键关系

子表父表外键字段说明
assignment_submissionsusersgraded_by评分教师
assignment_submissionsai_sessionsai_session_idAI 会话关联
step_ai_task_configschapter_stepsstep_idAI 任务配置
step_assignment_configschapter_stepsstep_id作业配置
chapter_coursewarescourse_chapterschapter_id章节课件
chapter_learning_objectivescourse_chapterschapter_id章节学习目标
chapter_extensionscourse_chapterschapter_id章节扩展资源

4. 数据迁移指南

4.1 从 v2 升级到 v3

sql
-- 1. 创建新的枚举类型
CREATE TYPE assignment_status AS ENUM ('draft', 'published', 'in_progress', 'closed', 'archived');
CREATE TYPE grading_status AS ENUM ('not_submitted', 'submitted', 'grading', 'graded');

-- 2. 修改 assignments 表
ALTER TABLE assignments ADD COLUMN name varchar(128) NOT NULL DEFAULT 'Untitled';
ALTER TABLE assignments ADD COLUMN description text;
ALTER TABLE assignments ADD COLUMN guidance text;
ALTER TABLE assignments ADD COLUMN status assignment_status NOT NULL DEFAULT 'draft';

-- 3. 移除 task_id 外键
ALTER TABLE assignments DROP CONSTRAINT assignments_task_id_fkey;
ALTER TABLE assignments DROP COLUMN task_id;

-- 4. 修改 assignment_submissions 表
ALTER TABLE assignment_submissions ADD COLUMN work_name varchar(128);
ALTER TABLE assignment_submissions ADD COLUMN work_description text;
ALTER TABLE assignment_submissions ADD COLUMN feedback_text text;
ALTER TABLE assignment_submissions ADD COLUMN ai_suggestions jsonb;
ALTER TABLE assignment_submissions ADD COLUMN ai_adopted boolean DEFAULT false;
ALTER TABLE assignment_submissions ADD COLUMN grading_status grading_status NOT NULL DEFAULT 'not_submitted';
ALTER TABLE assignment_submissions ADD COLUMN graded_at timestamptz;
ALTER TABLE assignment_submissions ADD COLUMN graded_by integer REFERENCES users(id);
ALTER TABLE assignment_submissions ADD COLUMN ai_session_id integer REFERENCES ai_sessions(id);
ALTER TABLE assignment_submissions ADD COLUMN attachments jsonb;
ALTER TABLE assignment_submissions ADD COLUMN is_public boolean DEFAULT false;

-- 5. 创建新表
-- step_ai_task_configs, step_assignment_configs, chapter_coursewares,
-- chapter_learning_objectives, chapter_extensions

-- 6. 创建索引和约束
CREATE INDEX idx_assignments_status ON assignments(status);
CREATE INDEX idx_assignments_course_class ON assignments(course_id, class_id);
CREATE INDEX idx_assignment_submissions_assignment_id ON assignment_submissions(assignment_id);
CREATE INDEX idx_assignment_submissions_user_id ON assignment_submissions(user_id);
CREATE INDEX idx_assignment_submissions_grading_status ON assignment_submissions(grading_status);
CREATE UNIQUE INDEX uq_assignment_user ON assignment_submissions(assignment_id, user_id);

4.2 Alembic 迁移

bash
# 创建 v3 迁移
alembic revision -m "v3: enhance assignment system and add step configurations"

# 应用迁移
alembic upgrade head

# 回滚迁移(如果需要)
alembic downgrade -1

5. 业务逻辑变更

5.1 作业管理流程

python
# v3 中的作业状态流转
ASSIGNMENT_STATUS_FLOW = {
    'draft': ['published'],           # 草稿 → 发布
    'published': ['in_progress'],     # 发布 → 进行中
    'in_progress': ['closed'],        # 进行中 → 关闭
    'closed': ['archived'],           # 关闭 → 归档
    'archived': []                    # 归档(终态)
}

5.2 评分状态管理

python
# v3 中的评分状态流转
GRADING_STATUS_FLOW = {
    'not_submitted': ['submitted'],   # 未提交 → 已提交
    'submitted': ['grading'],         # 已提交 → 评分中
    'grading': ['graded'],            # 评分中 → 已评分
    'graded': []                      # 已评分(终态)
}

5.3 步骤类型化配置

python
# v3 中根据步骤类型获取配置
def get_step_config(step_id: int, step_type: StepType):
    if step_type == StepType.COURSEWARE:
        return get_chapter_courseware(step_id)
    elif step_type == StepType.AI_TASK:
        return get_step_ai_task_config(step_id)
    elif step_type == StepType.ASSIGNMENT:
        return get_step_assignment_config(step_id)
    else:
        raise ValueError(f"Unknown step type: {step_type}")

6. API 接口变更

6.1 作业相关接口

python
# v3 新增的作业字段
class AssignmentCreate(BaseModel):
    course_id: int
    class_id: int
    name: str
    description: Optional[str] = None
    guidance: Optional[str] = None
    deadline: Optional[datetime] = None

class AssignmentUpdate(BaseModel):
    name: Optional[str] = None
    description: Optional[str] = None
    guidance: Optional[str] = None
    deadline: Optional[datetime] = None
    status: Optional[AssignmentStatus] = None

# v3 新增的作业提交字段
class AssignmentSubmissionCreate(BaseModel):
    assignment_id: int
    work_name: Optional[str] = None
    work_description: Optional[str] = None
    answer_text: Optional[str] = None
    attachments: Optional[Dict] = None
    is_public: bool = False

6.2 评分相关接口

python
# v3 新增的评分接口
class GradingRequest(BaseModel):
    submission_id: int
    score: float
    feedback_text: Optional[str] = None
    ai_adopted: bool = False

class AIGradingRequest(BaseModel):
    submission_id: int
    ai_session_id: int

7. 性能优化

7.1 新增索引

sql
-- 作业状态查询优化
CREATE INDEX idx_assignments_status ON assignments(status);

-- 作业课程班级查询优化
CREATE INDEX idx_assignments_course_class ON assignments(course_id, class_id);

-- 作业提交查询优化
CREATE INDEX idx_assignment_submissions_assignment_id ON assignment_submissions(assignment_id);
CREATE INDEX idx_assignment_submissions_user_id ON assignment_submissions(user_id);
CREATE INDEX idx_assignment_submissions_grading_status ON assignment_submissions(grading_status);

-- 步骤类型查询优化
CREATE INDEX idx_chapter_steps_type ON chapter_steps(step_type);

7.2 查询优化示例

sql
-- v3 中优化后的作业查询
SELECT 
    a.id, a.name, a.status, a.deadline,
    c.name as course_name,
    cl.name as class_name,
    COUNT(asub.id) as submission_count,
    COUNT(CASE WHEN asub.grading_status = 'graded' THEN 1 END) as graded_count
FROM assignments a
JOIN courses c ON a.course_id = c.id
JOIN classes cl ON a.class_id = cl.id
LEFT JOIN assignment_submissions asub ON a.id = asub.assignment_id
WHERE a.status = 'published'
GROUP BY a.id, a.name, a.status, a.deadline, c.name, cl.name
ORDER BY a.deadline;

8. 测试数据示例

8.1 作业状态测试

sql
-- 插入测试作业
INSERT INTO assignments (course_id, class_id, name, description, status) VALUES
(1, 1, '第一次作业', '完成课程第一章的练习题', 'published'),
(1, 1, '第二次作业', '完成课程第二章的实践项目', 'draft');

-- 插入测试作业提交
INSERT INTO assignment_submissions (assignment_id, user_id, work_name, grading_status) VALUES
(1, 1, '张三的作业', 'submitted'),
(1, 2, '李四的作业', 'graded');

8.2 步骤配置测试

sql
-- 插入 AI 任务步骤
INSERT INTO chapter_steps (chapter_id, sort_order, step_type) VALUES (1, 1, 'ai_task');

-- 插入 AI 任务配置
INSERT INTO step_ai_task_configs (step_id, ai_type, task_desc) VALUES
(1, 'text_gen', '使用 AI 生成一篇关于机器人的短文');

9. 总结

v3 版本主要聚焦于作业系统的增强,具体改进包括:

9.1 核心改进

  1. 作业独立性:移除对任务的直接依赖,作业成为独立的教学单元
  2. 状态管理:完整的作业生命周期管理,从草稿到归档
  3. 评分系统:支持 AI 辅助评分,完整的评分状态追踪
  4. 步骤类型化:支持课件、AI 任务、作业三种步骤类型
  5. 章节级资源:支持章节级的学习目标和扩展资源