# 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