Files
makemd/docs/05_Database_Design.md

307 lines
11 KiB
Markdown
Raw Normal View History

2026-03-30 16:55:04 +08:00
# 数据库设计
## 1. 数据库概述
Crawlful Hub 项目使用 MySQL 8.0 作为数据库,采用了关系型数据库设计,确保数据的一致性和完整性。本文档详细介绍了项目的数据库表结构、索引和关系。
## 2. 数据库表结构
### 2.1 用户表cf_user
| 字段名 | 数据类型 | 约束 | 描述 |
|-------|---------|------|------|
| id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 用户 ID |
| tenant_id | VARCHAR(255) | NOT NULL | 租户 ID |
| username | VARCHAR(255) | NOT NULL, UNIQUE | 用户名 |
| password | VARCHAR(255) | NOT NULL | 密码(加密存储) |
| email | VARCHAR(255) | NOT NULL, UNIQUE | 邮箱 |
| role | VARCHAR(50) | | 角色 |
| created_at | DATETIME | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
| updated_at | DATETIME | DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 更新时间 |
### 2.2 商品表cf_product
| 字段名 | 数据类型 | 约束 | 描述 |
|-------|---------|------|------|
| id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 商品 ID |
| tenant_id | VARCHAR(255) | NOT NULL | 租户 ID |
| shop_id | VARCHAR(255) | | 店铺 ID |
| title | VARCHAR(255) | NOT NULL | 商品标题 |
| description | TEXT | | 商品描述 |
| main_image | VARCHAR(255) | | 商品主图 |
| platform | VARCHAR(50) | | 平台 |
| platform_product_id | VARCHAR(255) | | 平台商品 ID |
| price | DECIMAL(10,2) | | 价格 |
| cost_price | DECIMAL(10,2) | | 成本价格 |
| quantity | INT | | 数量 |
| status | VARCHAR(50) | | 状态 |
| phash | VARCHAR(255) | | 图片哈希 |
| semantic_hash | VARCHAR(255) | | 语义哈希 |
| vector_embedding | TEXT | | 向量嵌入 |
| attributes | JSON | | 属性 |
| created_at | DATETIME | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
| updated_at | DATETIME | DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 更新时间 |
### 2.3 订单表cf_order
| 字段名 | 数据类型 | 约束 | 描述 |
|-------|---------|------|------|
| id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 订单 ID |
| tenant_id | VARCHAR(255) | NOT NULL | 租户 ID |
| shop_id | VARCHAR(255) | | 店铺 ID |
| platform | VARCHAR(50) | | 平台 |
| platform_order_id | VARCHAR(255) | | 平台订单 ID |
| status | VARCHAR(50) | | 状态 |
| total_amount | DECIMAL(10,2) | | 总金额 |
| currency | VARCHAR(10) | | 货币 |
| customer_info | JSON | | 客户信息 |
| items | JSON | | 商品列表 |
| shipping_address | JSON | | shipping 地址 |
| tracking_number | VARCHAR(255) | | 跟踪号 |
| created_at | DATETIME | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
| updated_at | DATETIME | DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 更新时间 |
### 2.4 支付表cf_payment
| 字段名 | 数据类型 | 约束 | 描述 |
|-------|---------|------|------|
| id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 支付 ID |
| tenant_id | VARCHAR(255) | NOT NULL | 租户 ID |
| order_id | BIGINT | FOREIGN KEY (order_id) REFERENCES cf_order(id) | 订单 ID |
| payment_method | VARCHAR(50) | | 支付方式 |
| amount | DECIMAL(10,2) | | 金额 |
| currency | VARCHAR(10) | | 货币 |
| status | VARCHAR(50) | | 状态 |
| transaction_id | VARCHAR(255) | | 交易 ID |
| created_at | DATETIME | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
| updated_at | DATETIME | DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 更新时间 |
### 2.5 物流表cf_logistics
| 字段名 | 数据类型 | 约束 | 描述 |
|-------|---------|------|------|
| id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 物流 ID |
| tenant_id | VARCHAR(255) | NOT NULL | 租户 ID |
| order_id | BIGINT | FOREIGN KEY (order_id) REFERENCES cf_order(id) | 订单 ID |
| shipping_method | VARCHAR(50) | | 物流方式 |
| tracking_number | VARCHAR(255) | | 跟踪号 |
| carrier | VARCHAR(50) | | 物流公司 |
| status | VARCHAR(50) | | 状态 |
| estimated_delivery_date | DATETIME | | 预计送达日期 |
| actual_delivery_date | DATETIME | | 实际送达日期 |
| created_at | DATETIME | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
| updated_at | DATETIME | DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 更新时间 |
### 2.6 告警表cf_alert
| 字段名 | 数据类型 | 约束 | 描述 |
|-------|---------|------|------|
| id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 告警 ID |
| tenant_id | VARCHAR(255) | NOT NULL | 租户 ID |
| alert_type | VARCHAR(50) | | 告警类型 |
| severity | VARCHAR(50) | | 严重程度 |
| message | TEXT | | 告警消息 |
| status | VARCHAR(50) | | 状态 |
| source | VARCHAR(255) | | 告警来源 |
| threshold | VARCHAR(255) | | 阈值 |
| actual_value | VARCHAR(255) | | 实际值 |
| created_at | DATETIME | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
| resolved_at | DATETIME | | 解决时间 |
### 2.7 审计表cf_audit
| 字段名 | 数据类型 | 约束 | 描述 |
|-------|---------|------|------|
| id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 审计日志 ID |
| tenant_id | VARCHAR(255) | | 租户 ID |
| shop_id | VARCHAR(255) | | 店铺 ID |
| user_id | BIGINT | | 用户 ID |
| action | VARCHAR(255) | | 操作类型 |
| resource_type | VARCHAR(255) | | 资源类型 |
| resource_id | VARCHAR(255) | | 资源 ID |
| ip_address | VARCHAR(100) | | IP 地址 |
| user_agent | TEXT | | 用户代理 |
| details | TEXT | | 详细信息 |
| created_at | DATETIME | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
### 2.8 配置表cf_config
| 字段名 | 数据类型 | 约束 | 描述 |
|-------|---------|------|------|
| id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 配置 ID |
| tenant_id | VARCHAR(255) | | 租户 ID |
| shop_id | VARCHAR(255) | | 店铺 ID |
| config_key | VARCHAR(255) | NOT NULL | 配置键 |
| config_value | VARCHAR(255) | NOT NULL | 配置值 |
| config_type | VARCHAR(50) | | 配置类型 |
| description | TEXT | | 配置描述 |
| created_at | DATETIME | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
| updated_at | DATETIME | DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 更新时间 |
## 3. 索引设计
### 3.1 用户表索引
| 索引名 | 字段 | 类型 | 描述 |
|-------|------|------|------|
| PRIMARY | id | PRIMARY | 主键索引 |
| idx_user_tenant_id | tenant_id | INDEX | 租户 ID 索引 |
| UNIQUE | username | UNIQUE | 用户名唯一索引 |
| UNIQUE | email | UNIQUE | 邮箱唯一索引 |
### 3.2 商品表索引
| 索引名 | 字段 | 类型 | 描述 |
|-------|------|------|------|
| PRIMARY | id | PRIMARY | 主键索引 |
| idx_product_tenant_id | tenant_id | INDEX | 租户 ID 索引 |
| idx_product_platform | platform | INDEX | 平台索引 |
### 3.3 订单表索引
| 索引名 | 字段 | 类型 | 描述 |
|-------|------|------|------|
| PRIMARY | id | PRIMARY | 主键索引 |
| idx_order_tenant_id | tenant_id | INDEX | 租户 ID 索引 |
| idx_order_platform | platform | INDEX | 平台索引 |
### 3.4 支付表索引
| 索引名 | 字段 | 类型 | 描述 |
|-------|------|------|------|
| PRIMARY | id | PRIMARY | 主键索引 |
| idx_payment_tenant_id | tenant_id | INDEX | 租户 ID 索引 |
| idx_payment_order_id | order_id | INDEX | 订单 ID 索引 |
### 3.5 物流表索引
| 索引名 | 字段 | 类型 | 描述 |
|-------|------|------|------|
| PRIMARY | id | PRIMARY | 主键索引 |
| idx_logistics_tenant_id | tenant_id | INDEX | 租户 ID 索引 |
| idx_logistics_order_id | order_id | INDEX | 订单 ID 索引 |
### 3.6 告警表索引
| 索引名 | 字段 | 类型 | 描述 |
|-------|------|------|------|
| PRIMARY | id | PRIMARY | 主键索引 |
| idx_alert_tenant_id | tenant_id | INDEX | 租户 ID 索引 |
| idx_alert_status | status | INDEX | 状态索引 |
| idx_alert_severity | severity | INDEX | 严重程度索引 |
| idx_alert_alert_type | alert_type | INDEX | 告警类型索引 |
| idx_alert_created_at | created_at | INDEX | 创建时间索引 |
### 3.7 审计表索引
| 索引名 | 字段 | 类型 | 描述 |
|-------|------|------|------|
| PRIMARY | id | PRIMARY | 主键索引 |
| idx_audit_tenant_id | tenant_id | INDEX | 租户 ID 索引 |
| idx_audit_shop_id | shop_id | INDEX | 店铺 ID 索引 |
| idx_audit_user_id | user_id | INDEX | 用户 ID 索引 |
| idx_audit_action | action | INDEX | 操作类型索引 |
| idx_audit_resource_type | resource_type | INDEX | 资源类型索引 |
| idx_audit_created_at | created_at | INDEX | 创建时间索引 |
### 3.8 配置表索引
| 索引名 | 字段 | 类型 | 描述 |
|-------|------|------|------|
| PRIMARY | id | PRIMARY | 主键索引 |
| idx_config_tenant_id | tenant_id | INDEX | 租户 ID 索引 |
| idx_config_shop_id | shop_id | INDEX | 店铺 ID 索引 |
| idx_config_key | config_key | INDEX | 配置键索引 |
## 4. 关系设计
### 4.1 表关系
- **用户与订单**:一对多关系,一个用户可以创建多个订单
- **订单与支付**:一对一关系,一个订单对应一个支付
- **订单与物流**:一对一关系,一个订单对应一个物流
- **租户与所有表**:一对多关系,一个租户可以有多个用户、商品、订单等
### 4.2 外键约束
| 表名 | 外键字段 | 引用表 | 引用字段 | 约束 |
|------|---------|--------|---------|------|
| cf_payment | order_id | cf_order | id | ON DELETE CASCADE |
| cf_logistics | order_id | cf_order | id | ON DELETE CASCADE |
## 5. 数据类型选择
### 5.1 字符串类型
- **VARCHAR**:用于存储可变长度的字符串,如用户名、邮箱等
- **TEXT**:用于存储较长的文本,如商品描述、详细信息等
- **JSON**:用于存储 JSON 格式的数据,如客户信息、商品列表等
### 5.2 数值类型
- **BIGINT**:用于存储较大的整数,如 ID 等
- **INT**:用于存储整数,如数量等
- **DECIMAL(10,2)**:用于存储金额,确保精度
### 5.3 日期类型
- **DATETIME**:用于存储日期和时间,如创建时间、更新时间等
## 6. 数据库迁移
Crawlful Hub 项目使用 Flyway 进行数据库迁移,确保数据库结构的版本控制和一致性。
### 6.1 迁移脚本
| 脚本名 | 描述 |
|-------|------|
| V1__init_schema.sql | 初始化数据库表结构 |
| V2__add_alert_table.sql | 添加告警表 |
### 6.2 迁移执行
1. 进入项目目录:
```bash
cd d:\trae_projects\makemd\makemd\serverjava
```
2. 执行数据库迁移:
```bash
mvn flyway:migrate
```
## 7. 性能优化
### 7.1 索引优化
- **添加适当的索引**:为频繁查询的字段添加索引
- **避免过度索引**:不要为所有字段添加索引,只为必要的字段添加
- **使用复合索引**:对于多字段查询,使用复合索引
### 7.2 查询优化
- **使用分页查询**:避免一次性加载大量数据
- **使用索引覆盖查询**:减少回表操作
- **避免全表扫描**:使用索引进行查询
- **使用预编译语句**:减少 SQL 解析时间
### 7.3 连接池优化
- **使用 HikariCP**:高性能的数据库连接池
- **配置合理的连接数**:根据系统负载配置连接数
- **设置连接超时**:避免连接占用过长时间
## 8. 安全考虑
### 8.1 数据加密
- **密码加密**:使用 BCrypt 加密用户密码
- **敏感数据加密**:对敏感数据进行加密存储
### 8.2 访问控制
- **最小权限原则**:只授予必要的数据库权限
- **使用参数化查询**:防止 SQL 注入攻击
- **定期审计**:定期审计数据库访问日志
## 9. 总结
本数据库设计文档详细介绍了 Crawlful Hub 项目的数据库表结构、索引和关系。通过合理的数据库设计,确保了系统的性能和可靠性。