Database Schema Design

Core User and Course Management

1. Users(用户)

继承自 django.contrib.auth.models.AbstractUser

  • id: CharField,主键,max_length=20,用作学号/工号
  • username: CharField,max_length=150,真实姓名
  • password: 密码字段(继承自AbstractUser)
  • email: EmailField,unique=True
  • role: CharField,用户角色,max_length=20,choices=[('student', 'Student'), ('teacher', 'Teacher')]
  • enroll_time: DateField,入学时间,null=True,blank=True
  • favorites: JSONField,存储用户收藏的帖子id,default=list,blank=True
  • is_favorites_public: BooleanField,收藏夹是否公开,default=False
  • likes: PositiveIntegerField,被点赞数,default=0
  • followers: JSONField,存储关注该用户的用户ID列表,default=list,blank=True
  • following: JSONField,存储该用户关注的用户ID列表,default=list,blank=True
  • created_at: DateTimeField,创建时间,auto_now_add=True
  • updated_at: DateTimeField,更新时间,auto_now=True

2. PasswordResetToken(密码重置令牌)

  • id: 主键,自增,AutoField
  • user: 外键,关联到Users表,on_delete=CASCADE
  • token: CharField,6位数字验证码,max_length=6
  • created_at: DateTimeField,创建时间,auto_now_add=True
  • expires_at: DateTimeField,过期时间

3. Courses(课程)

  • id: CharField,主键,max_length=20
  • semester: CharField,学期,max_length=9,格式YYYY-YYYY(例如2024-1000即为2024上半学期)
  • time: JSONField,上课时间(星期几第几节),格式:{'1': [], '2': [], '3': [], '4': [], '5': [], '6': [], '7': []}
  • name: CharField,课程名称,max_length=100
  • description: TextField,课程描述
  • syllabus: TextField,教学大纲
  • teacher: 外键,关联到Users表,limit_choices_to={'role': 'teacher'},related_name='taught_courses'
  • student_num: PositiveIntegerField,学生数量,default=0,editable=False
  • cover: URLField,课程封面,max_length=255,blank=True
  • created_at: DateTimeField,创建时间,auto_now_add=True
  • updated_at: DateTimeField,更新时间,auto_now=True

4. CourseEnrollments(选课记录)

  • course: 外键,关联到Courses表,on_delete=CASCADE,related_name='enrollments'
  • student: 外键,关联到Users表,on_delete=CASCADE,related_name='enrolled_courses'
  • status: CharField,课程状态,max_length=20,choices=['NOT_STARTED','IN_PROGRESS','COMPLETED','RETAKING'],default='NOT_STARTED'
  • final_grade: FloatField,最终成绩,null=True,blank=True,validators=[MinValueValidator(0), MaxValueValidator(100)]
  • enrolled_at: DateTimeField,选课时间,auto_now_add=True
  • completed_at: DateTimeField,完成时间,null=True,blank=True

5. CourseResources(课程资源)

  • id: AutoField,主键,自增
  • course: 外键,关联到Courses表,on_delete=CASCADE,related_name='resources'
  • name: CharField,资源名称,max_length=255
  • resource_type: CharField,资源类型,max_length=10,choices=['SLIDES','EXAM','EXERCISE','OTHER']
  • file_path: URLField,文件URL,max_length=255,unique=True
  • uploaded_at: DateTimeField,上传时间,auto_now_add=True

Assignment Management

6. Assignments(作业)

  • id: AutoField,主键,自增
  • course: 外键,关联到Courses表,on_delete=CASCADE,related_name='assignments'
  • title: CharField,作业标题,max_length=200
  • description: TextField,作业描述
  • score: PositiveIntegerField,满分分数,validators=[MinValueValidator(1)]
  • due_date: DateTimeField,截止时间
  • is_peer_review_enabled: BooleanField,是否启用互评,default=False
  • peer_review_count: PositiveIntegerField,每个作业分配的互评数量,default=0
  • peer_reviews_assigned: BooleanField,是否已完成互评分配,default=False
  • peer_review_due_date: DateTimeField,互评截止时间,null=True,blank=True
  • created_at: DateTimeField,创建时间,auto_now_add=True
  • updated_at: DateTimeField,更新时间,auto_now=True

