数据库EER图

数据库表、字段、约束解释

users 用户:

id 标识符,email 邮箱,password 密码,name 姓名,sex 性别,enabled 启用 ,role 角色

id primary key

advisors 指导:

id 标识符,uid_user 被指导者,uid_admin 指导者

id primary key

uid_user -> user(id),uid_admin(id)

categories 类别:

id 标识符,name 名称,description 描述

id primary key

questions 问题:

id 标识符,qid 题号,description 描述,cid 类别标识符,name 名称

id primary key

cid -> categories(id)

test_data 测试数据:

id 标识符,qid 题号,input 一组输入,output 一组输出

id primary key

qid -> questions(id)

tests 测试信息:

id 标识符,uid 用户标识符,qid 题号,submit_time 提交时间,code 代码,correct_rate 正确率

id primary key

uid -> users(id),qid -> questions(id)

scores 成绩:

id 标识符,uid 用户标识符,cid 类别标识符,usual_score 平时成绩

复杂SQL语句

selectSumScoreAndRank:

功能:根据用户 ID,查询用户 ID、用户所有题目总成绩、总成绩的排名。

实现:主要是利用了聚集函数,MySQL 自带 @rowNum 属性。

代码:

       SELECT *
FROM
(SELECT
uid,
sum_correct_rate,
(@rowNum := @rowNum + 1) AS rank
FROM (SELECT
uid,
sum(max_corrcet_rate) AS sum_correct_rate
FROM
(SELECT
uid,
qid,
max(correct_rate) AS max_corrcet_rate
FROM tests
GROUP BY uid, qid) AS max_tests
GROUP BY uid
ORDER BY sum_correct_rate DESC) AS rank_tests, (SELECT (@rowNum := 0)) AS rank) AS all_tests
WHERE uid = #{uid}

selectPracticeAndUsualScoreFromAdmin:

功能:根据管理员 ID 和类别 ID,查询特定管理员的指导关系下用户的实践成绩和平时成绩。

实现:首先根据指导关系下的用户 ID 和特定题库 ID 选出特定题目,再根据特定题目选出特定测试,最后利用聚集函数进行成绩整合(例如,聚集函数 sum 计算特定用户特定题库下的总分)。

代码:

        SELECT
