CodeQ 项目数据库设计
一、项目背景
CodeQ 是一个代码大模型训练语料质量评估平台,旨在通过指标提取与大模型分析相结合的方式,为用户提供可解释、可对比的代码质量报告。平台支持多仓库对比、质量趋势追踪,是大模型时代下代码质量管理的重要工具。
本文将详细介绍 CodeQ 平台的数据库设计方案,包括表结构设计、字段说明、关系映射以及设计思路。
二、数据库设计概述
2.1 数据库选型
- 数据库系统:MySQL 8.0
- 字符集:utf8mb4,支持完整的 Unicode 字符(包括 emoji)
- 排序规则:utf8mb4_unicode_ci,支持多语言排序
2.2 数据库名称
codeq_db2.3 设计原则
- 模块化设计:按业务功能划分数据表,降低耦合度
- 可扩展性:预留 JSON 扩展字段,支持指标动态扩展
- 可追溯性:记录操作日志,便于审计和调试
- 规范化:遵循数据库三范式,减少数据冗余
三、核心表结构设计
3.1 用户表(user)
用户表是平台的基础,存储所有注册用户的信息。
CREATETABLEuser(idBIGINTPRIMARYKEYAUTO_INCREMENTCOMMENT'用户唯一ID',usernameVARCHAR(50)NOTNULLUNIQUECOMMENT'用户名(唯一)',passwordVARCHAR(100)NOTNULLCOMMENT'加密后的用户密码',emailVARCHAR(100)COMMENT'用户邮箱',roleVARCHAR(20)DEFAULT'user'COMMENT'用户角色:user / admin',created_atDATETIMEDEFAULTCURRENT_TIMESTAMPCOMMENT'用户创建时间')COMMENT='用户信息表';设计要点:
id使用 BIGINT 类型,支持大规模用户username唯一索引,保证用户名不重复password存储加密后的密码,不存储明文role支持权限分级,默认为普通用户
3.2 仓库信息表(repository)
记录用户提交的代码仓库信息。
CREATETABLErepository(idBIGINTPRIMARYKEYAUTO_INCREMENTCOMMENT'仓库ID',user_idBIGINTNOTNULLCOMMENT'所属用户ID',repo_nameVARCHAR(200)COMMENT'仓库名称',repo_urlVARCHAR(300)NOTNULLCOMMENT'仓库URL地址',languageVARCHAR(50)COMMENT'主要编程语言',fork_countINTDEFAULT0COMMENT'Fork 数量',star_countINTDEFAULT0COMMENT'Star 数量',created_atDATETIMEDEFAULTCURRENT_TIMESTAMPCOMMENT'仓库记录创建时间',FOREIGNKEY(user_id)REFERENCESuser(id))COMMENT='代码仓库信息表';设计要点:
- 外键关联
user_id,建立用户与仓库的归属关系 - 存储
fork_count和star_count,便于评估仓库影响力 language字段用于标识主要编程语言,支持多语言筛选
3.3 分析任务表(analysis_task)
核心表之一,记录每一次代码分析任务的执行情况。
CREATETABLEanalysis_task(idBIGINTPRIMARYKEYAUTO_INCREMENTCOMMENT'分析任务ID',repo_idBIGINTNOTNULLCOMMENT'关联的仓库ID',commit_hashVARCHAR(100)COMMENT'分析对应的提交版本',statusVARCHAR(20)COMMENT'任务状态:PENDING / RUNNING / SUCCESS / FAILED',total_filesINTCOMMENT'分析的文件总数',total_linesINTCOMMENT'分析的总代码行数',start_timeDATETIMECOMMENT'任务开始时间',end_timeDATETIMECOMMENT'任务结束时间',created_atDATETIMEDEFAULTCURRENT_TIMESTAMPCOMMENT'任务创建时间',FOREIGNKEY(repo_id)REFERENCESrepository(id))COMMENT='代码分析任务表';设计要点:
status字段追踪任务生命周期(待处理→执行中→成功→失败)commit_hash记录具体分析的代码版本,支持版本追溯- 时间字段记录任务耗时,便于性能监控
3.4 仓库级质量指标结果表(metric_result)
存储仓库级别的汇总质量指标,是质量评估的核心数据来源。
CREATETABLEmetric_result(idBIGINTPRIMARYKEYAUTO_INCREMENTCOMMENT'指标结果ID',task_idBIGINTNOTNULLCOMMENT'关联的分析任务ID',-- 基础统计指标code_linesINTCOMMENT'有效代码行数',comment_linesINTCOMMENT'注释行数',blank_linesINTCOMMENT'空行数',comment_densityDOUBLECOMMENT'注释密度(注释行 / 总行数)',-- 复杂度指标avg_cyclomatic_complexityDOUBLECOMMENT'平均圈复杂度',high_complexity_func_countINTCOMMENT'高复杂度函数数量',-- 可维护性指标duplication_rateDOUBLECOMMENT'代码重复率',naming_violation_countINTCOMMENT'命名规范违规数量',-- 健壮性指标static_warning_countINTCOMMENT'静态分析警告数量',-- 综合评分quality_scoreDOUBLECOMMENT'综合质量评分(0~100)',created_atDATETIMEDEFAULTCURRENT_TIMESTAMPCOMMENT'指标生成时间',FOREIGNKEY(task_id)REFERENCESanalysis_task(id))COMMENT='仓库级代码质量指标表';设计要点:
- 指标维度覆盖:基础统计、复杂度、可维护性、健壮性四大类
quality_score是综合评分的归一化结果,便于直观比较- 总计实现10+ 项核心指标,满足任务书要求(≥8项)
3.5 文件级指标表(file_metric)
细粒度到文件级别的指标,用于定位具体问题文件。
CREATETABLEfile_metric(idBIGINTPRIMARYKEYAUTO_INCREMENTCOMMENT'文件指标ID',task_idBIGINTNOTNULLCOMMENT'关联的分析任务ID',file_pathVARCHAR(500)COMMENT'文件相对路径',code_linesINTCOMMENT'文件代码行数',comment_densityDOUBLECOMMENT'文件注释密度',cyclomatic_complexityDOUBLECOMMENT'文件平均圈复杂度',warning_countINTCOMMENT'静态分析警告数',created_atDATETIMEDEFAULTCURRENT_TIMESTAMPCOMMENT'记录生成时间',FOREIGNKEY(task_id)REFERENCESanalysis_task(id))COMMENT='文件级代码质量指标表';设计要点:
- 支持问题定位到具体文件
file_path存储相对路径,便于跨平台处理- 为前端提供文件级别的热力图数据
3.6 质量分析报告表(quality_report)
存储大模型生成的自然语言报告。
CREATETABLEquality_report(idBIGINTPRIMARYKEYAUTO_INCREMENTCOMMENT'报告ID',task_idBIGINTNOTNULLCOMMENT'关联的分析任务ID',model_nameVARCHAR(50)COMMENT'使用的大模型名称',summaryTEXTCOMMENT'整体质量总结',advantagesTEXTCOMMENT'代码优点分析',problemsTEXTCOMMENT'主要问题说明',suggestionsTEXTCOMMENT'改进建议',created_atDATETIMEDEFAULTCURRENT_TIMESTAMPCOMMENT'报告生成时间',FOREIGNKEY(task_id)REFERENCESanalysis_task(id))COMMENT='代码质量分析报告表';设计要点:
- 使用 TEXT 类型存储长文本报告
- 结构化存储:总结、优点、问题、建议四部分
model_name记录使用的大模型,便于 A/B 测试
3.7 指标明细 JSON 表(metric_detail_json)
扩展指标存储表,使用 JSON 格式灵活存储额外指标。
CREATETABLEmetric_detail_json(idBIGINTPRIMARYKEYAUTO_INCREMENTCOMMENT'JSON指标ID',task_idBIGINTNOTNULLCOMMENT'关联的分析任务ID',metric_json JSONCOMMENT'指标明细(JSON 格式)',created_atDATETIMEDEFAULTCURRENT_TIMESTAMPCOMMENT'记录时间',FOREIGNKEY(task_id)REFERENCESanalysis_task(id))COMMENT='扩展指标JSON表';设计要点:
- 使用 MySQL 8.0 的 JSON 原生类型
- 支持动态扩展指标,无需修改表结构
- 示例 JSON 结构:
{"function_length":{"avg":15.3,"max":45},"depth":{"max_nesting":5},"unused_variables":3,"potential_bugs":2}3.8 用户操作日志表(operation_log)
记录关键操作,用于审计和调试。
CREATETABLEoperation_log(idBIGINTPRIMARYKEYAUTO_INCREMENTCOMMENT'日志ID',user_idBIGINTCOMMENT'操作用户ID',actionVARCHAR(100)COMMENT'操作类型',detailVARCHAR(500)COMMENT'操作详情',created_atDATETIMEDEFAULTCURRENT_TIMESTAMPCOMMENT'操作时间')COMMENT='用户操作日志表';四、ER图
五、设计亮点总结
5.1 指标维度完整
设计实现了任务书要求的全部指标类别:
| 指标类别 | 具体指标 | 数量 |
|---|---|---|
| 基础统计 | 代码行数、注释行数、空行数、注释密度 | 4 |
| 复杂度 | 平均圈复杂度、高复杂度函数数 | 2 |
| 可维护性 | 代码重复率、命名规范违规数 | 2 |
| 健壮性 | 静态分析警告数 | 1 |
| 综合评分 | 质量评分 | 1 |
| 合计 | 10 |
5.2 支持多粒度分析
- 仓库级:metric_result 表提供整体质量评分
- 文件级:file_metric 表定位具体问题文件
- 扩展级:metric_detail_json 支持函数级指标
5.3 可扩展性强
- JSON 字段支持动态指标扩展
- 模块化表设计,便于功能迭代
- 预留多仓库对比的数据结构
5.4 可追溯性
- operation_log 记录关键操作
- analysis_task 记录完整的分析过程
- commit_hash 支持版本追溯
六、后续优化方向
- 索引优化:根据查询频率添加联合索引
- 分区策略:对日志表按时间分区
- 缓存设计:引入 Redis 缓存热点数据