Files
xsl_node/docs/数据库设计文档.md
2026-01-26 12:29:56 +08:00

17 KiB
Raw Permalink Blame History

项目管理系统数据库设计文档

文档信息

  • 文档版本: 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图描述

sys_user (用户表)
    |
    | 1
    |
    | N
    |
operation_log (操作日志表)

project (项目表)
    |
    | 1
    |
    | N
    |
    +-- project_member (项目成员表)
    |
    | 1
    |
    | N
    |
    +-- project_milestone (项目里程碑表)
    |
    | 1
    |
    | N
    |
    +-- project_risk (项目风险表)
    |
    | 1
    |
    | N
    |
    +-- project_history (项目历史记录表)

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 初始化数据脚本

-- 插入管理员用户
INSERT INTO sys_user (user_id, username, password, real_name, department, role, status)
VALUES ('admin001', 'admin', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iAt6Z5EH', '系统管理员', 'ADMIN', 'ADMIN', 1);

-- 插入市场部用户
INSERT INTO sys_user (user_id, username, password, real_name, department, role, status)
VALUES ('marketing001', 'marketing', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iAt6Z5EH', '市场部经理', 'MARKETING', 'MARKETING', 1);

-- 插入其他部门用户
INSERT INTO sys_user (user_id, username, password, real_name, department, role, status)
VALUES ('other001', 'other', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iAt6Z5EH', '技术部经理', 'TECHNOLOGY', 'OTHER', 1);

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 - 初始版本创建