7. AssignmentAttachments(作业附件)

  • id: AutoField,主键,自增
  • assignment: 外键,关联到Assignments表,on_delete=CASCADE,related_name='attachments'
  • file_path: URLField,文件路径
  • uploaded_at: DateTimeField,上传时间,auto_now_add=True

8. Submissions(作业提交)

  • id: AutoField,主键,自增
  • assignment: 外键,关联到Assignments表,on_delete=CASCADE,related_name='submissions'
  • student: 外键,关联到Users表,on_delete=CASCADE,related_name='submissions'
  • content: TextField,提交内容,blank=True
  • submitted_at: DateTimeField,提交时间,null=True,blank=True
  • teacher_score: FloatField,教师评分,null=True,blank=True
  • feedback: TextField,反馈,blank=True
  • graded_at: DateTimeField,评分时间,null=True,blank=True
  • status: CharField,状态,max_length=20,choices=['NOT_SUBMITTED','SUBMITTED'],default='NOT_SUBMITTED'

9. SubmissionAttachments(提交附件)

  • id: AutoField,主键,自增
  • submission: 外键,关联到Submissions表,on_delete=CASCADE,related_name='attachments'
  • file_path: URLField,文件路径
  • uploaded_at: DateTimeField,上传时间,auto_now_add=True

10. PeerReviewAssignment(互评分配)

  • id: AutoField,主键,自增
  • reviewer: 外键,关联到Users表,on_delete=CASCADE,related_name='assigned_peer_reviews',互评人
  • submission: 外键,关联到Submission表,on_delete=CASCADE,related_name='peer_reviews',被评作业
  • assignment: 外键,关联到Assignment表,on_delete=CASCADE,对应作业
  • reviewed_at: DateTimeField,互评完成时间,null=True,blank=True

11. PeerReviewScore(互评分数)

  • id: AutoField,主键,自增
  • peer_review_assignment: 外键,关联到PeerReviewAssignment表,on_delete=CASCADE,related_name='scores'
  • score: FloatField,评分,null=True,blank=True
  • feedback: TextField,评语,blank=True

Exam Management

12. Exam(考试)

  • id: AutoField,主键,自增
  • course: 外键,关联到Courses表,related_name='exams'
  • title: CharField,考试标题,max_length=200
  • description: TextField,考试说明
  • exam_date: DateTimeField,考试日期和时间
  • classroom: CharField,考试教室,max_length=100
  • seating_type: JSONField,存储学号数组表示座位安排,default=list
  • status: CharField,考试状态,max_length=20,choices=['NOT_STARTED','IN_PROGRESS','COMPLETED'],default='NOT_STARTED'
  • created_at: DateTimeField,创建时间,auto_now_add=True
  • updated_at: DateTimeField,更新时间,auto_now=True

13. ExamPaper(试卷)

  • id: AutoField,主键,自增
  • exam: 外键,关联到Exam表,related_name='papers'
  • ocr_result: TextField,OCR识别结果,blank=True
  • created_at: DateTimeField,创建时间,auto_now_add=True
  • updated_at: DateTimeField,更新时间,auto_now=True

