项目管理系统数据库设计文档
文档信息
- 文档版本: V1.0
- 创建日期: 2026-01-26
- 文档类型: 数据库设计文档 (DDD)
1. 数据库概述
1.1 数据库选型
- 数据库类型: 关系型数据库
- 推荐数据库: MySQL / PostgreSQL
1.2 数据库设计原则
- 遵循第三范式(3NF)
- 合理使用索引提高查询性能
- 考虑数据完整性和一致性
- 支持事务处理
- 便于扩展和维护
2. 数据库表设计
2.1 用户表 (sys_user)
2.1.1 表说明
存储系统用户的基本信息和认证信息。
2.1.2 表结构
| 字段名 |
数据类型 |
长度 |
是否必填 |
默认值 |
说明 |
| user_id |
VARCHAR |
32 |
是 |
- |
用户ID,主键 |
| username |
VARCHAR |
50 |
是 |
- |
用户名,唯一 |
| password |
VARCHAR |
128 |
是 |
- |
密码,加密存储 |
| real_name |
VARCHAR |
50 |
是 |
- |
真实姓名 |
| department |
VARCHAR |
50 |
是 |
- |
部门 |
| phone |
VARCHAR |
20 |
否 |
NULL |
联系电话 |
| email |
VARCHAR |
100 |
否 |
NULL |
邮箱 |
| role |
VARCHAR |
20 |
是 |
- |
角色 |
| status |
TINYINT |
1 |
是 |
1 |
状态:1-正常,0-禁用 |
| create_time |
DATETIME |
- |
是 |
CURRENT_TIMESTAMP |
创建时间 |
| update_time |
DATETIME |
- |
是 |
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |
更新时间 |
| last_login_time |
DATETIME |
- |
否 |
NULL |
最后登录时间 |
2.1.3 索引设计
- PRIMARY KEY: user_id
- UNIQUE KEY: uk_username (username)
- INDEX: idx_department (department)
- INDEX: idx_role (role)
- INDEX: idx_status (status)
2.1.4 外键约束
无
2.2 项目表 (project)
2.2.1 表说明
存储项目的基本信息和详细内容。
2.2.2 表结构
| 字段名 |
数据类型 |
长度 |
是否必填 |
默认值 |
说明 |
| project_id |
VARCHAR |
32 |
是 |
- |
项目ID,主键 |
| project_no |
VARCHAR |
20 |
是 |
- |
项目编号,唯一 |
| project_name |
VARCHAR |
200 |
是 |
- |
项目名称 |
| status |
VARCHAR |
20 |
是 |
'NOT_STARTED' |
项目状态 |
| create_time |
DATETIME |
- |
是 |
CURRENT_TIMESTAMP |
创建时间 |
| creator |
VARCHAR |
50 |
是 |
- |
创建人 |
| update_time |
DATETIME |
- |
是 |
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |
最后修改时间 |
| last_modifier |
VARCHAR |
50 |
否 |
NULL |
最后修改人 |
| leader |
VARCHAR |
50 |
是 |
- |
负责人 |
| phone |
VARCHAR |
20 |
否 |
NULL |
联系电话 |
| email |
VARCHAR |
100 |
否 |
NULL |
邮箱 |
| background |
TEXT |
- |
否 |
NULL |
项目背景 |
| goal |
TEXT |
- |
否 |
NULL |
项目目标 |
| scope |
TEXT |
- |
否 |
NULL |
项目范围 |
| start_date |
DATE |
- |
是 |
- |
开始日期 |
| planned_end_date |
DATE |
- |
是 |
- |
预计结束日期 |
| actual_end_date |
DATE |
- |
否 |
NULL |
实际结束日期 |
| total_budget |
DECIMAL |
15,2 |
是 |
0.00 |
总预算 |
| used_budget |
DECIMAL |
15,2 |
是 |
0.00 |
已使用预算 |
| remaining_budget |
DECIMAL |
15,2 |
是 |
0.00 |
剩余预算 |
| remarks |
TEXT |
- |
否 |
NULL |
备注 |
2.2.3 索引设计
- PRIMARY KEY: project_id
- UNIQUE KEY: uk_project_no (project_no)
- INDEX: idx_status (status)
- INDEX: idx_creator (creator)
- INDEX: idx_leader (leader)
- INDEX: idx_create_time (create_time)
- INDEX: idx_update_time (update_time)
2.2.4 外键约束
无
2.3 项目成员表 (project_member)
2.3.1 表说明
存储项目成员信息。
2.3.2 表结构
| 字段名 |
数据类型 |
长度 |
是否必填 |
默认值 |
说明 |
| member_id |
VARCHAR |
32 |
是 |
- |
成员ID,主键 |
| project_id |
VARCHAR |
32 |
是 |
- |
项目ID,外键 |
| name |
VARCHAR |
50 |
是 |
- |
姓名 |
| role |
VARCHAR |
50 |
是 |
- |
角色 |
| department |
VARCHAR |
50 |
是 |
- |
部门 |
| create_time |
DATETIME |
- |
是 |
CURRENT_TIMESTAMP |
创建时间 |
2.3.3 索引设计
- PRIMARY KEY: member_id
- INDEX: idx_project_id (project_id)
2.3.4 外键约束
- FOREIGN KEY: project_id -> project(project_id) ON DELETE CASCADE
2.4 项目里程碑表 (project_milestone)
2.4.1 表说明
存储项目里程碑信息。
2.4.2 表结构
| 字段名 |
数据类型 |
长度 |
是否必填 |
默认值 |
说明 |
| milestone_id |
VARCHAR |
32 |
是 |
- |
里程碑ID,主键 |
| project_id |
VARCHAR |
32 |
是 |
- |
项目ID,外键 |
| name |
VARCHAR |
200 |
是 |
- |
名称 |
| planned_date |
DATE |
- |
是 |
- |
计划日期 |
| actual_date |
DATE |
- |
否 |
NULL |
实际日期 |
| status |
VARCHAR |
20 |
是 |
'NOT_STARTED' |
状态 |
| create_time |
DATETIME |
- |
是 |
CURRENT_TIMESTAMP |
创建时间 |
| update_time |
DATETIME |
- |
是 |
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |
更新时间 |
2.4.3 索引设计
- PRIMARY KEY: milestone_id
- INDEX: idx_project_id (project_id)
- INDEX: idx_status (status)
2.4.4 外键约束
- FOREIGN KEY: project_id -> project(project_id) ON DELETE CASCADE
2.5 项目风险表 (project_risk)
2.5.1 表说明
存储项目风险信息。
2.5.2 表结构
| 字段名 |
数据类型 |
长度 |
是否必填 |
默认值 |
说明 |
| risk_id |
VARCHAR |
32 |
是 |
- |
风险ID,主键 |
| project_id |
VARCHAR |
32 |
是 |
- |
项目ID,外键 |
| description |
TEXT |
- |
是 |
- |
描述 |
| level |
VARCHAR |
20 |
是 |
- |
等级 |
| measure |
TEXT |
- |
是 |
- |
应对措施 |
| create_time |
DATETIME |
- |
是 |
CURRENT_TIMESTAMP |
创建时间 |
2.5.3 索引设计
- PRIMARY KEY: risk_id
- INDEX: idx_project_id (project_id)
- INDEX: idx_level (level)
2.5.4 外键约束
- FOREIGN KEY: project_id -> project(project_id) ON DELETE CASCADE
2.6 项目历史记录表 (project_history)
2.6.1 表说明
存储项目修改历史记录。
2.6.2 表结构
| 字段名 |
数据类型 |
长度 |
是否必填 |
默认值 |
说明 |
| history_id |
VARCHAR |
32 |
是 |
- |
历史记录ID,主键 |
| project_id |
VARCHAR |
32 |
是 |
- |
项目ID,外键 |
| project_no |
VARCHAR |
20 |
是 |
- |
项目编号 |
| operation_type |
VARCHAR |
20 |
是 |
- |
操作类型 |
| operator |
VARCHAR |
50 |
是 |
- |
操作人 |
| operation_time |
DATETIME |
- |
是 |
CURRENT_TIMESTAMP |
操作时间 |
| field_name |
VARCHAR |
100 |
是 |
- |
字段名 |
| old_value |
TEXT |
- |
否 |
NULL |
修改前值 |
| new_value |
TEXT |
- |
否 |
NULL |
修改后值 |
2.6.3 索引设计
- PRIMARY KEY: history_id
- INDEX: idx_project_id (project_id)
- INDEX: idx_project_no (project_no)
- INDEX: idx_operation_time (operation_time)
- INDEX: idx_operator (operator)
2.6.4 外键约束
- FOREIGN KEY: project_id -> project(project_id) ON DELETE CASCADE
2.7 操作日志表 (operation_log)
2.7.1 表说明
存储用户操作日志。
2.7.2 表结构
| 字段名 |
数据类型 |
长度 |
是否必填 |
默认值 |
说明 |
| log_id |
VARCHAR |
32 |
是 |
- |
日志ID,主键 |
| user_id |
VARCHAR |
32 |
是 |
- |
用户ID,外键 |
| username |
VARCHAR |
50 |
是 |
- |
用户名 |
| operation |
VARCHAR |
100 |
是 |
- |
操作内容 |
| ip_address |
VARCHAR |
50 |
否 |
NULL |
IP地址 |
| user_agent |
VARCHAR |
500 |
否 |
NULL |
用户代理 |
| operation_time |
DATETIME |
- |
是 |
CURRENT_TIMESTAMP |
操作时间 |
2.7.3 索引设计
- PRIMARY KEY: log_id
- INDEX: idx_user_id (user_id)
- INDEX: idx_operation_time (operation_time)
2.7.4 外键约束
- FOREIGN KEY: user_id -> sys_user(user_id) ON DELETE CASCADE
3. 数据库关系图
3.1 ER图描述
4. 数据字典
4.1 用户角色枚举值
| 值 |
说明 |
| ADMIN |
管理员 |
| MARKETING |
市场部 |
| OTHER |
其他部门 |
4.2 项目状态枚举值
| 值 |
说明 |
| NOT_STARTED |
未开始 |
| IN_PROGRESS |
进行中 |
| COMPLETED |
已完成 |
| PAUSED |
已暂停 |
| CANCELLED |
已取消 |
4.3 里程碑状态枚举值
| 值 |
说明 |
| NOT_STARTED |
未开始 |
| IN_PROGRESS |
进行中 |
| COMPLETED |
已完成 |
4.4 风险等级枚举值
| 值 |
说明 |
| HIGH |
高 |
| MEDIUM |
中 |
| LOW |
低 |
4.5 操作类型枚举值
| 值 |
说明 |
| CREATE |
创建 |
| UPDATE |
更新 |
| DELETE |
删除 |
4.6 部门枚举值
| 值 |
说明 |
| MARKETING |
市场部 |
| TECHNOLOGY |
技术部 |
| DESIGN |
设计部 |
| FINANCE |
财务部 |
| HR |
人力资源部 |
5. 数据库初始化脚本
5.1 建表脚本
-- 创建用户表
CREATE TABLE sys_user (
user_id VARCHAR(32) PRIMARY KEY COMMENT '用户ID',
username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
password VARCHAR(128) NOT NULL COMMENT '密码',
real_name VARCHAR(50) NOT NULL COMMENT '真实姓名',
department VARCHAR(50) NOT NULL COMMENT '部门',
phone VARCHAR(20) COMMENT '联系电话',
email VARCHAR(100) COMMENT '邮箱',
role VARCHAR(20) NOT NULL COMMENT '角色',
status TINYINT(1) NOT NULL DEFAULT 1 COMMENT '状态:1-正常,0-禁用',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
last_login_time DATETIME COMMENT '最后登录时间',
INDEX idx_department (department),
INDEX idx_role (role),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
-- 创建项目表
CREATE TABLE project (
project_id VARCHAR(32) PRIMARY KEY COMMENT '项目ID',
project_no VARCHAR(20) NOT NULL UNIQUE COMMENT '项目编号',
project_name VARCHAR(200) NOT NULL COMMENT '项目名称',
status VARCHAR(20) NOT NULL DEFAULT 'NOT_STARTED' COMMENT '项目状态',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
creator VARCHAR(50) NOT NULL COMMENT '创建人',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
last_modifier VARCHAR(50) COMMENT '最后修改人',
leader VARCHAR(50) NOT NULL COMMENT '负责人',
phone VARCHAR(20) COMMENT '联系电话',
email VARCHAR(100) COMMENT '邮箱',
background TEXT COMMENT '项目背景',
goal TEXT COMMENT '项目目标',
scope TEXT COMMENT '项目范围',
start_date DATE NOT NULL COMMENT '开始日期',
planned_end_date DATE NOT NULL COMMENT '预计结束日期',
actual_end_date DATE COMMENT '实际结束日期',
total_budget DECIMAL(15,2) NOT NULL DEFAULT 0.00 COMMENT '总预算',
used_budget DECIMAL(15,2) NOT NULL DEFAULT 0.00 COMMENT '已使用预算',
remaining_budget DECIMAL(15,2) NOT NULL DEFAULT 0.00 COMMENT '剩余预算',
remarks TEXT COMMENT '备注',
INDEX idx_status (status),
INDEX idx_creator (creator),
INDEX idx_leader (leader),
INDEX idx_create_time (create_time),
INDEX idx_update_time (update_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目表';
-- 创建项目成员表
CREATE TABLE project_member (
member_id VARCHAR(32) PRIMARY KEY COMMENT '成员ID',
project_id VARCHAR(32) NOT NULL COMMENT '项目ID',
name VARCHAR(50) NOT NULL COMMENT '姓名',
role VARCHAR(50) NOT NULL COMMENT '角色',
department VARCHAR(50) NOT NULL COMMENT '部门',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
FOREIGN KEY (project_id) REFERENCES project(project_id) ON DELETE CASCADE,
INDEX idx_project_id (project_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目成员表';
-- 创建项目里程碑表
CREATE TABLE project_milestone (
milestone_id VARCHAR(32) PRIMARY KEY COMMENT '里程碑ID',
project_id VARCHAR(32) NOT NULL COMMENT '项目ID',
name VARCHAR(200) NOT NULL COMMENT '名称',
planned_date DATE NOT NULL COMMENT '计划日期',
actual_date DATE COMMENT '实际日期',
status VARCHAR(20) NOT NULL DEFAULT 'NOT_STARTED' COMMENT '状态',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
FOREIGN KEY (project_id) REFERENCES project(project_id) ON DELETE CASCADE,
INDEX idx_project_id (project_id),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目里程碑表';
-- 创建项目风险表
CREATE TABLE project_risk (
risk_id VARCHAR(32) PRIMARY KEY COMMENT '风险ID',
project_id VARCHAR(32) NOT NULL COMMENT '项目ID',
description TEXT NOT NULL COMMENT '描述',
level VARCHAR(20) NOT NULL COMMENT '等级',
measure TEXT NOT NULL COMMENT '应对措施',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
FOREIGN KEY (project_id) REFERENCES project(project_id) ON DELETE CASCADE,
INDEX idx_project_id (project_id),
INDEX idx_level (level)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目风险表';
-- 创建项目历史记录表
CREATE TABLE project_history (
history_id VARCHAR(32) PRIMARY KEY COMMENT '历史记录ID',
project_id VARCHAR(32) NOT NULL COMMENT '项目ID',
project_no VARCHAR(20) NOT NULL COMMENT '项目编号',
operation_type VARCHAR(20) NOT NULL COMMENT '操作类型',
operator VARCHAR(50) NOT NULL COMMENT '操作人',
operation_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
field_name VARCHAR(100) NOT NULL COMMENT '字段名',
old_value TEXT COMMENT '修改前值',
new_value TEXT COMMENT '修改后值',
FOREIGN KEY (project_id) REFERENCES project(project_id) ON DELETE CASCADE,
INDEX idx_project_id (project_id),
INDEX idx_project_no (project_no),
INDEX idx_operation_time (operation_time),
INDEX idx_operator (operator)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目历史记录表';
-- 创建操作日志表
CREATE TABLE operation_log (
log_id VARCHAR(32) PRIMARY KEY COMMENT '日志ID',
user_id VARCHAR(32) NOT NULL COMMENT '用户ID',
username VARCHAR(50) NOT NULL COMMENT '用户名',
operation VARCHAR(100) NOT NULL COMMENT '操作内容',
ip_address VARCHAR(50) COMMENT 'IP地址',
user_agent VARCHAR(500) COMMENT '用户代理',
operation_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
FOREIGN KEY (user_id) REFERENCES sys_user(user_id) ON DELETE CASCADE,
INDEX idx_user_id (user_id),
INDEX idx_operation_time (operation_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作日志表';
5.2 初始化数据脚本
6. 数据库性能优化建议
6.1 索引优化
- 为常用查询字段创建索引
- 避免在索引列上进行函数操作
- 定期分析和优化索引
6.2 查询优化
- 避免使用SELECT *
- 合理使用JOIN
- 使用分页查询减少数据传输量
- 对大表进行分区处理
6.3 存储优化
- 定期清理历史数据
- 对大文本字段考虑单独存储
- 使用合适的数据类型减少存储空间
6.4 备份策略
7. 数据库安全建议
7.1 访问控制
- 使用最小权限原则
- 定期修改数据库密码
- 限制数据库访问IP
7.2 数据加密
- 敏感字段加密存储
- 使用SSL连接数据库
- 定期更新加密算法
7.3 审计日志
- 记录所有数据库操作
- 定期审计日志
- 异常操作及时报警
8. 附录
8.1 变更记录
| 版本 |
日期 |
修改人 |
修改内容 |
| V1.0 |
2026-01-26 |
- |
初始版本创建 |