11 KiB
11 KiB
东软环保公众监督系统 - 数据库设计文档
1. 设计概述
本数据库设计旨在支持一个高效、可扩展的环保监督系统。设计遵循第三范式(3NF),通过主外键关联确保数据的一致性和完整性。所有表均采用InnoDB存储引擎,以支持事务和行级锁定。
- 命名规范: 表名采用小写下划线命名法(e.g.,
user_account),字段名采用驼峰命名法(e.g.,createdAt)。 - 主键: 所有表均包含一个
BIGINT类型的自增主键id。 - 时间戳: 关键业务表包含
createdAt和updatedAt字段,用于追踪记录的创建和最后修改时间。
2. 实体关系图 (E-R Diagram)
erDiagram
USER_ACCOUNT }|--o{ FEEDBACK : "submits"
USER_ACCOUNT }|--o{ ASSIGNMENT_RECORD : "assigns (as supervisor)"
USER_ACCOUNT }|--o{ ASSIGNMENT_RECORD : "is assigned (as grid_worker)"
USER_ACCOUNT }|--o{ AQI_DATA : "reports"
USER_ACCOUNT }|--o{ USER_LOGIN_HISTORY : "logs"
FEEDBACK ||--|{ ASSIGNMENT_RECORD : "is subject of"
FEEDBACK ||--o{ AQI_DATA : "is verified by"
FEEDBACK ||--|{ FEEDBACK_IMAGE : "has"
GRID ||--o{ AQI_DATA : "is location for"
USER_ACCOUNT {
BIGINT id PK
VARCHAR name
VARCHAR phone "UK"
VARCHAR email "UK"
VARCHAR password
VARCHAR gender
VARCHAR role
VARCHAR status
VARCHAR region
VARCHAR level
JSON skills
DATETIME createdAt
DATETIME updatedAt
}
FEEDBACK {
BIGINT id PK
VARCHAR eventId "UK"
VARCHAR title
TEXT description
VARCHAR pollutionType
VARCHAR severityLevel
VARCHAR status
VARCHAR textAddress
INT gridX
INT gridY
BIGINT submitterId FK
DATETIME createdAt
DATETIME updatedAt
}
FEEDBACK_IMAGE {
BIGINT id PK
BIGINT feedbackId FK
VARCHAR imageUrl "URL of the stored image"
VARCHAR imageName
DATETIME createdAt
}
ASSIGNMENT_RECORD {
BIGINT id PK
BIGINT feedbackId FK
BIGINT gridWorkerId FK
BIGINT supervisorId FK
VARCHAR assignmentMethod
JSON algorithmDetails
VARCHAR status
DATETIME createdAt
}
AQI_DATA {
BIGINT id PK
BIGINT feedbackId FK "Nullable"
BIGINT gridId FK
BIGINT reporterId FK
DOUBLE aqiValue
DOUBLE pm25
DOUBLE pm10
DOUBLE so2
DOUBLE no2
DOUBLE co
DOUBLE o3
DATETIME recordTime
}
GRID {
BIGINT id PK
INT gridX
INT gridY "UK"
VARCHAR cityName
VARCHAR districtName
BOOLEAN isObstacle
}
USER_LOGIN_HISTORY {
BIGINT id PK
BIGINT userId FK
VARCHAR ipAddress
VARCHAR userAgent
VARCHAR status
DATETIME loginTime
}
3. 数据表详细设计
3.1 用户表 (user_account)
存储所有系统用户,包括公众、监督员、网格员、管理员和决策者。
| 字段名 | 数据类型 | 长度/约束 | 是否可空 | 默认值 | 描述 |
|---|---|---|---|---|---|
id |
BIGINT |
PK, AUTO_INCREMENT |
No | 唯一主键 | |
name |
VARCHAR |
255 | No | 真实姓名 | |
phone |
VARCHAR |
50 | No | 手机号 (唯一,用于登录) | |
email |
VARCHAR |
255 | No | 邮箱 (唯一,用于登录和验证) | |
password |
VARCHAR |
255 | No | BCrypt加密后的密码 | |
gender |
VARCHAR |
10 | Yes | 性别 (Enum: MALE, FEMALE, UNKNOWN) |
|
role |
VARCHAR |
50 | No | PUBLIC_SUPERVISOR |
角色 (Enum: PUBLIC_SUPERVISOR, SUPERVISOR (业务主管), GRID_WORKER (网格员), ADMIN (系统管理员), DECISION_MAKER (决策者)) |
status |
VARCHAR |
50 | No | ACTIVE |
账户状态 (Enum: ACTIVE, INACTIVE, ON_LEAVE) |
region |
VARCHAR |
255 | Yes | 所属区域 (格式: "省-市-区") | |
level |
VARCHAR |
50 | Yes | 行政级别 (Enum: PROVINCE, CITY) |
|
skills |
JSON |
Yes | 技能标签 (仅对网格员有效, e.g., ["PM2.5", "O3"]) |
||
createdAt |
DATETIME |
No | CURRENT_TIMESTAMP |
创建时间 | |
updatedAt |
DATETIME |
No | CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |
更新时间 |
索引设计:
PRIMARY KEY (id)UNIQUE KEY uk_phone (phone)UNIQUE KEY uk_email (email)KEY idx_role_status (role, status)KEY idx_region_level (region, level)
3.2 反馈信息表 (feedback)
存储由公众监督员提交的污染反馈信息。
| 字段名 | 数据类型 | 长度/约束 | 是否可空 | 默认值 | 描述 |
|---|---|---|---|---|---|
id |
BIGINT |
PK, AUTO_INCREMENT |
No | 唯一主键 | |
eventId |
VARCHAR |
255 | UK, NOT NULL |
业务事件ID (USR...格式),对用户可见、唯一 | |
title |
VARCHAR |
255 | No | 反馈标题 | |
description |
TEXT |
Yes | 详细描述 | ||
pollutionType |
VARCHAR |
50 | No | 污染类型 (Enum: PM2.5, O3, NO2, SO2, OTHER) |
|
severityLevel |
VARCHAR |
50 | No | 严重等级 (Enum: LOW, MEDIUM, HIGH) |
|
status |
VARCHAR |
50 | No | AI_REVIEWING |
任务状态 (Enum: AI_REVIEWING, AI_PROCESSING, PENDING_ASSIGNMENT, ASSIGNED, IN_PROGRESS, SUBMITTED, COMPLETED, CANCELLED, CLOSED_INVALID) |
textAddress |
VARCHAR |
255 | Yes | 文字地址 (格式: "省份-城市-区") | |
gridX |
INT |
Yes | 对应的网格X坐标 | ||
gridY |
INT |
Yes | 对应的网格Y坐标 | ||
submitterId |
BIGINT |
FK -> user_account.id |
No | 提交者ID | |
createdAt |
DATETIME |
No | CURRENT_TIMESTAMP |
创建时间 | |
updatedAt |
DATETIME |
No | CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |
更新时间 |
索引设计:
PRIMARY KEY (id)UNIQUE KEY uk_event_id (eventId)KEY idx_submitter_id (submitterId)KEY idx_status_created_at (status, createdAt)KEY idx_grid_coords (gridX, gridY)
3.3 反馈图片表 (feedback_image)
存储与反馈信息关联的图片。
| 字段名 | 数据类型 | 长度/约束 | 是否可空 | 默认值 | 描述 |
|---|---|---|---|---|---|
id |
BIGINT |
PK, AUTO_INCREMENT |
No | 唯一主键 | |
feedbackId |
BIGINT |
FK -> feedback.id |
No | 关联的反馈ID | |
imageUrl |
VARCHAR |
512 | No | 存储的图片URL | |
imageName |
VARCHAR |
255 | Yes | 图片原始文件名 | |
createdAt |
DATETIME |
No | CURRENT_TIMESTAMP |
创建时间 |
索引设计:
PRIMARY KEY (id)KEY idx_feedback_id (feedbackId)
3.4 任务分配记录表 (assignment_record)
记录每一次任务分配的详细信息。
| 字段名 | 数据类型 | 长度/约束 | 是否可空 | 默认值 | 描述 |
|---|---|---|---|---|---|
id |
BIGINT |
PK, AUTO_INCREMENT |
No | 唯一主键 | |
feedbackId |
BIGINT |
FK -> feedback.id |
No | 关联的反馈/任务ID | |
gridWorkerId |
BIGINT |
FK -> user_account.id |
No | 被分配的网格员ID | |
supervisorId |
BIGINT |
FK -> user_account.id |
No | 执行分配的主管ID | |
assignmentMethod |
VARCHAR |
50 | No | 分配方式 (Enum: MANUAL, INTELLIGENT) |
|
algorithmDetails |
JSON |
Yes | 智能分配算法的快照 (e.g., ETR, 候选人) | ||
status |
VARCHAR |
50 | No | PENDING |
分配状态 (Enum: PENDING, ACCEPTED, REJECTED) |
createdAt |
DATETIME |
No | CURRENT_TIMESTAMP |
创建时间 |
索引设计:
PRIMARY KEY (id)KEY idx_feedback_id (feedbackId)KEY idx_grid_worker_id_status (gridWorkerId, status)KEY idx_supervisor_id (supervisorId)
3.5 空气质量数据表 (aqi_data)
存储网格员现场核查后上报的精确AQI数据。
| 字段名 | 数据类型 | 长度/约束 | 是否可空 | 默认值 | 描述 |
|---|---|---|---|---|---|
id |
BIGINT |
PK, AUTO_INCREMENT |
No | 唯一主键 | |
feedbackId |
BIGINT |
FK -> feedback.id |
Yes | 关联的反馈ID (可为空,支持主动上报) | |
gridId |
BIGINT |
FK -> grid.id |
No | 数据采集所在的网格ID | |
reporterId |
BIGINT |
FK -> user_account.id |
No | 上报人ID(网格员) | |
aqiValue |
DOUBLE |
Yes | 综合AQI指数 | ||
pm25 |
DOUBLE |
Yes | PM2.5读数 (μg/m³) | ||
pm10 |
DOUBLE |
Yes | PM10读数 (μg/m³) | ||
so2 |
DOUBLE |
Yes | 二氧化硫读数 (μg/m³) | ||
no2 |
DOUBLE |
Yes | 二氧化氮读数 (μg/m³) | ||
co |
DOUBLE |
Yes | 一氧化碳读数 (mg/m³) | ||
o3 |
DOUBLE |
Yes | 臭氧读数 (μg/m³) | ||
recordTime |
DATETIME |
No | CURRENT_TIMESTAMP |
记录时间 |
索引设计:
PRIMARY KEY (id)KEY idx_feedback_id (feedbackId)KEY idx_grid_id_record_time (gridId, recordTime)KEY idx_reporter_id (reporterId)
3.6 网格地图表 (grid)
定义抽象的二维网格地图。
| 字段名 | 数据类型 | 长度/约束 | 是否可空 | 默认值 | 描述 |
|---|---|---|---|---|---|
id |
BIGINT |
PK, AUTO_INCREMENT |
No | 唯一主键 | |
gridX |
INT |
No | 网格X坐标 | ||
gridY |
INT |
No | 网格Y坐标 | ||
cityName |
VARCHAR |
255 | Yes | 所属城市 | |
districtName |
VARCHAR |
255 | Yes | 所属区域 | |
isObstacle |
BOOLEAN |
No | false |
是否为障碍物 |
索引设计:
PRIMARY KEY (id)UNIQUE KEY uk_grid_coords (gridX, gridY)KEY idx_city_district (cityName, districtName)
3.7 用户登录历史表 (user_login_history)
记录用户登录活动,用于安全审计。
| 字段名 | 数据类型 | 长度/约束 | 是否可空 | 默认值 | 描述 |
|---|---|---|---|---|---|
id |
BIGINT |
PK, AUTO_INCREMENT |
No | 唯一主键 | |
userId |
BIGINT |
FK -> user_account.id |
No | 登录用户ID | |
ipAddress |
VARCHAR |
100 | Yes | 登录IP地址 | |
userAgent |
VARCHAR |
512 | Yes | 浏览器或客户端信息 | |
status |
VARCHAR |
50 | No | 登录状态 (Enum: SUCCESS, FAILED_PASSWORD, FAILED_LOCKED) |
|
loginTime |
DATETIME |
No | CURRENT_TIMESTAMP |
登录时间 |
索引设计:
PRIMARY KEY (id)KEY idx_user_id_login_time (userId, loginTime)KEY idx_ip_address (ipAddress)
4. 初始化数据 (Seed Data)
系统首次部署时,应向user_account表插入以下初始用户,以确保各角色可用。密码均为明文示例,实际存储时需加密。
| name | phone | password | role | status | region | level | |
|---|---|---|---|---|---|---|---|
| "张建华" | "18800000001" | "zhang.jianguo@example.com" | "Admin@123456" | ADMIN |
ACTIVE |
"河北省" | PROVINCE |
| "李志强" | "18800000002" | "li.zhiqiang@example.com" | "Admin@123456" | ADMIN |
ACTIVE |
"河北省-石家庄市" | CITY |
| "王伟" | "18800000003" | "wang.wei@example.com" | "User@123456" | GRID_WORKER |
ACTIVE |
"河北省-石家庄市-长安区" | CITY |
| "刘丽" | "18800000004" | "li.li@example.com" | "User@123456" | SUPERVISOR |
ACTIVE |
"河北省-石家庄市-裕华区" | CITY |
| "陈思远" | "18800000005" | "chen.siyuan@example.com" | "User@123456" | DECISION_MAKER |
ACTIVE |
"全国" | PROVINCE |
| "赵敏" | "18800000006" | "zhao.min@example.com" | "User@123456" | PUBLIC_SUPERVISOR |
ACTIVE |
"河北省-石家庄市-桥西区" | CITY |