14. ExamSubmission(试卷提交)

  • id: AutoField,主键,自增
  • exam: 外键,关联到Exam表,related_name='submissions'
  • student: 外键,关联到Users表,related_name='exam_submissions'
  • status: CharField,答卷状态,max_length=20,choices=['NOT_SUBMITTED','SUBMITTED','PROCESSING','GRADING','GRADED'],default='NOT_SUBMITTED'
  • total_score: FloatField,总分,null=True,blank=True,validators=[MinValueValidator(0)]
  • grading_details: JSONField,每道题的得分和评语,default=dict
  • grader: 外键,关联到Users表,limit_choices_to={'role': 'teacher'},null=True,blank=True,related_name='graded_exams'
  • ocr_content: TextField,所有文件扫描结果整合,default='null',blank=True,null=True
  • ai_analysis: JSONField,AI分析结果,default=dict,blank=True
  • ai_status: CharField,AI处理状态,max_length=20,choices=['PENDING','PROCESSING','COMPLETED','FAILED'],default='PENDING'
  • created_at: DateTimeField,创建时间,auto_now_add=True
  • updated_at: DateTimeField,更新时间,auto_now=True

15. ExamSubmissionAttachment(考试提交附件)

  • id: AutoField,主键,自增
  • submission: 外键,关联到ExamSubmission表,related_name='attachments'
  • file_path: URLField,学生试卷扫描件路径
  • ocr_content: TextField,OCR识别文本内容,blank=True,null=True
  • ocr_words_info: JSONField,OCR文字块详细信息,default=dict,blank=True
  • ocr_confidence: FloatField,OCR识别置信度,null=True,blank=True
  • image_angle: IntegerField,图片旋转角度,null=True,blank=True
  • image_height: IntegerField,图片高度,null=True,blank=True
  • image_width: IntegerField,图片宽度,null=True,blank=True
  • ai_analysis: JSONField,AI分析结果,default=dict,blank=True
  • ocr_status: CharField,OCR处理状态,max_length=20,choices=['PENDING','PROCESSING','COMPLETED','FAILED'],default='PENDING'
  • ai_status: CharField,AI处理状态,max_length=20,choices=['PENDING','PROCESSING','COMPLETED','FAILED'],default='PENDING'
  • uploaded_at: DateTimeField,上传时间,auto_now_add=True

16. ExamAttachment(考试附件)

  • id: AutoField,主键,自增
  • exam: 外键,关联到Exam表,related_name='attachments'
  • file_path: URLField,文件路径
  • file_type: CharField,文件类型,max_length=20,choices=['INSTRUCTIONS','RULES','OTHER']
  • uploaded_at: DateTimeField,上传时间,auto_now_add=True

17. AnswerAttachment(答案附件)

  • id: AutoField,主键,自增
  • exam: 外键,关联到Exam表,related_name='answer_attachments'
  • file_path: URLField,答案文件路径
  • file_type: CharField,文件类型,max_length=20,choices=['ANSWER_KEY','SAMPLE_ANSWER','OTHER']
  • uploaded_at: DateTimeField,上传时间,auto_now_add=True

Community Interaction

18. Posts(帖子)

  • id: AutoField,主键,自增
  • course: 外键,关联到Courses表,on_delete=CASCADE
  • user: 外键,关联到Users表,on_delete=CASCADE
  • content: TextField,帖子内容(html)
  • mentioned_users: JSONField,存储被@的用户ID列表,default=list,blank=True
  • topic: CharField,存储话题单个关键词,max_length=50,blank=True
  • likes_count: PositiveIntegerField,点赞数量,default=0
  • created_at: DateTimeField,创建时间,auto_now_add=True
  • updated_at: DateTimeField,更新时间,auto_now=True

19. Comments(评论)

  • id: AutoField,主键,自增
  • post: 外键,关联到Posts表,on_delete=CASCADE,related_name='comments'
  • user: 外键,关联到Users表,on_delete=CASCADE
  • content: TextField,评论内容
  • mentioned_users: JSONField,存储被@的用户ID列表,default=list,blank=True
  • likes_count: PositiveIntegerField,点赞数量,default=0
  • created_at: DateTimeField,创建时间,auto_now_add=True
  • updated_at: DateTimeField,更新时间,auto_now=True

20. Notes(笔记)

  • id: AutoField,主键,自增
  • user: 外键,关联到Users表,on_delete=CASCADE,related_name='notes'
  • content: TextField,笔记内容(html)
  • topic: CharField,存储单个话题关键词,max_length=50,blank=True
  • is_public: BooleanField,是否公开,default=False
  • created_at: DateTimeField,创建时间,auto_now_add=True
  • updated_at: DateTimeField,更新时间,auto_now=True

