Appearance
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字段,作业不再直接关联任务 - 新增
name、description、guidance字段,增强作业描述能力 - 新增
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_name、work_description字段,支持作业作品描述 - 新增
feedback_text字段,支持教师反馈 - 新增
ai_suggestions字段,存储 AI 评分建议 - 新增
ai_adopted字段,标记是否采用 AI 建议 - 新增
grading_status字段,支持评分状态管理 - 新增
graded_at、graded_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 移除的外键关系
| 表 | 移除的外键 | 说明 |
|---|---|---|
| assignments | task_id → tasks.id | 作业不再直接关联任务 |
3.2 新增的外键关系
| 子表 | 父表 | 外键字段 | 说明 |
|---|---|---|---|
| assignment_submissions | users | graded_by | 评分教师 |
| assignment_submissions | ai_sessions | ai_session_id | AI 会话关联 |
| step_ai_task_configs | chapter_steps | step_id | AI 任务配置 |
| step_assignment_configs | chapter_steps | step_id | 作业配置 |
| chapter_coursewares | course_chapters | chapter_id | 章节课件 |
| chapter_learning_objectives | course_chapters | chapter_id | 章节学习目标 |
| chapter_extensions | course_chapters | chapter_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 -15. 业务逻辑变更
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 = False6.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: int7. 性能优化
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 核心改进
- 作业独立性:移除对任务的直接依赖,作业成为独立的教学单元
- 状态管理:完整的作业生命周期管理,从草稿到归档
- 评分系统:支持 AI 辅助评分,完整的评分状态追踪
- 步骤类型化:支持课件、AI 任务、作业三种步骤类型
- 章节级资源:支持章节级的学习目标和扩展资源