OJ-线评测系统

OJ全称为Online judge,意为“在线评测系统”,OJ平台是一个工具,用于验证程序准确性,允许开发者提交代码并接收系统自动化的评估反馈。该平台依据预设的测试案例执行代码测试,以确认输出结果与预期一致。这种在线评估服务在编程竞赛、网络编程教学、以及面试备考等多个领域得到广泛应用。

其中,它的编码方式分为以下两种类型:

1.IO型:所有的代码都是自己来完成和实现

2.接口型:只需要完成一个函数,其他需要的数据都是后台准备好的

在OJ平台上,用户可以挑选题目并递交自己的编程解决方案。随后,OJ系统会自动编译并执行这些代码,对比实际输出与标准答案。基于代码的正确性、执行速度及内存使用情况,系统会提供诸如“成功通过”、“结果不符”、“执行超时”等评判。用户据此反馈不断调整和优化代码,直至达成正确结果。OJ平台常设有丰富多样的题目库,覆盖不同难度级别和各类主题,如算法设计、数据结构应用、数学挑战及图论等。编程爱好者通过攻克这些题目,能够有效提升编程技能,锻炼算法逻辑思维,并增强解决实际问题的能力。

简而言之,OJ是一个集编程题目发布、测试评估与分数反馈于一体的在线平台,它为程序员构建了一个学习进步、实战演练及展示才能的空间。通过在该平台上解答编程挑战,程序员能够精进算法理解与编程技艺,同时促进与其他同行间的交流切磋与良性竞争。

<think>好的,用户需要设计OJ系统的ER图。首先,我需要明确OJ系统的主要功能和组成部分。根据引用[1]和[2],数据库设计要从实际需求出发,使用E-R模型。所以,先确定系统中的实体。 在线判题系统的核心功能包括用户提交代码、自动判题、题目管理等。因此,实体可能有用户、题目、提交记录、测试用例等。用户实体包含用户ID、用户名等信息;题目需要题目ID、内容、难度等属性。提交记录要关联用户和题目,记录代码、提交时间和结果。 接下来考虑实体间的关系。用户和提交记录是一对多,一个用户可以多次提交。题目和提交记录也是一对多,一道题有多个提交。题目和测试用例是一对多,每个题目有多个测试用例。此外,角色和用户可能是多对多,比如用户可能有不同的权限角色。 然后需要检查属性是否正确,比如测试用例是否需要输入输出、是否隐藏。提交结果可能需要枚举类型,如Accepted、Wrong Answer等。引用[3]提到查询时使用转义符,这里可能不需要,但要注意SQL语句的安全性。引用[4]提到使用MyBatis操作数据库,可能影响后端实现,但ER图设计更关注结构。 最后,确保ER图符合规范,实体、关系、属性明确。可能需要画图工具来可视化,但用户现在只需要设计思路。确认是否有遗漏的实体,比如比赛或讨论区,但用户问题可能聚焦核心功能,暂时不需要扩展。</think>### OJ系统ER图设计思路 #### 核心实体分析 1. **用户实体**(User) - 属性:用户ID(主键)、用户名、密码哈希、邮箱、注册时间、角色(学生/教师/管理员) - 特殊约束:用户名需唯一,密码需加密存储[^4] 2. **题目实体**(Problem) - 属性:题目ID(主键)、标题、题干描述、输入说明、输出说明、时间限制(ms)、内存限制(MB)、创建时间、难度等级 - 示例约束:时间限制需为$1000 \leq t \leq 5000$范围内的整数 3. **提交记录实体**(Submission) - 属性:提交ID(主键)、用户ID(外键)、题目ID(外键)、代码内容、提交时间、执行时间、使用内存、判题结果 - 特殊字段:判题结果采用枚举类型(Accepted/Wrong Answer/Time Limit Exceeded等) 4. **测试用例实体**(TestCase) - 属性:用例ID(主键)、题目ID(外键)、输入数据、期望输出、是否隐藏用例 - 存储要求:大型测试用例需使用BLOB类型存储[^2] #### 关系模型设计 ```mermaid erDiagram USER ||--o{ SUBMISSION : "提交" PROBLEM ||--o{ SUBMISSION : "被提交" PROBLEM ||--o{ TEST_CASE : "包含" USER { int user_id PK varchar(20) username varchar(64) password_hash varchar(50) email datetime register_time enum role } PROBLEM { int problem_id PK varchar(100) title text description int time_limit int memory_limit datetime create_time } SUBMISSION { int submission_id PK int user_id FK int problem_id FK text code datetime submit_time int exec_time int used_memory enum result } TEST_CASE { int case_id PK int problem_id FK blob input_data blob expected_output bool is_hidden } ``` #### 关键设计要点 1. **性能优化设计**: - 建立复合索引`idx_submission_query`(user_id, problem_id, submit_time)提升查询效率[^1] - 测试用例表采用垂直分表设计,将大字段单独存储 2. **安全设计**: - 用户密码采用BCrypt加密算法存储 - 代码提交内容需进行防注入过滤,如替换`system()`等危险函数 3. **扩展性设计**: - 通过角色字段实现权限控制,权限值采用位运算存储 - 判题结果字段使用可扩展的枚举类型,满足后续新增状态需求 4. **特殊约束实现**: ```sql CREATE TABLE Problem ( time_limit INT CHECK (time_limit BETWEEN 1000 AND 5000), memory_limit INT CHECK (memory_limit >= 128) ); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值