646 lines
20 KiB
Markdown
646 lines
20 KiB
Markdown
# Contract-Manager 数据库设计文档
|
||
|
||
## 📊 概览
|
||
|
||
Contract-Manager 系统采用 MySQL 8.0+ 作为主数据库,设计遵循第三范式(3NF),支持高并发访问和数据一致性。本文档详细描述了数据库设计架构、表结构、关系设计和维护策略。
|
||
|
||
### 数据库基本信息
|
||
- **数据库类型**: MySQL 8.0+
|
||
- **数据库名称**: supplier_ms
|
||
- **字符集**: utf8mb4
|
||
- **排序规则**: utf8mb4_unicode_ci
|
||
- **存储引擎**: InnoDB(支持事务和外键约束)
|
||
|
||
---
|
||
|
||
## 🏗️ 数据库架构设计
|
||
|
||
### 核心业务域
|
||
|
||
#### 1. 用户权限管理域
|
||
- **员工管理**: EMPLOYEE, EMPLOYEE_ROLE, EMPLOYEE_AUTH_BIND
|
||
- **角色管理**: EMPLOYEE_ROLE, FUNCTION
|
||
- **登录历史**: EMPLOYEE_LOGIN_HISTORY
|
||
- **权限功能**: FUNCTION
|
||
|
||
#### 2. 企业管理域
|
||
- **公司信息**: COMPANY, COMPANY_FILE_TYPE_LOCAL
|
||
- **银行信息**: BANK
|
||
- **供应商管理**: COMPANY_VENDOR_ENTITY, VENDOR_TYPE_LOCAL
|
||
- **客户管理**: CUSTOMER, CUSTOMER_FILE_TYPE_LOCAL
|
||
|
||
#### 3. 合同管理域
|
||
- **合同基础**: CONTRACT, CONTRACT_FILE_TYPE_LOCAL
|
||
- **合同发票**: CONTRACT_INVOICE
|
||
- **销售订单**: CONTRACT_SALES_ORDER
|
||
- **合同余额**: CONTRACT_BALANCE
|
||
|
||
#### 4. 项目管理域
|
||
- **项目信息**: PROJECT, PROJECT_FILE_TYPE_LOCAL
|
||
- **项目资金计划**: PROJECT_FUND_PLAN_TABLE
|
||
- **库存管理**: INVENTORY
|
||
|
||
#### 5. 基础数据域
|
||
- **单位管理**: UNIT
|
||
- **云服务数据**: CLOUD_TYC, CLOUD_RK, CLOUD_YU
|
||
|
||
---
|
||
|
||
## 📋 核心表结构设计
|
||
|
||
### 1. 用户权限相关表
|
||
|
||
#### EMPLOYEE (员工表)
|
||
```sql
|
||
CREATE TABLE EMPLOYEE (
|
||
ID INT AUTO_INCREMENT PRIMARY KEY,
|
||
NAME VARCHAR(255) NOT NULL COMMENT '员工姓名',
|
||
ACCOUNT VARCHAR(255) UNIQUE NOT NULL COMMENT '登录账号',
|
||
PASSWORD VARCHAR(255) NOT NULL COMMENT '密码哈希',
|
||
EMAIL VARCHAR(255) COMMENT '邮箱',
|
||
PHONE VARCHAR(50) COMMENT '电话',
|
||
IS_ACTIVE BOOLEAN DEFAULT TRUE COMMENT '是否激活',
|
||
CREATE_TIME DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||
UPDATE_TIME DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||
CONSTRAINT uq_employee_account UNIQUE KEY (ACCOUNT)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||
```
|
||
|
||
#### EMPLOYEE_ROLE (员工角色表)
|
||
```sql
|
||
CREATE TABLE EMPLOYEE_ROLE (
|
||
ID INT AUTO_INCREMENT PRIMARY KEY,
|
||
ROLE_NAME VARCHAR(255) NOT NULL COMMENT '角色名称',
|
||
DESCRIPTION TEXT COMMENT '角色描述',
|
||
SYSTEM_ADMINISTRATOR BOOLEAN DEFAULT FALSE COMMENT '是否系统管理员',
|
||
IS_ACTIVE BOOLEAN DEFAULT TRUE COMMENT '是否激活',
|
||
CREATE_TIME DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||
UPDATE_TIME DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||
```
|
||
|
||
#### EMPLOYEE_AUTH_BIND (员工认证绑定表)
|
||
```sql
|
||
CREATE TABLE EMPLOYEE_AUTH_BIND (
|
||
ID INT AUTO_INCREMENT PRIMARY KEY,
|
||
EMPLOYEE_ID INT NOT NULL COMMENT '员工ID',
|
||
MAC VARCHAR(255) NOT NULL COMMENT 'MAC地址',
|
||
IP VARCHAR(255) NOT NULL COMMENT 'IP地址',
|
||
BIND_TIME DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||
CONSTRAINT fk_employee_auth_bind_employee FOREIGN KEY (EMPLOYEE_ID) REFERENCES EMPLOYEE(ID)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||
```
|
||
|
||
### 2. 企业管理相关表
|
||
|
||
#### COMPANY (公司表)
|
||
```sql
|
||
CREATE TABLE COMPANY (
|
||
ID INT AUTO_INCREMENT PRIMARY KEY,
|
||
NAME VARCHAR(255) NOT NULL COMMENT '公司名称',
|
||
ADDRESS TEXT COMMENT '地址',
|
||
PHONE VARCHAR(50) COMMENT '电话',
|
||
EMAIL VARCHAR(255) COMMENT '邮箱',
|
||
LEGAL_PERSON VARCHAR(255) COMMENT '法人代表',
|
||
BUSINESS_LICENSE VARCHAR(255) COMMENT '营业执照号',
|
||
IS_VENDOR BOOLEAN DEFAULT FALSE COMMENT '是否供应商',
|
||
IS_CUSTOMER BOOLEAN DEFAULT FALSE COMMENT '是否客户',
|
||
CREATE_TIME DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||
UPDATE_TIME DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||
```
|
||
|
||
#### VENDOR_TYPE_LOCAL (供应商类型本地化表)
|
||
```sql
|
||
CREATE TABLE VENDOR_TYPE_LOCAL (
|
||
ID INT AUTO_INCREMENT PRIMARY KEY,
|
||
TYPE VARCHAR(255) NOT NULL COMMENT '枚举类型',
|
||
LANG VARCHAR(255) NOT NULL COMMENT '语言',
|
||
VALUE VARCHAR(255) NOT NULL COMMENT '本地化值',
|
||
CONSTRAINT pk_vendor_type_local PRIMARY KEY (ID),
|
||
CONSTRAINT uq_vendor_type_local UNIQUE KEY (TYPE, LANG)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||
```
|
||
|
||
### 3. 合同管理相关表
|
||
|
||
#### CONTRACT (合同表)
|
||
```sql
|
||
CREATE TABLE CONTRACT (
|
||
ID INT AUTO_INCREMENT PRIMARY KEY,
|
||
CODE VARCHAR(100) UNIQUE NOT NULL COMMENT '合同编号',
|
||
NAME VARCHAR(500) NOT NULL COMMENT '合同名称',
|
||
CUSTOMER_ID INT COMMENT '客户ID',
|
||
VENDOR_ID INT COMMENT '供应商ID',
|
||
PROJECT_ID INT COMMENT '项目ID',
|
||
SIGN_DATE DATE COMMENT '签订日期',
|
||
START_DATE DATE COMMENT '开始日期',
|
||
END_DATE DATE COMMENT '结束日期',
|
||
AMOUNT DECIMAL(15,2) COMMENT '合同金额',
|
||
STATUS VARCHAR(50) DEFAULT 'ACTIVE' COMMENT '合同状态',
|
||
CREATE_TIME DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||
UPDATE_TIME DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||
CONSTRAINT fk_contract_customer FOREIGN KEY (CUSTOMER_ID) REFERENCES COMPANY(ID),
|
||
CONSTRAINT fk_contract_vendor FOREIGN KEY (VENDOR_ID) REFERENCES COMPANY(ID),
|
||
CONSTRAINT fk_contract_project FOREIGN KEY (PROJECT_ID) REFERENCES PROJECT(ID)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||
```
|
||
|
||
#### CONTRACT_INVOICE (合同发票关联表)
|
||
```sql
|
||
CREATE TABLE CONTRACT_INVOICE (
|
||
ID INT AUTO_INCREMENT PRIMARY KEY,
|
||
CODE VARCHAR(50) COMMENT '发票编号',
|
||
NAME VARCHAR(200) COMMENT '发票名称',
|
||
CONTRACT_ID INT NOT NULL COMMENT '合同ID',
|
||
INVOICE_ID INT COMMENT '发票ID',
|
||
AMOUNT DECIMAL(15,2) COMMENT '发票金额',
|
||
SETUP_PERSON_ID INT COMMENT '创建人ID',
|
||
SETUP_DATE DATE COMMENT '创建日期',
|
||
UPDATE_PERSON_ID INT COMMENT '更新人ID',
|
||
UPDATE_DATE DATE COMMENT '更新日期',
|
||
REMARK VARCHAR(500) COMMENT '备注',
|
||
CONSTRAINT fk_contract_invoice_contract FOREIGN KEY (CONTRACT_ID) REFERENCES CONTRACT(ID) ON DELETE CASCADE,
|
||
CONSTRAINT fk_contract_invoice_invoice FOREIGN KEY (INVOICE_ID) REFERENCES INVOICE(ID) ON DELETE SET NULL,
|
||
CONSTRAINT fk_contract_invoice_setup_person FOREIGN KEY (SETUP_PERSON_ID) REFERENCES EMPLOYEE(ID) ON DELETE SET NULL,
|
||
CONSTRAINT fk_contract_invoice_update_person FOREIGN KEY (UPDATE_PERSON_ID) REFERENCES EMPLOYEE(ID) ON DELETE SET NULL
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||
```
|
||
|
||
### 4. 文件类型本地化表
|
||
|
||
#### COMPANY_FILE_TYPE_LOCAL (公司文件类型本地化表)
|
||
```sql
|
||
CREATE TABLE COMPANY_FILE_TYPE_LOCAL (
|
||
ID INT AUTO_INCREMENT PRIMARY KEY,
|
||
TYPE VARCHAR(255) NOT NULL COMMENT '枚举类型',
|
||
LANG VARCHAR(255) NOT NULL COMMENT '语言',
|
||
VALUE VARCHAR(255) NOT NULL COMMENT '本地化值',
|
||
CONSTRAINT pk_company_file_type_local PRIMARY KEY (ID),
|
||
CONSTRAINT uq_company_file_type_local UNIQUE KEY (TYPE, LANG)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||
```
|
||
|
||
#### CONTRACT_FILE_TYPE_LOCAL (合同文件类型本地化表)
|
||
```sql
|
||
CREATE TABLE CONTRACT_FILE_TYPE_LOCAL (
|
||
ID INT AUTO_INCREMENT PRIMARY KEY,
|
||
TYPE VARCHAR(255) NOT NULL COMMENT '枚举类型',
|
||
LANG VARCHAR(255) NOT NULL COMMENT '语言',
|
||
VALUE VARCHAR(255) NOT NULL COMMENT '本地化值',
|
||
SUGGEST_FILE_NAME VARCHAR(255) COMMENT '建议的文件名',
|
||
DESCRIPTION VARCHAR(255) COMMENT '描述',
|
||
CONSTRAINT pk_contract_file_type_local PRIMARY KEY (ID),
|
||
CONSTRAINT uq_contract_file_type_local UNIQUE KEY (TYPE, LANG)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||
```
|
||
|
||
---
|
||
|
||
## 🔗 数据库关系设计
|
||
|
||
### 1. 核心实体关系图
|
||
|
||
```mermaid
|
||
erDiagram
|
||
EMPLOYEE ||--o{ EMPLOYEE_AUTH_BIND : has
|
||
EMPLOYEE ||--o{ EMPLOYEE_LOGIN_HISTORY : creates
|
||
EMPLOYEE }o--|| EMPLOYEE_ROLE : belongs
|
||
|
||
COMPANY ||--o{ CONTRACT : creates
|
||
COMPANY ||--o{ PROJECT : has
|
||
COMPANY ||--o{ COMPANY_VENDOR_ENTITY : is_vendor
|
||
COMPANY ||--o{ COMPANY_VENDOR_ENTITY : is_customer
|
||
|
||
CONTRACT ||--o{ CONTRACT_INVOICE : contains
|
||
CONTRACT ||--o{ CONTRACT_SALES_ORDER : has
|
||
CONTRACT ||--o{ CONTRACT_BALANCE : has
|
||
|
||
PROJECT ||--o{ PROJECT_FUND_PLAN_TABLE : has
|
||
PROJECT ||--o{ INVENTORY : manages
|
||
|
||
VENDOR_TYPE_LOCAL }o--|| COMPANY_VENDOR_ENTITY : types
|
||
FILE_TYPE_LOCAL }o--o| COMPANY : documents
|
||
FILE_TYPE_LOCAL }o--o| CONTRACT : documents
|
||
```
|
||
|
||
### 2. 外键约束设计
|
||
|
||
#### 核心外键关系
|
||
```sql
|
||
-- 员工与角色关联
|
||
ALTER TABLE EMPLOYEE
|
||
ADD CONSTRAINT fk_employee_role
|
||
FOREIGN KEY (ROLE_ID) REFERENCES EMPLOYEE_ROLE(ID);
|
||
|
||
-- 合同与客户供应商关联
|
||
ALTER TABLE CONTRACT
|
||
ADD CONSTRAINT fk_contract_customer
|
||
FOREIGN KEY (CUSTOMER_ID) REFERENCES COMPANY(ID);
|
||
|
||
-- 合同发票关联
|
||
ALTER TABLE CONTRACT_INVOICE
|
||
ADD CONSTRAINT fk_contract_invoice_contract
|
||
FOREIGN KEY (CONTRACT_ID) REFERENCES CONTRACT(ID) ON DELETE CASCADE;
|
||
```
|
||
|
||
### 3. 索引设计策略
|
||
|
||
#### 主要索引
|
||
```sql
|
||
-- 单列索引
|
||
CREATE INDEX idx_employee_account ON EMPLOYEE(ACCOUNT);
|
||
CREATE INDEX idx_contract_code ON CONTRACT(CODE);
|
||
CREATE INDEX idx_company_name ON COMPANY(NAME);
|
||
|
||
-- 复合索引
|
||
CREATE INDEX idx_contract_customer_status ON CONTRACT(CUSTOMER_ID, STATUS);
|
||
CREATE INDEX idx_invoice_date_amount ON INVOICE(INVOICE_DATE, AMOUNT);
|
||
|
||
-- 外键索引
|
||
CREATE INDEX idx_contract_invoice_contract_id ON CONTRACT_INVOICE(CONTRACT_ID);
|
||
CREATE INDEX idx_employee_auth_bind_employee ON EMPLOYEE_AUTH_BIND(EMPLOYEE_ID);
|
||
```
|
||
|
||
---
|
||
|
||
## 🎯 本地化设计
|
||
|
||
### 1. 多语言支持
|
||
|
||
#### 本地化表设计原则
|
||
- **统一结构**: 所有本地化表使用相同的结构
|
||
- **语言键**: 使用LANG字段标识语言(zh_CN, en_US)
|
||
- **类型分类**: 使用TYPE字段进行分类管理
|
||
- **唯一约束**: (TYPE, LANG)组合唯一
|
||
|
||
#### 本地化表示例
|
||
```sql
|
||
-- 合同文件类型本地化
|
||
TYPE: 'CONTRACT_CERTIFICATE', LANG: 'zh_CN', VALUE: '资质证书'
|
||
TYPE: 'CONTRACT_CERTIFICATE', LANG: 'en_US', VALUE: 'Certificate'
|
||
|
||
-- 供应商类型本地化
|
||
TYPE: 'VENDOR_PRIMARY', LANG: 'zh_CN', VALUE: '主要供应商'
|
||
TYPE: 'VENDOR_PRIMARY', LANG: 'en_US', VALUE: 'Primary Vendor'
|
||
```
|
||
|
||
### 2. 数据维护策略
|
||
|
||
#### 本地化数据初始化
|
||
```sql
|
||
-- 初始化供应商类型本地化数据
|
||
INSERT INTO VENDOR_TYPE_LOCAL (TYPE, LANG, VALUE) VALUES
|
||
('VENDOR_PRIMARY', 'zh_CN', '主要供应商'),
|
||
('VENDOR_PRIMARY', 'en_US', 'Primary Vendor'),
|
||
('VENDOR_SECONDARY', 'zh_CN', '次要供应商'),
|
||
('VENDOR_SECONDARY', 'en_US', 'Secondary Vendor');
|
||
|
||
-- 初始化合同文件类型本地化数据
|
||
INSERT INTO CONTRACT_FILE_TYPE_LOCAL (TYPE, LANG, VALUE, SUGGEST_FILE_NAME, DESCRIPTION) VALUES
|
||
('CONTRACT_MAIN', 'zh_CN', '主合同', 'main_contract.pdf', '主要合同文件'),
|
||
('CONTRACT_MAIN', 'en_US', 'Main Contract', 'main_contract.pdf', 'Main contract document'),
|
||
('CONTRACT_CERTIFICATE', 'zh_CN', '资质证书', 'certificate.pdf', '相关资质证书'),
|
||
('CONTRACT_CERTIFICATE', 'en_US', 'Certificate', 'certificate.pdf', 'Related certificates');
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 数据库脚本管理
|
||
|
||
### 1. 脚本文件组织
|
||
|
||
```
|
||
docs/db/
|
||
├── structs.sql # 数据库结构脚本
|
||
├── initial_data.sql # 初始数据脚本
|
||
├── CompanyFileTypeLocal.sql # 公司文件类型本地化
|
||
├── ContractFileTypeLocal.sql # 合同文件类型本地化
|
||
├── CustomerFileTypeLocal.sql # 客户文件类型本地化
|
||
├── ProjectFileTypeLocal.sql # 项目文件类型本地化
|
||
├── VendorFileTypeLocal.sql # 供应商文件类型本地化
|
||
├── VendorTypeLocal.sql # 供应商类型本地化
|
||
├── Unit.sql # 单位基础数据
|
||
├── CompanyVendor.sql # 公司供应商关联表
|
||
├── Contract_INVOICE.sql # 合同发票关联表
|
||
├── Contract_SALES_ORDER.sql # 合同销售订单表
|
||
├── Contract_BALANCE.sql # 合同余额表
|
||
├── Inverntory.sql # 库存表
|
||
├── project_fund_plan_table.sql # 项目资金计划表
|
||
├── add_function_columns.sql # 功能扩展列脚本
|
||
├── temp.sql # 临时脚本
|
||
└── temp_u8.sql # 临时U8脚本
|
||
```
|
||
|
||
### 2. 脚本执行顺序
|
||
|
||
#### 环境初始化脚本执行顺序
|
||
```bash
|
||
# 1. 创建数据库和基础表结构
|
||
mysql -u root -p < structs.sql
|
||
|
||
# 2. 初始化基础数据
|
||
mysql -u root -p < initial_data.sql
|
||
|
||
# 3. 初始化本地化数据
|
||
mysql -u root -p < CompanyFileTypeLocal.sql
|
||
mysql -u root -p < ContractFileTypeLocal.sql
|
||
mysql -u root -p < CustomerFileTypeLocal.sql
|
||
mysql -u root -p < ProjectFileTypeLocal.sql
|
||
mysql -u root -p < VendorFileTypeLocal.sql
|
||
mysql -u root -p < VendorTypeLocal.sql
|
||
|
||
# 4. 初始化基础字典数据
|
||
mysql -u root -p < Unit.sql
|
||
|
||
# 5. 业务表数据
|
||
mysql -u root -p < Contract_INVOICE.sql
|
||
mysql -u root -p < Contract_SALES_ORDER.sql
|
||
mysql -u root -p < Contract_BALANCE.sql
|
||
mysql -u root -p < Inverntory.sql
|
||
mysql -u root -p < project_fund_plan_table.sql
|
||
|
||
# 6. 数据关联和约束
|
||
mysql -u root -p < CompanyVendor.sql
|
||
|
||
# 7. 功能扩展(如需要)
|
||
mysql -u root -p < add_function_columns.sql
|
||
```
|
||
|
||
### 3. 版本控制策略
|
||
|
||
#### 数据库版本管理
|
||
- **结构版本**: 通过版本号管理数据库结构变更
|
||
- **数据迁移**: 使用迁移脚本管理数据变更
|
||
- **回滚策略**: 保持完整的回滚脚本
|
||
|
||
#### 迁移脚本模板
|
||
```sql
|
||
-- 版本: v1.0.1
|
||
-- 描述: 添加员工激活状态字段
|
||
-- 日期: 2024-01-15
|
||
|
||
-- 前置检查
|
||
SELECT 'Starting migration v1.0.1' as status;
|
||
|
||
-- 添加字段
|
||
ALTER TABLE EMPLOYEE
|
||
ADD COLUMN IS_ACTIVE BOOLEAN DEFAULT TRUE COMMENT '是否激活';
|
||
|
||
-- 更新现有数据
|
||
UPDATE EMPLOYEE SET IS_ACTIVE = TRUE WHERE IS_ACTIVE IS NULL;
|
||
|
||
-- 验证
|
||
SELECT COUNT(*) as total_employees FROM EMPLOYEE;
|
||
|
||
SELECT 'Migration v1.0.1 completed' as status;
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 性能优化策略
|
||
|
||
### 1. 索引优化
|
||
|
||
#### 查询模式分析
|
||
- **高频查询**: 员工登录(ACCOUNT字段)
|
||
- **分页查询**: 合同列表(STATUS, CREATE_TIME)
|
||
- **关联查询**: 合同客户信息(CUSTOMER_ID)
|
||
- **搜索查询**: 公司名称模糊搜索(NAME字段)
|
||
|
||
#### 索引配置建议
|
||
```sql
|
||
-- 高频查询索引
|
||
CREATE INDEX idx_employee_account_active ON EMPLOYEE(ACCOUNT, IS_ACTIVE);
|
||
CREATE INDEX idx_contract_status_date ON CONTRACT(STATUS, CREATE_TIME DESC);
|
||
|
||
-- 搜索优化索引
|
||
CREATE INDEX idx_company_name_prefix ON COMPANY(NAME(20));
|
||
|
||
-- 关联查询索引
|
||
CREATE INDEX idx_contract_customer_status ON CONTRACT(CUSTOMER_ID, STATUS);
|
||
|
||
-- 统计查询索引
|
||
CREATE INDEX idx_invoice_date_amount ON INVOICE(INVOICE_DATE, AMOUNT);
|
||
```
|
||
|
||
### 2. 分区策略
|
||
|
||
#### 时间分区设计
|
||
```sql
|
||
-- 登录历史表时间分区(月度分区)
|
||
ALTER TABLE EMPLOYEE_LOGIN_HISTORY
|
||
PARTITION BY RANGE (YEAR(LOGIN_TIME)*100 + MONTH(LOGIN_TIME)) (
|
||
PARTITION p202401 VALUES LESS THAN (202402),
|
||
PARTITION p202402 VALUES LESS THAN (202403),
|
||
PARTITION p202403 VALUES LESS THAN (202404),
|
||
-- ... 更多分区
|
||
PARTITION p_max VALUES LESS THAN MAXVALUE
|
||
);
|
||
```
|
||
|
||
### 3. 缓存策略
|
||
|
||
#### Redis缓存配置
|
||
```yaml
|
||
# 缓存配置
|
||
spring:
|
||
cache:
|
||
type: redis
|
||
redis:
|
||
timeout: 2000ms
|
||
lettuce:
|
||
pool:
|
||
max-active: 8
|
||
max-idle: 8
|
||
min-idle: 0
|
||
max-wait: -1ms
|
||
|
||
# 缓存策略
|
||
cache:
|
||
# 员工信息缓存(5分钟)
|
||
employee:
|
||
timeout: 300
|
||
# 公司信息缓存(10分钟)
|
||
company:
|
||
timeout: 600
|
||
# 合同信息缓存(2分钟)
|
||
contract:
|
||
timeout: 120
|
||
```
|
||
|
||
---
|
||
|
||
## 🔒 安全与权限
|
||
|
||
### 1. 数据权限控制
|
||
|
||
#### 行级安全
|
||
```sql
|
||
-- 基于角色的数据访问控制
|
||
CREATE VIEW contract_view AS
|
||
SELECT c.* FROM CONTRACT c
|
||
WHERE
|
||
CASE
|
||
WHEN EXISTS (SELECT 1 FROM EMPLOYEE e JOIN EMPLOYEE_ROLE er ON e.ROLE_ID = er.ID
|
||
WHERE e.ID = CURRENT_USER_ID() AND er.SYSTEM_ADMINISTRATOR = TRUE)
|
||
THEN TRUE
|
||
ELSE c.CREATOR_ID = CURRENT_USER_ID()
|
||
END;
|
||
```
|
||
|
||
#### 敏感字段加密
|
||
```sql
|
||
-- 员工密码加密存储
|
||
ALTER TABLE EMPLOYEE
|
||
MODIFY COLUMN PASSWORD VARCHAR(255) NOT NULL COMMENT 'BCrypt加密密码';
|
||
|
||
-- 敏感信息脱敏
|
||
CREATE VIEW employee_safe_view AS
|
||
SELECT
|
||
ID, NAME, ACCOUNT,
|
||
SUBSTRING(EMAIL, 1, 2) || '****' || SUBSTRING(EMAIL, INSTR(EMAIL, '@')) as EMAIL_MASKED,
|
||
PHONE_MASKED
|
||
FROM EMPLOYEE;
|
||
```
|
||
|
||
### 2. 数据备份策略
|
||
|
||
#### 备份配置
|
||
```bash
|
||
#!/bin/bash
|
||
# 数据库备份脚本
|
||
|
||
DB_NAME="supplier_ms"
|
||
BACKUP_DIR="/backup/mysql"
|
||
DATE=$(date +%Y%m%d_%H%M%S)
|
||
|
||
# 全量备份
|
||
mysqldump -u backup_user -p$BACKUP_PASSWORD \
|
||
--single-transaction \
|
||
--routines \
|
||
--triggers \
|
||
$DB_NAME > $BACKUP_DIR/${DB_NAME}_full_$DATE.sql
|
||
|
||
# 增量备份(二进制日志)
|
||
mysql -u root -p$ROOT_PASSWORD -e "FLUSH LOGS;"
|
||
cp /var/lib/mysql/mysql-bin.* $BACKUP_DIR/incremental_$DATE/
|
||
|
||
# 清理旧备份(保留30天)
|
||
find $BACKUP_DIR -name "${DB_NAME}_*.sql" -mtime +30 -delete
|
||
```
|
||
|
||
---
|
||
|
||
## 📈 监控与维护
|
||
|
||
### 1. 性能监控
|
||
|
||
#### 关键指标
|
||
- **连接数**: 当前连接数和最大连接数
|
||
- **查询性能**: 慢查询日志和执行时间分布
|
||
- **缓存命中率**: Redis缓存命中率
|
||
- **锁等待**: 表锁和行锁等待情况
|
||
|
||
#### 监控查询
|
||
```sql
|
||
-- 查看当前连接数
|
||
SHOW STATUS LIKE 'Threads_connected';
|
||
SHOW STATUS LIKE 'Max_used_connections';
|
||
|
||
-- 查看慢查询
|
||
SELECT * FROM mysql.slow_log
|
||
ORDER BY start_time DESC LIMIT 10;
|
||
|
||
-- 查看表大小
|
||
SELECT
|
||
table_name,
|
||
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'Size (MB)'
|
||
FROM information_schema.tables
|
||
WHERE table_schema = 'supplier_ms'
|
||
ORDER BY (data_length + index_length) DESC;
|
||
```
|
||
|
||
### 2. 维护任务
|
||
|
||
#### 定期维护任务
|
||
```sql
|
||
-- 优化表(每周执行)
|
||
OPTIMIZE TABLE EMPLOYEE, COMPANY, CONTRACT, PROJECT;
|
||
|
||
-- 分析表统计信息(每日执行)
|
||
ANALYZE TABLE EMPLOYEE, COMPANY, CONTRACT;
|
||
|
||
-- 检查表完整性(每日执行)
|
||
CHECK TABLE EMPLOYEE, COMPANY, CONTRACT;
|
||
|
||
-- 清理历史数据(每月执行)
|
||
DELETE FROM EMPLOYEE_LOGIN_HISTORY
|
||
WHERE LOGIN_TIME < DATE_SUB(NOW(), INTERVAL 1 YEAR);
|
||
```
|
||
|
||
---
|
||
|
||
## 🚀 扩展设计
|
||
|
||
### 1. 分库分表策略
|
||
|
||
#### 水平分片设计
|
||
```sql
|
||
-- 按年份分表的合同表
|
||
CONTRACT_2024, CONTRACT_2025, CONTRACT_2026
|
||
|
||
-- 分片键选择
|
||
CREATE TABLE CONTRACT (
|
||
ID BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||
YEAR int NOT NULL COMMENT '年份',
|
||
CONTRACT_CODE varchar(100) NOT NULL,
|
||
-- 其他字段...
|
||
INDEX idx_year_contract_code (YEAR, CONTRACT_CODE)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||
|
||
-- 分片路由规则
|
||
function getContractTable(year) {
|
||
return "CONTRACT_" + year;
|
||
}
|
||
```
|
||
|
||
### 2. 数据归档策略
|
||
|
||
#### 历史数据归档
|
||
```sql
|
||
-- 创建归档表
|
||
CREATE TABLE CONTRACT_ARCHIVE LIKE CONTRACT;
|
||
|
||
-- 归档5年前的数据
|
||
INSERT INTO CONTRACT_ARCHIVE
|
||
SELECT * FROM CONTRACT
|
||
WHERE CREATE_TIME < DATE_SUB(NOW(), INTERVAL 5 YEAR);
|
||
|
||
-- 删除已归档数据
|
||
DELETE FROM CONTRACT
|
||
WHERE CREATE_TIME < DATE_SUB(NOW(), INTERVAL 5 YEAR);
|
||
```
|
||
|
||
---
|
||
|
||
## 📚 文档维护
|
||
|
||
### 1. 文档更新机制
|
||
- **表结构变更**: 同步更新文档
|
||
- **关系变更**: 更新ER图和关系说明
|
||
- **性能优化**: 记录优化历史和效果
|
||
- **安全更新**: 记录权限变更和风险控制
|
||
|
||
### 2. 版本管理
|
||
- **文档版本**: v1.0.0, v1.1.0, v1.2.0
|
||
- **变更记录**: 详细记录每次变更内容
|
||
- **影响评估**: 分析变更对系统的影响
|
||
|
||
---
|
||
|
||
*本文档详细描述了 Contract-Manager 系统的数据库设计和维护策略。请在数据库结构变更时同步更新本文档,确保文档与实际系统保持一致。*
|
||
|
||
**文档版本**: v1.2.0
|
||
**最后更新**: 2024-03-01
|
||
**维护团队**: Contract Manager Development Team |