174 lines
5.7 KiB
Markdown
174 lines
5.7 KiB
Markdown
|
|
# 数据库设计报告
|
|||
|
|
|
|||
|
|
**项目名称**:基于SpringBoot框架的高考志愿辅助填报系统设计与实现
|
|||
|
|
**学生姓名**:向黎华
|
|||
|
|
**学号**:229970427
|
|||
|
|
**学院/班级**:软件学院 / 22软工8班
|
|||
|
|
**指导教师**:彭娟
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. 引言
|
|||
|
|
### 1.1 编写目的
|
|||
|
|
本文档详细描述了高考志愿辅助填报系统的数据库设计,包括概念结构设计、逻辑结构设计以及物理结构设计,旨在为系统开发提供底层数据支撑。
|
|||
|
|
|
|||
|
|
### 1.2 数据库环境
|
|||
|
|
- 数据库管理系统:MySQL 8.0+
|
|||
|
|
- 字符集:utf8mb4 (部分历史表为 utf8mb3)
|
|||
|
|
- 存储引擎:InnoDB (为主), MyISAM (部分用于只读查询优化)
|
|||
|
|
|
|||
|
|
## 2. 概念模型与E-R图
|
|||
|
|
本系统的核心实体及其关系描述如下:
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
erDiagram
|
|||
|
|
Member ||--o| Order : places
|
|||
|
|
Member {
|
|||
|
|
int id
|
|||
|
|
string mobile
|
|||
|
|
int fraction "高考分"
|
|||
|
|
int ranking "位次"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
School ||--|{ School_Major : offers
|
|||
|
|
School {
|
|||
|
|
int id
|
|||
|
|
string title
|
|||
|
|
tinyint f985
|
|||
|
|
tinyint f211
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Major ||--|{ School_Major : defines
|
|||
|
|
|
|||
|
|
School_Major ||--|{ School_Major_Score : history_data
|
|||
|
|
School_Major_Score {
|
|||
|
|
float lowest_score
|
|||
|
|
int lowest_order
|
|||
|
|
int year
|
|||
|
|
int province_id
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Plan ||--|{ Plan_Step : contains
|
|||
|
|
Plan_Step }|--|| School_Major : references
|
|||
|
|
|
|||
|
|
Planner ||--o| Member : guides
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 实体关系说明
|
|||
|
|
1. **用户 (Member/Planner)**
|
|||
|
|
- 分为普通用户(学生/家长)、规划师、商户。
|
|||
|
|
- 一个用户可以关联一个商户(归属关系)。
|
|||
|
|
2. **学校 (School)**
|
|||
|
|
- 拥有多个属性(名称、所在地、层次)。
|
|||
|
|
- 包含多个专业 (School_Major)。
|
|||
|
|
- 每个专业在不同年份、不同省份有不同的录取分数 (Fractional/Score)。
|
|||
|
|
3. **专业 (Major)**
|
|||
|
|
- 标准专业库,包含专业类、门类信息。
|
|||
|
|
4. **订单 (Order)**
|
|||
|
|
- 用户购买规划师服务或商户服务产生订单。
|
|||
|
|
- 关联用户、规划师、支付状态。
|
|||
|
|
5. **志愿方案 (Plan/Step)**
|
|||
|
|
- 规划师为学生制定的志愿方案,包含选定的学校和专业。
|
|||
|
|
|
|||
|
|
## 3. 逻辑结构设计 (数据字典)
|
|||
|
|
|
|||
|
|
### 3.1 核心业务表
|
|||
|
|
|
|||
|
|
#### 1. 规划师表 (`zr_planner`)
|
|||
|
|
存储规划师的基本信息、认证状态和账户余额。
|
|||
|
|
|
|||
|
|
| 字段名 | 类型 | 描述 | 备注 |
|
|||
|
|
| :--- | :--- | :--- | :--- |
|
|||
|
|
| id | int | 主键 | 自增 |
|
|||
|
|
| username | varchar(64) | 账户名 | |
|
|||
|
|
| wx_id | varchar(255) | 微信OpenID | 用于微信授权 |
|
|||
|
|
| type | int | 教师类型 | 1.普通教师 2.志愿规划师 3.专家咨询师 |
|
|||
|
|
| status | int | 认证状态 | 0.未认证 1.认证中 2.已认证 3.拒绝 |
|
|||
|
|
| balance | int | 余额 | 单位:分 |
|
|||
|
|
| merchant | char(8) | 商户号 | 关联商户 |
|
|||
|
|
|
|||
|
|
#### 2. 商户表 (`zr_planner_merchant`)
|
|||
|
|
存储合作机构/商户的信息。
|
|||
|
|
|
|||
|
|
| 字段名 | 类型 | 描述 | 备注 |
|
|||
|
|
| :--- | :--- | :--- | :--- |
|
|||
|
|
| id | int | 主键 | |
|
|||
|
|
| username | varchar(30) | 用户名 | |
|
|||
|
|
| merchant | char(8) | 商户号 | 唯一标识 |
|
|||
|
|
| balance | int | 余额 | 单位:分 |
|
|||
|
|
| company | varchar(255) | 公司名称 | |
|
|||
|
|
|
|||
|
|
#### 3. 商户学员表 (`zr_planner_merchant_member`)
|
|||
|
|
商户名下的学生信息。
|
|||
|
|
|
|||
|
|
| 字段名 | 类型 | 描述 | 备注 |
|
|||
|
|
| :--- | :--- | :--- | :--- |
|
|||
|
|
| id | int | 主键 | |
|
|||
|
|
| merchant_number | char(8) | 商户号 | 外键 |
|
|||
|
|
| mobile | char(11) | 手机号 | |
|
|||
|
|
| fraction | int | 高考分数 | |
|
|||
|
|
| ranking | int | 高考位次 | |
|
|||
|
|
| select_subject | varchar(255) | 选科 | |
|
|||
|
|
|
|||
|
|
### 3.2 基础数据表
|
|||
|
|
|
|||
|
|
#### 1. 学校表 (`zr_school`)
|
|||
|
|
全国高校基础信息。
|
|||
|
|
|
|||
|
|
| 字段名 | 类型 | 描述 | 备注 |
|
|||
|
|
| :--- | :--- | :--- | :--- |
|
|||
|
|
| id | int | 主键 | |
|
|||
|
|
| title | varchar(100) | 学校名称 | |
|
|||
|
|
| f985 | tinyint | 是否985 | 1是 |
|
|||
|
|
| f211 | tinyint | 是否211 | 1是 |
|
|||
|
|
| province_name | varchar(100) | 前在省份 | |
|
|||
|
|
|
|||
|
|
#### 2. 学校专业分数线 (`zr_school_major_score`)
|
|||
|
|
核心数据表,记录各校各专业历年在各省的录取数据。
|
|||
|
|
|
|||
|
|
| 字段名 | 类型 | 描述 | 备注 |
|
|||
|
|
| :--- | :--- | :--- | :--- |
|
|||
|
|
| id | int | 主键 | |
|
|||
|
|
| school_id | int | 学校ID | 外键 |
|
|||
|
|
| title | char(255) | 专业名称 | |
|
|||
|
|
| lowest_score | float | 最低分 | |
|
|||
|
|
| lowest_order | int | 最低位次 | 核心参考数据 |
|
|||
|
|
| batch | char(32) | 批次 | 本科批/专科批等 |
|
|||
|
|
| year | int | 年份 | |
|
|||
|
|
| province_id | int | 省份ID | |
|
|||
|
|
|
|||
|
|
#### 3. 一分一段表 (`zr_one_minute`)
|
|||
|
|
用于位次换算。
|
|||
|
|
|
|||
|
|
| 字段名 | 类型 | 描述 | 备注 |
|
|||
|
|
| :--- | :--- | :--- | :--- |
|
|||
|
|
| score | int | 分数 | |
|
|||
|
|
| num | int | 同分人数 | |
|
|||
|
|
| cum_num | int | 累计人数 | 即位次 |
|
|||
|
|
| year | int | 年份 | |
|
|||
|
|
| province_id | int | 省份ID | |
|
|||
|
|
|
|||
|
|
### 3.4 物理设计与数据量估算
|
|||
|
|
根据历年高考数据规模,本系统核心表数据量估算如下:
|
|||
|
|
|
|||
|
|
| 表名 | 描述 | 预估数据量 (3年) | 存储策略 |
|
|||
|
|
| :--- | :--- | :--- | :--- |
|
|||
|
|
| **zr_school_major_score** | 录取分数线 | ~1500万行 | 分库分表 (按省份/年份),只读优化 |
|
|||
|
|
| **zr_one_minute** | 一分一段表 | ~300万行 | Redis 缓存热点数据 |
|
|||
|
|
| **zr_member** | 注册用户 | ~50万 | 常规 InnoDB 存储 |
|
|||
|
|
| **zr_school** | 院校库 | ~3000行 | 全量缓存 |
|
|||
|
|
|
|||
|
|
针对海量录取数据,建议采用 MySQL 的分区表特性,按 `year` 进行范围分区,以提高查询效率。
|
|||
|
|
|
|||
|
|
## 4. 其它重要表
|
|||
|
|
- `zr_major`: 标准专业库
|
|||
|
|
- `zr_planner_order`: 佣金与提现订单
|
|||
|
|
- `zr_planner_merchant_service_order`: 服务购买订单
|
|||
|
|
- `zr_planner_cert`: 规划师资质认证详情
|
|||
|
|
|
|||
|
|
## 5. 索引设计
|
|||
|
|
为了优化查询性能,针对高频查询字段建立索引:
|
|||
|
|
- `zr_school_major_score`: 组合索引 `(school_id, province_id, year, batch)`,`(lowest_score, province_id, ...)`
|
|||
|
|
- `zr_school`: `title` 索引用于搜索
|
|||
|
|
- `zr_planner`: `wx_id` 索引用于微信登录
|