21. Notifications(通知)

  • id: AutoField,主键,自增
  • user: 外键,关联到Users表,on_delete=CASCADE
  • content: TextField,通知内容
  • type: CharField,通知类型,max_length=20,choices=['system','course','mention','like','comment_reply']
  • is_read: BooleanField,是否已读,default=False
  • created_at: DateTimeField,创建时间,auto_now_add=True

AI Features

22. AIPromptTemplate(AI分析提示词模板)

  • id: AutoField,主键,自增
  • title: CharField,模板标题,max_length=100
  • content: TextField,提示词内容
  • created_by: 外键,关联到Users表,limit_choices_to={'role': 'teacher'}
  • is_default: BooleanField,是否为默认模板,default=False
  • created_at: DateTimeField,创建时间,auto_now_add=True
  • updated_at: DateTimeField,更新时间,auto_now=True

23. Workspace(工作区)

  • id: AutoField,主键,自增
  • course: OneToOneField,关联到Courses表,unique=True,related_name='workspace'
  • teacher: 外键,关联到Users表,limit_choices_to={'role': 'teacher'},related_name='workspaces'
  • name: CharField,工作区显示名称,max_length=255
  • slug: CharField,AnythingLLM工作区标识符,unique=True,max_length=255
  • openai_temp: FloatField,OpenAI温度参数,null=True,blank=True
  • openai_history: IntegerField,历史消息数量,null=True,blank=True
  • openai_prompt: TextField,系统提示词,null=True,blank=True
  • created_at: DateTimeField,创建时间,auto_now_add=True
  • updated_at: DateTimeField,更新时间,auto_now=True

24. Document(文档)

  • id: AutoField,主键,自增
  • workspace: 外键,关联到Workspace表,related_name='documents'
  • uploader: 外键,关联到Users表,limit_choices_to={'role': 'teacher'},null=True,related_name='uploaded_documents'
  • filename: CharField,显示的文件名,max_length=255
  • file_path: CharField,AnythingLLM中的文件路径,max_length=500
  • embedding_status: CharField,嵌入状态,max_length=20,choices=['processing','completed','failed'],default='processing'
  • error_message: TextField,当嵌入失败时的错误信息,null=True,blank=True
  • created_at: DateTimeField,创建时间,auto_now_add=True

25. ChatThread(对话线程)

  • id: AutoField,主键,自增
  • workspace: 外键,关联到Workspace表,related_name='chat_threads'
  • user: 外键,关联到Users表,related_name='chat_threads'
  • thread_slug: CharField,AnythingLLM的对话线程标识符,max_length=255
  • name: CharField,对话线程显示名称,max_length=255
  • is_active: BooleanField,是否被删除,default=True
  • created_at: DateTimeField,创建时间,auto_now_add=True
  • last_used_at: DateTimeField,最后一次使用时间,auto_now=True

Meta Information

排序规则 (ordering)

  • AIPromptTemplate: ['-created_at']
  • ChatThread: ['-last_used_at']
  • Comments: ['created_at']
  • CourseResource: ['-uploaded_at']
  • Document: ['-created_at']
  • ExamSubmission: ['-created_at']
  • Notes: ['-updated_at']
  • Notifications: ['-created_at']
  • PeerReviewAssignment: ['-reviewed_at']
  • Posts: ['-created_at']
  • Submission: ['-submitted_at']
  • Workspace: ['-created_at']

索引定义 (indexes)

Posts:

  • models.Index(fields=['topic'])
  • models.Index(fields=['course', 'created_at'])

Comments:

  • models.Index(fields=['post', 'created_at'])

Notes:

  • models.Index(fields=['topic'])
  • models.Index(fields=['user', 'is_public'])

Notifications:

  • models.Index(fields=['user', 'is_read'])