> For the complete documentation index, see [llms.txt](https://noahs-organization-14.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://noahs-organization-14.gitbook.io/docs/2.-xu-qiu-gui-ge-shuo-ming/shu-ju-miao-shu.md).

# 2.3. 数据描述

## 2.3.1. 数据建模

![alt text](https://github.com/BJUT-Software-Course-Design/docs/blob/main/images/数据库ER图.png)

## 2.3.2. 数据字典

* **用户(User)**
  * username: 唯一的文本字段，用户的唯一标识符。
  * email: 可选的文本字段，用户的电子邮件地址。
  * create\_time: 自动设置的日期时间字段，记录用户的创建时间。
  * admin\_type: 文本字段，默认值为“Regular User”，表示用户的管理类型。
  * character: 选择字段，选项为 'student' 或 'teacher'，默认为 'student'。
  * problem\_permission: 文本字段，默认为“None”，定义用户对问题的访问权限。
  * auth\_token: 可选的文本字段，用于单点登录认证。
  * two\_factor\_auth: 布尔字段，默认为False，指示是否启用两因素认证。
  * tfa\_token: 可选的文本字段，两因素认证的临时令牌。
  * session\_keys: JSON字段，默认为空列表，存储会话密钥。
  * open\_api: 布尔字段，默认为False，指示是否开启开放API。
  * open\_api\_appkey: 可选的文本字段，开放API的应用密钥。
  * is\_disabled: 布尔字段，默认为False，指示用户是否被禁用。
* **题目**
  * \_id: 文本字段，具有数据库索引，用于显示的问题ID。
  * contest: 可选的外键，关联到Contest，表示问题所属的比赛。
  * is\_public: 布尔字段，表示问题是否公开可见。
  * title: 文本字段，问题的标题。
  * description: 富文本字段，问题的描述。
  * input\_description: 富文本字段，问题的输入描述。
  * output\_description: 富文本字段，问题的输出描述。
  * samples: JSON字段，存储问题的样本输入输出。
  * test\_case\_id: 文本字段，关联的测试用例ID。
  * test\_case\_score: JSON字段，测试用例的分数。
  * hint: 可选的富文本字段，问题提示。
  * languages: JSON字段，支持的编程语言。
  * template: JSON字段，代码模板。
  * create\_time: 自动设置的日期时间字段，问题的创建时间。
  * last\_update\_time: 可选的日期时间字段，问题的最后更新时间。
  * created\_by: 外键，关联到User，问题的创建者。
  * time\_limit: 整数字段，执行时间限制（毫秒）。
  * memory\_limit: 整数字段，内存限制（MB）。
  * io\_mode: JSON字段，定义输入输出模式。
  * spj: 布尔字段，指示是否使用特殊判题方法。
  * spj\_language: 可选的文本字段，特殊判题使用的编程语言。
  * spj\_code: 可选的文本字段，特殊判题的代码。
  * spj\_version: 可选的文本字段，特殊判题的版本。
  * spj\_compile\_ok: 布尔字段，特殊判题编译是否成功。
  * rule\_type: 文本字段，问题的规则类型（例如ACM, OI）。
  * visible: 布尔字段，表示问题是否可见。
  * difficulty: 文本字段，问题难度（例如High, Mid, Low）。
  * tags: 多对多关系，关联到ProblemTag，问题的标签。
  * source: 可选的文本字段，问题的来源。
* **比赛**
  * title: 文本字段，比赛的标题。
  * description: 富文本字段，比赛的详细描述。
  * real\_time\_rank: 布尔字段，是否实时显示排名。
  * password: 可选的文本字段，比赛的访问密码。
  * rule\_type: 文本字段，比赛的规则类型。
  * start\_time: 日期时间字段，比赛开始时间。
  * end\_time: 日期时间字段，比赛结束时间。
  * reate\_time: 自动设置的日期时间字段，比赛的创建时间。
  * last\_update\_time: 自动更新的日期时间字段，比赛的最后更新时间。
  * created\_by: 外键，关联到User，比赛的创建者。
  * visible: 布尔字段，表示比赛是否可见。
  * allowed\_ip\_ranges: JSON字段，允许访问比赛的IP范围。
* **提交 (Submission)**
  * id: 文本字段，提交的唯一标识符，主键。
  * contest: 可选的外键，关联到Contest，表示提交所属的比赛。
  * problem: 外键，关联到Problem，表示提交的问题。
  * create\_time: 自动设置的日期时间字段，记录提交的创建时间。
  * user\_id: 整数字段，表示提交用户的ID，具有数据库索引。
  * username: 文本字段，提交用户的用户名。
  * code: 文本字段，用户提交的代码。
  * result: 整数字段，表示提交的结果，如通过、错误等，默认为待判状态（Pending）。
  * info: JSON字段，存储判题返回的详细信息。
  * language: 文本字段，表示提交所用的编程语言。
  * shared: 布尔字段，表示是否共享此提交，默认为False。
  * statistic\_info: JSON字段，存储提交的统计信息，如时间和内存消耗。
  * ip: 可选的文本字段，提交时的IP地址。
* **测试用例(TestCase)**
  * input: 文本字段，表示测试用例的输入数据。
  * output: 文本字段，表示测试用例的输出数据。
  * score: 整数字段，表示此测试用例的分数，默认为0。
* **问题标签(ProblemTag)**
  * name: 文本字段，表示标签的名称
* **比赛排名(ACMContestRank 和 OIContestRank)**
  * user: 外键，关联到User，表示参与比赛的用户。
  * contest: 外键，关联到Contest，表示所属比赛。
  * submission\_number: 整数字段，表示用户的提交次数。
  * accepted\_number (ACM专有): 整数字段，表示通过的问题数。
  * total\_time (ACM专有): 整数字段，表示总用时，包括错误尝试的惩罚时间。
  * submission\_info (ACM和OI均有): JSON字段，存储关于提交的详细信息。
  * total\_score (OI专有): 整数字段，表示用户在OI比赛中的总分。
* **判题服务器 (JudgeServer)**
  * hostname: 文本字段，服务器的主机名。
  * ip: 可选的文本字段，服务器的IP地址。
  * judger\_version: 文本字段，判题服务器的版本。
  * cpu\_core: 整数字段，服务器的CPU核心数。
  * memory\_usage: 浮点字段，服务器的内存使用率。
  * cpu\_usage: 浮点字段，服务器的CPU使用率。
  * last\_heartbeat: 日期时间字段，服务器的最后心跳时间。
  * create\_time: 自动设置的日期时间字段，服务器的创建时间。
  * task\_number: 整数字段，服务器当前的任务数量。
  * service\_url: 可选的文本字段，服务器的服务URL。
  * is\_disabled: 布尔字段，表示服务器是否被禁用。
