数据库EER图
数据库表、字段、约束解释
users 用户:
id 标识符,email 邮箱,password 密码,name 姓名,sex 性别,enabled 启用 ,role 角色
id primary key
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)
设计思想
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等多保存了很多次。
所以,我采取弱关联(将多值属性剥离,新建一个表存入,新表高度依赖于原来的表)来保存。