一、工作进度汇报本周主要完成后端数据模型的设计工作数据模型定义了数据库表结构是整个后端系统的核心所有的业务数据都存储在这些表中。在模型设计方面我们完成了5个核心数据模型的设计。TeacherScore模型是教师评分表存储教师对项目的评分记录包含5个评分维度和评语字段。Submission模型是项目提交表存储学生提交的项目信息包含基本信息、文件信息、状态等字段。Repository模型是项目仓库表存储Git仓库信息包含仓库URL、类型、状态等字段。CodeAnalysis模型是代码分析表存储代码分析结果包含代码行数、语言分布、质量指标等字段。Course模型是课程表存储课程信息包含课程名称、描述等字段。每个模型都包含了完整的字段定义、关系映射、时间戳处理等功能。模型之间建立了清晰的关系映射使用SQLAlchemy的relationship实现关联查询。本周共设计5张数据表约50个数据库字段定义了8个表关系。每个模型都包含创建时间、更新时间等审计字段便于后续的问题排查和数据追溯。二、项目处理思路数据模型之间的关系设计是数据库设计的核心。在本项目中我们设计了以下关系用户User和项目提交Submission是一对多关系一个用户可以提交多个项目但一个项目只属于一个用户。教师评分TeacherScore和项目提交Submission是一对多关系一个项目可以被多个教师评分但每个评分记录只属于一个项目。教师评分TeacherScore和用户User是一对多关系一个教师可以给多个项目评分但每个评分记录只属于一个教师。项目提交Submission和仓库Repository是一对一关系一个项目对应一个Git仓库。这种关系设计既保证了数据的完整性又避免了数据冗余。使用外键约束可以确保引用的数据存在避免出现孤立记录。使用Cascade可以自动处理关联数据的级联操作。字段类型的选择需要考虑数据的特性和存储效率。整数类型Integer用于ID、主键等数值查询效率最高是最常用的字段类型。字符串类型String用于短文本如名称、邮箱等占用空间适中。文本类型Text用于长文本如项目描述可以存储大量内容。枚举类型Enum用于有限状态如项目状态类型安全且便于扩展。时间类型DateTime用于时间戳自动记录创建和更新时间。JSON类型JSON用于动态数据如扩展信息可以存储不固定结构的字段。这种字段类型选择既满足了数据存储需求又优化了存储空间。选择合适的字段类型可以提高查询性能减少存储空间。外键是保证数据完整性的重要手段。在本项目中所有需要关联的表都使用了外键。外键可以确保引用的数据存在避免出现孤立记录。外键配合Cascade可以自动处理关联数据的级联操作例如删除项目时自动删除相关的评分记录。这种外键设计既保证了数据完整性又简化了业务代码。不需要在业务逻辑中手动检查关联数据是否存在数据库会自动处理。三、框架搭建思路数据库相关的文件放在了models目录下每个模型一个文件方便管理和维护。db目录存放数据库连接和初始化配置。技术选型方面SQLAlchemy选择了因为它是Python最流行的ORM框架提供了强大的数据库操作能力支持多种数据库包括MySQL、PostgreSQL、SQLite等主流数据库。MySQL选择了因为它是最流行的开源关系型数据库性能稳定可靠文档丰富。四、关键代码思路4.1 模型定义每个模型都继承自Base基类使用SQLAlchemy的ORM方式定义。classTeacherScore(Base):__tablename__teacher_scoresidColumn(Integer,primary_keyTrue,indexTrue)submission_idColumn(Integer,ForeignKey(submissions.id),nullableFalse)teacher_idColumn(Integer,ForeignKey(users.id),nullableFalse)# 评分项innovationColumn(Integer,nullableFalse,default0)completenessColumn(Integer,nullableFalse,default0)feasibilityColumn(Integer,nullableFalse,default0)code_qualityColumn(Integer,nullableFalse,default0)documentationColumn(Integer,nullableFalse,default0)# 计算字段total_scoreColumn(Float,nullableFalse,default0)# 评语feedbackColumn(Text,default)# 时间戳created_atColumn(DateTime,server_defaultfunc.now())updated_atColumn(DateTime,server_defaultfunc.now(),onupdatefunc.now())# 关系submissionrelationship(Submission,back_populatesscores)teacherrelationship(User,back_populatesscores_given)字段定义使用Column类第一个参数是数据类型可选参数包括是否为主键primary_key、是否允许为空nullable、是否有索引index等。关系映射使用relationship类定义与其他模型的关系。4.2 总分计算总分计算放在了模型的方法中而不是在业务代码中计算。defcalculate_total(self):weights{innovation:0.25,completeness:0.25,feasibility:0.20,code_quality:0.15,documentation:0.15}self.total_score(self.innovation*weights[innovation]self.completeness*weights[completeness]self.feasibility*weights[feasibility]self.code_quality*weights[code_quality]self.documentation*weights[documentation])returnself.total_score这种设计的优势是业务逻辑封装在模型中复用方便也便于测试。当需要计算总分时只需要调用模型的方法即可不需要在业务代码中重复编写计算逻辑。五、代码设计优点外键约束的优势外键约束可以保证数据的完整性。当插入数据时如果引用的ID不存在会报错阻止无效数据的插入。当删除主记录时可以配置级联删除相关的从记录自动清理数据。这种约束比业务代码实现更可靠。自动时间戳的优势使用数据库的server_default和onupdate实现时间戳比业务代码更准确。业务代码可能因为时区、网络延迟等原因导致时间不准确数据库自动管理更可靠。时间戳对于问题排查和数据追溯非常重要。关系映射的优势使用SQLAlchemy的关系映射可以方便地通过对象获取关联数据。例如score.submission可以获取评分对应的项目score.teacher可以获取评分对应的教师。这种设计让代码更简洁不需要手动写JOIN查询。六、遇到的问题与解决关系复杂问题问题描述是表之间关系复杂难以理解。解决方案是绘制ER图辅助设计明确每个关系的作用。复杂的关系会增加维护成本需要在设计阶段充分考虑。字段过多问题问题描述是某些表字段过多难以维护解决方案是使用JSON类型存储扩展字段减少固定字段数量。JSON类型可以存储不固定结构的数据灵活性高。七、后续优化方向后续优化主要考虑以下几个方面索引优化为常用查询字段添加索引可以大幅提升查询性能。分表策略当数据量大时考虑分表减少单表数据量。缓存模型使用Redis缓存热点数据减少数据库压力。八、本周总结本周完成了数据模型的设计工作。通过这个项目我深入学习了数据库设计的基本原则掌握了SQLAlchemy ORM的使用方法学会了表关系的设计思路。整个设计过程让我认识到数据库设计是后端开发的核心技能。关系型数据库仍然是最常用的数据存储方式良好的表结构设计可以让后续的开发更加高效。这些经验对后续的开发工作很有帮助也是区分初级工程师和中高级工程师的重要标志。