scores.id,
scores.uid,
users.email,
users.name AS userName,
sum_tests.avg_correct_rate * 100 AS practice_score,
scores.usual_score
FROM
(SELECT
uid,
avg(max_corrcet_rate) AS avg_correct_rate
FROM
(SELECT
uid,
qid,
max(correct_rate) AS max_corrcet_rate
FROM (SELECT
uid,
qid,
correct_rate
FROM tests
WHERE
uid IN (SELECT uid_user
FROM advisors
WHERE uid_admin = #{uidAdmin}) AND qid IN (SELECT questions.id
FROM categories
LEFT JOIN questions
ON categories.id = questions.cid
WHERE cid = #{cid})
) AS filter_tests
GROUP BY uid, qid) AS max_tests
GROUP BY uid) AS sum_tests LEFT JOIN scores ON sum_tests.uid = scores.uid AND scores.cid = #{cid} LEFT JOIN users ON sum_tests.uid = users.id

设计思想

1、为什么要每张表都有 ID,并且把 ID 作为主键?

表的主键不应该可以变动的,而现实中的需求会变动。起初,表 questions 是没有列 cid 的,后来为了模拟现实中题目(questions)的类别(categories), 增加了 cid 列。

假设有一种情况:

类别名(categories name)为 Java,题号(qid)为 1,2,3;类别为 C#,题号为1,2,3。

如果表 questions 以 qid 作为主键,上述的情况是无法实现的,因为primary key 违反了唯一性约束,需要重新设计架构;如果表 questions 以无意义的 id 作为主键,上述情况实现很简单,不需要变动架构。

所以,表的主键最好是无意义的id。

 

2、表 questions 和表 test_data 的设计

表 questions 起初和 test_data 是放在一起的,即 input 和 output 起初是在表 questions 中的,并且每条记录表示的多组输入和多组输出。后来我剥离了,并且将每条记录由多组输入和多组输出变为一组输入和一组输出,原因如下:

① 多组的输入或者多组的输出不方便保存。如果合并为一组保存,必须以一个符号作为分隔符,然而在 OJ 系统,任何符号的输入都是有可能的,分隔符无法选择

② 如果采用多组保存,冗余性较高,qid、name等多保存了很多次。

所以,我采取弱关联(将多值属性剥离,新建一个表存入,新表高度依赖于原来的表)来保存。

Online Judge(OJ)搭建——2、数据库,SQL语句的更多相关文章

  1. 学生选课数据库SQL语句45道练习题整理及mysql常用函数(20161019)

    学生选课数据库SQL语句45道练习题: 一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四 ...

  2. MySQL 数据库SQL语句——高阶版本2

    MySQL 数据库SQL语句--高阶版本2 实验准备 数据库表配置: mysql -uroot -p show databases; create database train_ticket; use ...

  3. MySQL 数据库SQL语句——高阶版本1

    MySQL 数据库SQL语句--高阶版本 实验准备,数据表配置 mysql -uroot -p show databases; create database train_ticket; use tr ...

  4. SQL Server数据库sql语句生成器(SqlDataToScript)的使用(sql server自增列(id)插入固定值)

    SqlDataToScript是根据表数据进行生成 Insert Into语句,此工具还有一个好处是可以对自增列插入固定值,例如:自增的列id值为5,但是5这个行值已经删除,如果想存储Id自增列值为5 ...

  5. ORACLE数据库SQL语句的执行过程

    SQL语句在数据库中处理过程是怎样的呢?执行顺序呢?在回答这个问题前,我们先来回顾一下:在ORACLE数据库系统架构下,SQL语句由用户进程产生,然后传到相对应的服务端进程,之后由服务器进程执行该SQ ...

  6. 数据库SQL语句练习题

    一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...

  7. mySQL数据库Sql语句执行效率检查--Explain命令

    mysql性能的检查和调优方法 Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的 ...

  8. 数据库—SQL语句

    下列语句部分是Mssql语句,不可以在access中使用. SQL分类:   DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)   DML—数据操纵语言(SELECT,DEL ...

  9. 学生选课系统数据库SQL语句考试题

    一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...

  10. 数据库 数据库SQL语句五

    集合运算 union 并集(两个集合如果有重复部分,那么只显示一次重复部分) union all 并集(两个集合如果有重复部分,那么重复部分显示两次) intersect 交集 minus 差集 -- ...

随机推荐

  1. axios + mock.js模拟数据实现前后端分离开发的实例代码

    首先就是必须安装axios和mock.js npm install axios npm install mockjs 1. 然后在文档src中新建一个mock.js文件,如图 2. 在main.js中 ...

  2. 3.数码相框-通过freetype库实现矢量显示

    本章主要内容如下: 1)矢量字体原理 2)使用freetype库实现矢量字体显示 1. 矢量字体原理 将汉字的笔划边缘用直线段描述成封闭的曲线,并将线段各端点的坐标经压缩存储,如下图所示: 由于每个汉 ...

  3. HDU - 1407 打表

    思路:预处理10000以内所有数的三平方和即可. AC代码 #include <cstdio> #include <cmath> #include <algorithm& ...

  4. 关于instrinsicContentSize, ContentHuggingPriority, ContentcompressionResistancePriority的理解

    ios 关于intrinsic理解 最近由于项目的需要想给MBProgressHUD添加一个自定义的view, 结果花费了一两个小时也没添加上去,添加上去的view没有实际的大小,即使你给他设置了一个 ...

  5. 左连接条件与where条件的区别

    Sql 查询语句应用左连接时的链接条件中经常加一些常量值在里面如: "On a.id= b.id and b.is_del =0 and b.is_old =1" 这种条件如果加在 ...

  6. mysql数据库 调优

    mysql调优硬件配置网络带宽mysql运行参数慢查询日志网络架构多实例(一台服务器上运行多个数据库服务)分库分表 当一台数据库服务器处理客户端的请求慢时,可能是哪些原因造成? 硬件配置低:(内存 c ...

  7. 常用校验码(奇偶校验,海明校验,CRC)学习总结

    常用校验码(奇偶校验,海明校验,CRC)学习总结 一.为什么要有校验码? 因为在数据存取和传送的过程中,由于元器件或者噪音的干扰等原因会出现错误,这个时候我们就需要采取相应的措施,发现并纠正错误,对于 ...

  8. vue项目中对axios的二次封装

    近来在使用vue重构公司m站时,使用了axios来进行数据的请求,由于项目的需要,对axios进行了二次封装,点击进入axios //引入axios import axios from 'axios' ...

  9. 第4章 PCIe总线概述

    随着现代处理器技术的发展,在互连领域中,使用高速差分总线替代并行总线是大势所趋.与单端并行信号相比,高速差分信号可以使用更高的时钟频率,从而使用更少的信号线,完成之前需要许多单端并行数据信号才能达到的 ...

  10. DOS下串口通信程序来传送文件的源代码

    接收程序: #include <dos.h>#include <fstream.h>#include <conio.h>#include <stdio.h&g ...