数据库设计
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 迁移执行
-
进入项目目录:
-
执行数据库迁移:
7. 性能优化
7.1 索引优化
- 添加适当的索引:为频繁查询的字段添加索引
- 避免过度索引:不要为所有字段添加索引,只为必要的字段添加
- 使用复合索引:对于多字段查询,使用复合索引
7.2 查询优化
- 使用分页查询:避免一次性加载大量数据
- 使用索引覆盖查询:减少回表操作
- 避免全表扫描:使用索引进行查询
- 使用预编译语句:减少 SQL 解析时间
7.3 连接池优化
- 使用 HikariCP:高性能的数据库连接池
- 配置合理的连接数:根据系统负载配置连接数
- 设置连接超时:避免连接占用过长时间
8. 安全考虑
8.1 数据加密
- 密码加密:使用 BCrypt 加密用户密码
- 敏感数据加密:对敏感数据进行加密存储
8.2 访问控制
- 最小权限原则:只授予必要的数据库权限
- 使用参数化查询:防止 SQL 注入攻击
- 定期审计:定期审计数据库访问日志
9. 总结
本数据库设计文档详细介绍了 Crawlful Hub 项目的数据库表结构、索引和关系。通过合理的数据库设计,确保了系统的性能和可靠性。