Files
xlh/未完成/文档内容/数据库设计报告_Markdown生成版.md

174 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 数据库设计报告
**项目名称**基于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` 索引用于微信登录