Online Judge(OJ)搭建——2、数据库构建

数据库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等多保存了很多次。

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

时间: 2024-10-15 09:48:58

Online Judge(OJ)搭建——2、数据库构建的相关文章

Ubuntu 14.04 Virtual Judge 的搭建

Ubuntu 14.04 Virtual Judge 的搭建 博客的排版可能不是很好,可以下载本文的PDF: Ubuntu 14.04Virtual Judge 的搭建 本人是一名ACM弱菜,由于集训队需要, 我们决定架设自己的OnlineJudge和Virtual Judge,于是开始了噩梦般的搭建. OJ的搭建,非常顺利,参考的是 Ubuntu Server 12.04搭建hustoj 这篇博客 写得非常好,其他不多说,如果有需要搭建自己学校的OJ的朋友,可以参考, 主要就是架设LAMP,其

用python3.x与mysql数据库构建简单的爬虫系统(转)

这是在博客园的第一篇文章,由于本人还是一个编程菜鸟,也写不出那些高大上的牛逼文章,这篇文章就是对自己这段时间学习python的一个总结吧. 众所周知python是一门对初学编程的人相当友好的编程语言,就像本屌丝一样,一学就对它产生好感了!当然,想要精通它还有很多东西需要学习.那废话不多说了,下面我就来说一下如何用python3.x与mysql数据库构建一个简单的爬虫系统(其实就是把从网页上爬下来的内容存储到mysql数据库中). 首先就是搭建环境了,这里就简介绍一下我的环境吧.本机的操作系统是w

【原】Spring activiti 环境搭建之数据库创建

由于在开发工作流的时候,避免不了要保存一些数据和流程走向;所以在搭建Spring activiti开发环境的时候需要把官方提供的23张表创建到我们的DB,后续的流程都会在这些表中记录. 1.创建代码如下: @Test public void createactivityTable(){ ProcessEngineConfiguration p = ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration(

【MongoDB】windows平台搭建Mongo数据库复制集(类似集群)(三)

关于windows平台搭建Mongo数据库复制集这个话题,我已经在前面写了两篇博客 第一篇: 如何在windows平台搭建Mongo数据库复制集 第二篇: 数据同步和故障自适应测试 在本篇里面,咱们重点总结一下复制集,以及分析一下它的工作原理 一.常见场景 应用程序和数据库之间的网络连接丢失 计划停机.断电.数据库服务硬盘故障等等 复制可以进行故障转移,复制能让你在副本间均衡读负载,保证复制节点与主节点保持同步 二.工作原理 副本集依赖于两个基础机制:oplog和"心跳"(heartb

【MongoDB】windows平台搭建Mongo数据库复制集(类似集群)(转)

原文链接:[MongoDB]windows平台搭建Mongo数据库复制集(类似集群)(一) Replica  Sets(复制集)是在mongodDB1.6版本开始新增的功能,它可以实现故障自动切换和自动修复功能成员节点的功能,各个DB之间的数据完全一致,大大降低了单点故障的风险. [] 以上图示是三个节点的Replica Set架构.该图来源于红丸编写的<Mongodb管理与开发精要>这本书.从上图可以看出,结构类似与一个集群,其实完全可以当做一个集群.因为它确实和集群实现的作用是相同的. 一

linux搭建redis数据库

linux服务器搭建redis数据库步骤如下 1.下载redis资源文件 wget http://download.redis.io/releases/redis-3.0.4.tar.gz 2.解压redis资源问题 tar -zxf redis-3.0.4.tar.gz 3.进入解压好后的redis文件夹 cd redis-3.0.4 4.make安装redis服务 make 5.启动redis服务(其实到这一步已经搭建完毕了,只要执行./redis-server即可 不过不建议这样,因为这个

linux【搭建MySQL数据库】详细过程

实验环境:rad hat linux 6.2操作系统. 实验目的:手工编译搭建MySQL数据库. 首先是挂载光盘,创建文件夹,挂载从网上下载下来的mysql数据库源码安装包.然后创建yum仓库,用于安装MySQL环境包. 使用yum仓库解决安装环境的依赖性关系gcc.gcc-c++语言环境. 继续安装MySQL数据库所需要使用的环境包cmake.ncurses-devel.bison.libao-devel包. 然后解压从网上下载下来的MySQL数据库源码包,创建MySQL数据库用户,并且指定不

azure linux虚拟机openlogic_centos7.0搭建postgresql数据库

近日,需要用到postgresql数据库. 我搭建的环境为: azure平台,操作系统为azure平台自带的openlogic centos7.0. 搭建过程: 1,使用系统自带postgresql包.如果仅仅搭建postgresql数据库,仅仅安装postgresql server即可. sudo yum install postgresql-server postgresql 2,安装完毕后,启动数据库,使用root权限. --首先需要初始化数据库 postgresql-setup init

使用数据库构建高性能队列用于存储订单、通知和任务(转)

英文原文: http://www.codeproject.com/Articles/110931/Building-High-Performance-Queue-in-Database-for-st 译文:http://www.oschina.net/translate/building-high-performance-queue-in-database-for-storing-orders 译者:几点人, beyondme, 漠天, petert, 赵亮-碧海情天, FGQ 引言 几乎在每个

个人环境搭建——搭建jenkins持续构建集成环境

---恢复内容开始--- 搭建jenkins持续构建集成环境  要搭建jenkins持续构建集成环境,首先要安装tomcat和JDK:   第一部分,基本说明:   敏捷(Agile) 在软件工程领域越来越红火,如何能再不断变化的需求中快速适应和保证软件的质量也显得尤其的重要. 它倡导团队开发成员必须经常集成他们的工作,甚至每天都可能发生多次集成.而每次的集成都是通过自动化的构建来验证,包括自动编译.发布和测试,从而尽快地发现集成错误,让团队能够更快的开发内聚的软件. 持续集成的核心价值在于: