OJ在线评测系统 后端开发数据库初始化工作 开发库表 建立数据库索引 Mybatis映射初始化接口开发
后端接口开发库表设计
项目主业务流程的开发
1.用户模块
注册(后端已实现)
登录(后端已实现 前端已实现)
2.题目模块
创建题目(管理员)
删除题目(管理员)
修改题目(管理员)
搜索题目(用户)
在线做题(题目详细页)
3.判题模块
提交判题(结果是否正确与错误)
错误处理(内存溢出 安全性 超时)
自主实现 代码沙箱(安全沙箱)
开放接口(提供一个独立的新服务)
创建索引
题目表
题目标题
题目内容 存放题目的介绍 输入输出提示 描述 具体的情况
题目标签(json数组字符串) 栈 队列 链表 简单 中等 困难
题目答案 管理员或者是用户设置的标准答案
提交数 通过题目的人数 便于分析统计
如果说题目不是很复杂 用例文件不大的话 可以直接存在数据库表里面
但是如果用例文件比较大 大于512kb的话
建议单独存放在一个文件中 数据库中只保存文件url
输入用例 1,2
输出用例3 4
时间限制
内存限制
我们这边选择的是一个judegConfig判题配置(json对象)
时间限制
内存限制
judgeCase判题用例(json数组)
每一个元素是 一个输入用例对应一个输出用例
数组中每一个元素 一个输入用例对应一个输出用例
json对象便于扩展
只需要改变对象内部的字段
而不用修改数据库表 可能会影响数据库
{
"timeLimit":1000,
"stackLimit":1000
}
[
{
"input":"1 2",
"output":"3 4"
},
{
"input":"1 3",
"output":"2 4"
}
]
存json的前提
你不需要根据某个字段去倒查某条数据
你的字段含义相关 属于同一类的数值
你的字段存储空间占比不能太大
judgeCase text null comment '判题用例(json数组)',
judgeConfig text null comment '判题配置(json数组)',
全部代码
-- 帖子表
create table if not exists question
(
id bigint auto_increment comment 'id' primary key,
title varchar(512) null comment '标题',
content text null comment '内容',
tags varchar(1024) null comment '标签列表(json 数组)',
answer text null comment '题目答案',
submitNum int default 0 not null comment '题目提交数',
acceptedNum int default 0 not null comment '题目通过数',
judgeCase text null comment '判题用例(json数组)',
judgeConfig text null comment '判题配置(json数组)',
thumbNum int default 0 not null comment '点赞数',
favourNum int default 0 not null comment '收藏数',
userId bigint not null comment '创建用户 id',
createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间',
updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
isDelete tinyint default 0 not null comment '是否删除',
index idx_userId (userId)
) comment '题目' collate = utf8mb4_unicode_ci;
题目提交表
提交用户id: userId
题目id: questionId
语言: language
用户的代码: code
判题状态: status (待判题 判题中 成功 失败)
判题信息 判题过程中得到的一些信息 比如说程序失败的原因 程序执行消耗的时间 空间
judgeInfo(json对象)
{
"message": "程序执行信息",
"time": 1000,
"memory": 1000,
}
判题信息枚举值
Accepted
Wrong Answer
Compile Error
Memory Limit Exceeded
Time Limit Exceeded
Presentation Error
Output Limit Exceeded
Waiting
Dangerous Operation
Runtime error
System error
-- 题目提交表(硬删除)
create table if not exists question_submit
(
id bigint auto_increment comment 'id' primary key,
language varchar(128) not null comment '编程语言',
code text not null comment '用户代码',
judgeInfo text not null comment '判题信息(json对象)',
status int default 0 comment '判题状态 0判题中 1成功 2成功 3失败',
questionId bigint not null comment '题目id',
userId bigint not null comment '创建用户 id',
createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间',
updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
index idx_questionId (questionId),
index idx_userId (userId)
) comment '题目提交表';
后端开发数据库索引
我们建立索引
最先考虑的是我们最多情况下是根据什么来查询表
就是放在where条件里面的东西
索引尽量加到区分度多的地方
什么情况下适合加索引呢
如何选择给哪个字段加索引?
答:首先从业务出发 无论是单个索引 还是联合索引
都要从实际查询的语句 字段枚举值的区分度 类型考虑(where指定的字段)
比如说where userId =1 and questionId=2
可以选择根据 userId 和 questionId 分部建立索引 也可以选择给这两个字段建立联合索引
如果这两个字段出现在一起 那么建立联合索引
原则上能不用索引就不用索引
能用单个索引就用单个索引
索引也要占用空间
类似于叫做目录
后端接口的开发 初步
第一步根据功能设计库表
第二步自动生成对数据库基本的增删改查(mapper和service层的基本功能)
第三步编写Controller层 实现基本增删改查和权限校验
第四步根据业务定制开发新的功能和代码
我们要安装一个mybatis x的插件