1200 lines
45 KiB
Markdown
1200 lines
45 KiB
Markdown
|
|
# 数据库设计文档
|
|||
|
|
|
|||
|
|
## 版本历史
|
|||
|
|
| 版本 | 日期 | 作者 | 变更说明 |
|
|||
|
|
|------|------|------|----------|
|
|||
|
|
| 1.0 | 2024-01-20 | 后端团队 | 初始版本 |
|
|||
|
|
|
|||
|
|
## 1. 数据库概述
|
|||
|
|
|
|||
|
|
### 1.1 设计原则
|
|||
|
|
- **规范化**: 遵循数据库范式,减少数据冗余
|
|||
|
|
- **性能优化**: 合理设计索引,优化查询性能
|
|||
|
|
- **扩展性**: 支持水平和垂直扩展
|
|||
|
|
- **一致性**: 保证数据的完整性和一致性
|
|||
|
|
- **安全性**: 敏感数据加密存储
|
|||
|
|
- **可维护性**: 清晰的表结构和命名规范
|
|||
|
|
|
|||
|
|
### 1.2 技术选型
|
|||
|
|
- **主数据库**: MySQL 8.0
|
|||
|
|
- **缓存数据库**: Redis 7.0
|
|||
|
|
- **文档数据库**: MongoDB 6.0 (用于日志和非结构化数据)
|
|||
|
|
- **搜索引擎**: Elasticsearch 8.0 (用于全文搜索)
|
|||
|
|
|
|||
|
|
### 1.3 数据库架构
|
|||
|
|
```
|
|||
|
|
┌─────────────────────────────────────────────────────────────┐
|
|||
|
|
│ 应用层 (Application) │
|
|||
|
|
├─────────────────────────────────────────────────────────────┤
|
|||
|
|
│ 缓存层 (Redis) │
|
|||
|
|
├─────────────────────────────────────────────────────────────┤
|
|||
|
|
│ 主数据库 (MySQL Master) │
|
|||
|
|
├─────────────────────────────────────────────────────────────┤
|
|||
|
|
│ 从数据库 (MySQL Slaves) │
|
|||
|
|
├─────────────────────────────────────────────────────────────┤
|
|||
|
|
│ 文档数据库 (MongoDB) | 搜索引擎 (ES) │
|
|||
|
|
└─────────────────────────────────────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 2. MySQL数据库设计
|
|||
|
|
|
|||
|
|
### 2.1 数据库命名规范
|
|||
|
|
- **数据库名**: 使用小写字母和下划线,如 `xlxumu_main`
|
|||
|
|
- **表名**: 使用小写字母和下划线,复数形式,如 `users`, `farm_animals`
|
|||
|
|
- **字段名**: 使用小写字母和下划线,如 `user_id`, `created_at`
|
|||
|
|
- **索引名**: 使用 `idx_` 前缀,如 `idx_users_phone`
|
|||
|
|
- **外键名**: 使用 `fk_` 前缀,如 `fk_orders_user_id`
|
|||
|
|
|
|||
|
|
### 2.2 核心表结构
|
|||
|
|
|
|||
|
|
#### 2.2.1 用户相关表
|
|||
|
|
|
|||
|
|
**用户表 (users)**
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE `users` (
|
|||
|
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID',
|
|||
|
|
`username` varchar(50) NOT NULL COMMENT '用户名',
|
|||
|
|
`phone` varchar(20) NOT NULL COMMENT '手机号',
|
|||
|
|
`email` varchar(100) DEFAULT NULL COMMENT '邮箱',
|
|||
|
|
`password_hash` varchar(255) NOT NULL COMMENT '密码哈希',
|
|||
|
|
`salt` varchar(32) NOT NULL COMMENT '密码盐值',
|
|||
|
|
`avatar` varchar(255) DEFAULT NULL COMMENT '头像URL',
|
|||
|
|
`real_name` varchar(50) DEFAULT NULL COMMENT '真实姓名',
|
|||
|
|
`id_card` varchar(18) DEFAULT NULL COMMENT '身份证号',
|
|||
|
|
`gender` tinyint(1) DEFAULT NULL COMMENT '性别:1-男,2-女',
|
|||
|
|
`birthday` date DEFAULT NULL COMMENT '生日',
|
|||
|
|
`address` varchar(255) DEFAULT NULL COMMENT '地址',
|
|||
|
|
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:0-禁用,1-正常',
|
|||
|
|
`last_login_at` timestamp NULL DEFAULT NULL COMMENT '最后登录时间',
|
|||
|
|
`last_login_ip` varchar(45) DEFAULT NULL COMMENT '最后登录IP',
|
|||
|
|
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|||
|
|
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|||
|
|
`deleted_at` timestamp NULL DEFAULT NULL COMMENT '删除时间',
|
|||
|
|
PRIMARY KEY (`id`),
|
|||
|
|
UNIQUE KEY `uk_users_username` (`username`),
|
|||
|
|
UNIQUE KEY `uk_users_phone` (`phone`),
|
|||
|
|
UNIQUE KEY `uk_users_email` (`email`),
|
|||
|
|
KEY `idx_users_status` (`status`),
|
|||
|
|
KEY `idx_users_created_at` (`created_at`)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**用户认证表 (user_auths)**
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE `user_auths` (
|
|||
|
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
|
|||
|
|
`user_id` bigint(20) unsigned NOT NULL COMMENT '用户ID',
|
|||
|
|
`auth_type` varchar(20) NOT NULL COMMENT '认证类型:password,wechat,qq,alipay',
|
|||
|
|
`auth_key` varchar(100) NOT NULL COMMENT '认证标识',
|
|||
|
|
`auth_secret` varchar(255) DEFAULT NULL COMMENT '认证密钥',
|
|||
|
|
`expires_at` timestamp NULL DEFAULT NULL COMMENT '过期时间',
|
|||
|
|
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|||
|
|
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|||
|
|
PRIMARY KEY (`id`),
|
|||
|
|
UNIQUE KEY `uk_user_auths_type_key` (`auth_type`, `auth_key`),
|
|||
|
|
KEY `fk_user_auths_user_id` (`user_id`),
|
|||
|
|
CONSTRAINT `fk_user_auths_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户认证表';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**用户角色表 (user_roles)**
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE `user_roles` (
|
|||
|
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
|
|||
|
|
`user_id` bigint(20) unsigned NOT NULL COMMENT '用户ID',
|
|||
|
|
`role_id` bigint(20) unsigned NOT NULL COMMENT '角色ID',
|
|||
|
|
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|||
|
|
PRIMARY KEY (`id`),
|
|||
|
|
UNIQUE KEY `uk_user_roles_user_role` (`user_id`, `role_id`),
|
|||
|
|
KEY `fk_user_roles_role_id` (`role_id`),
|
|||
|
|
CONSTRAINT `fk_user_roles_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
|
|||
|
|
CONSTRAINT `fk_user_roles_role_id` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户角色关联表';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2.2.2 权限相关表
|
|||
|
|
|
|||
|
|
**角色表 (roles)**
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE `roles` (
|
|||
|
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '角色ID',
|
|||
|
|
`name` varchar(50) NOT NULL COMMENT '角色名称',
|
|||
|
|
`code` varchar(50) NOT NULL COMMENT '角色编码',
|
|||
|
|
`description` varchar(255) DEFAULT NULL COMMENT '角色描述',
|
|||
|
|
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:0-禁用,1-正常',
|
|||
|
|
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|||
|
|
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|||
|
|
PRIMARY KEY (`id`),
|
|||
|
|
UNIQUE KEY `uk_roles_code` (`code`),
|
|||
|
|
KEY `idx_roles_status` (`status`)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色表';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**权限表 (permissions)**
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE `permissions` (
|
|||
|
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '权限ID',
|
|||
|
|
`name` varchar(50) NOT NULL COMMENT '权限名称',
|
|||
|
|
`code` varchar(100) NOT NULL COMMENT '权限编码',
|
|||
|
|
`type` varchar(20) NOT NULL COMMENT '权限类型:menu,button,api',
|
|||
|
|
`parent_id` bigint(20) unsigned DEFAULT NULL COMMENT '父权限ID',
|
|||
|
|
`path` varchar(255) DEFAULT NULL COMMENT '路径',
|
|||
|
|
`icon` varchar(50) DEFAULT NULL COMMENT '图标',
|
|||
|
|
`sort_order` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
|
|||
|
|
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:0-禁用,1-正常',
|
|||
|
|
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|||
|
|
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|||
|
|
PRIMARY KEY (`id`),
|
|||
|
|
UNIQUE KEY `uk_permissions_code` (`code`),
|
|||
|
|
KEY `idx_permissions_parent_id` (`parent_id`),
|
|||
|
|
KEY `idx_permissions_type` (`type`)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='权限表';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**角色权限表 (role_permissions)**
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE `role_permissions` (
|
|||
|
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
|
|||
|
|
`role_id` bigint(20) unsigned NOT NULL COMMENT '角色ID',
|
|||
|
|
`permission_id` bigint(20) unsigned NOT NULL COMMENT '权限ID',
|
|||
|
|
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|||
|
|
PRIMARY KEY (`id`),
|
|||
|
|
UNIQUE KEY `uk_role_permissions_role_permission` (`role_id`, `permission_id`),
|
|||
|
|
KEY `fk_role_permissions_permission_id` (`permission_id`),
|
|||
|
|
CONSTRAINT `fk_role_permissions_role_id` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE,
|
|||
|
|
CONSTRAINT `fk_role_permissions_permission_id` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色权限关联表';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2.2.3 养殖相关表
|
|||
|
|
|
|||
|
|
**养殖场表 (farms)**
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE `farms` (
|
|||
|
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '养殖场ID',
|
|||
|
|
`user_id` bigint(20) unsigned NOT NULL COMMENT '用户ID',
|
|||
|
|
`name` varchar(100) NOT NULL COMMENT '养殖场名称',
|
|||
|
|
`code` varchar(50) NOT NULL COMMENT '养殖场编码',
|
|||
|
|
`type` varchar(20) NOT NULL COMMENT '养殖类型:pig,cattle,sheep,chicken,fish',
|
|||
|
|
`area` decimal(10,2) DEFAULT NULL COMMENT '养殖面积(平方米)',
|
|||
|
|
`capacity` int(11) DEFAULT NULL COMMENT '养殖容量',
|
|||
|
|
`address` varchar(255) NOT NULL COMMENT '详细地址',
|
|||
|
|
`province` varchar(50) NOT NULL COMMENT '省份',
|
|||
|
|
`city` varchar(50) NOT NULL COMMENT '城市',
|
|||
|
|
`district` varchar(50) NOT NULL COMMENT '区县',
|
|||
|
|
`longitude` decimal(10,7) DEFAULT NULL COMMENT '经度',
|
|||
|
|
`latitude` decimal(10,7) DEFAULT NULL COMMENT '纬度',
|
|||
|
|
`license_number` varchar(100) DEFAULT NULL COMMENT '许可证号',
|
|||
|
|
`license_image` varchar(255) DEFAULT NULL COMMENT '许可证图片',
|
|||
|
|
`description` text COMMENT '养殖场描述',
|
|||
|
|
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:0-停用,1-正常,2-审核中',
|
|||
|
|
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|||
|
|
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|||
|
|
`deleted_at` timestamp NULL DEFAULT NULL COMMENT '删除时间',
|
|||
|
|
PRIMARY KEY (`id`),
|
|||
|
|
UNIQUE KEY `uk_farms_code` (`code`),
|
|||
|
|
KEY `fk_farms_user_id` (`user_id`),
|
|||
|
|
KEY `idx_farms_type` (`type`),
|
|||
|
|
KEY `idx_farms_status` (`status`),
|
|||
|
|
KEY `idx_farms_location` (`province`, `city`, `district`),
|
|||
|
|
CONSTRAINT `fk_farms_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='养殖场表';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**动物表 (animals)**
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE `animals` (
|
|||
|
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '动物ID',
|
|||
|
|
`farm_id` bigint(20) unsigned NOT NULL COMMENT '养殖场ID',
|
|||
|
|
`category_id` bigint(20) unsigned NOT NULL COMMENT '动物分类ID',
|
|||
|
|
`code` varchar(50) NOT NULL COMMENT '动物编号',
|
|||
|
|
`name` varchar(100) DEFAULT NULL COMMENT '动物名称',
|
|||
|
|
`breed` varchar(50) DEFAULT NULL COMMENT '品种',
|
|||
|
|
`gender` tinyint(1) DEFAULT NULL COMMENT '性别:1-雄性,2-雌性',
|
|||
|
|
`birth_date` date DEFAULT NULL COMMENT '出生日期',
|
|||
|
|
`weight` decimal(8,2) DEFAULT NULL COMMENT '体重(kg)',
|
|||
|
|
`health_status` varchar(20) NOT NULL DEFAULT 'healthy' COMMENT '健康状态:healthy,sick,dead',
|
|||
|
|
`parent_male_id` bigint(20) unsigned DEFAULT NULL COMMENT '父亲ID',
|
|||
|
|
`parent_female_id` bigint(20) unsigned DEFAULT NULL COMMENT '母亲ID',
|
|||
|
|
`purchase_price` decimal(10,2) DEFAULT NULL COMMENT '购买价格',
|
|||
|
|
`purchase_date` date DEFAULT NULL COMMENT '购买日期',
|
|||
|
|
`source` varchar(100) DEFAULT NULL COMMENT '来源',
|
|||
|
|
`notes` text COMMENT '备注',
|
|||
|
|
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:0-已出售,1-在养,2-死亡',
|
|||
|
|
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|||
|
|
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|||
|
|
`deleted_at` timestamp NULL DEFAULT NULL COMMENT '删除时间',
|
|||
|
|
PRIMARY KEY (`id`),
|
|||
|
|
UNIQUE KEY `uk_animals_code` (`code`),
|
|||
|
|
KEY `fk_animals_farm_id` (`farm_id`),
|
|||
|
|
KEY `fk_animals_category_id` (`category_id`),
|
|||
|
|
KEY `idx_animals_status` (`status`),
|
|||
|
|
KEY `idx_animals_health_status` (`health_status`),
|
|||
|
|
KEY `idx_animals_birth_date` (`birth_date`),
|
|||
|
|
CONSTRAINT `fk_animals_farm_id` FOREIGN KEY (`farm_id`) REFERENCES `farms` (`id`),
|
|||
|
|
CONSTRAINT `fk_animals_category_id` FOREIGN KEY (`category_id`) REFERENCES `animal_categories` (`id`)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='动物表';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**动物分类表 (animal_categories)**
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE `animal_categories` (
|
|||
|
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '分类ID',
|
|||
|
|
`name` varchar(50) NOT NULL COMMENT '分类名称',
|
|||
|
|
`code` varchar(20) NOT NULL COMMENT '分类编码',
|
|||
|
|
`parent_id` bigint(20) unsigned DEFAULT NULL COMMENT '父分类ID',
|
|||
|
|
`description` varchar(255) DEFAULT NULL COMMENT '分类描述',
|
|||
|
|
`sort_order` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
|
|||
|
|
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:0-禁用,1-正常',
|
|||
|
|
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|||
|
|
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|||
|
|
PRIMARY KEY (`id`),
|
|||
|
|
UNIQUE KEY `uk_animal_categories_code` (`code`),
|
|||
|
|
KEY `idx_animal_categories_parent_id` (`parent_id`)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='动物分类表';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2.2.4 健康管理表
|
|||
|
|
|
|||
|
|
**健康记录表 (health_records)**
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE `health_records` (
|
|||
|
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
|
|||
|
|
`animal_id` bigint(20) unsigned NOT NULL COMMENT '动物ID',
|
|||
|
|
`record_type` varchar(20) NOT NULL COMMENT '记录类型:checkup,vaccination,treatment,death',
|
|||
|
|
`record_date` date NOT NULL COMMENT '记录日期',
|
|||
|
|
`symptoms` text COMMENT '症状描述',
|
|||
|
|
`diagnosis` text COMMENT '诊断结果',
|
|||
|
|
`treatment` text COMMENT '治疗方案',
|
|||
|
|
`medicine` varchar(255) DEFAULT NULL COMMENT '用药',
|
|||
|
|
`dosage` varchar(100) DEFAULT NULL COMMENT '用药剂量',
|
|||
|
|
`veterinarian` varchar(50) DEFAULT NULL COMMENT '兽医',
|
|||
|
|
`cost` decimal(10,2) DEFAULT NULL COMMENT '费用',
|
|||
|
|
`next_checkup_date` date DEFAULT NULL COMMENT '下次检查日期',
|
|||
|
|
`notes` text COMMENT '备注',
|
|||
|
|
`images` json DEFAULT NULL COMMENT '相关图片',
|
|||
|
|
`created_by` bigint(20) unsigned NOT NULL COMMENT '创建人',
|
|||
|
|
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|||
|
|
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|||
|
|
PRIMARY KEY (`id`),
|
|||
|
|
KEY `fk_health_records_animal_id` (`animal_id`),
|
|||
|
|
KEY `idx_health_records_type` (`record_type`),
|
|||
|
|
KEY `idx_health_records_date` (`record_date`),
|
|||
|
|
CONSTRAINT `fk_health_records_animal_id` FOREIGN KEY (`animal_id`) REFERENCES `animals` (`id`)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='健康记录表';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**疫苗接种表 (vaccinations)**
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE `vaccinations` (
|
|||
|
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '接种ID',
|
|||
|
|
`animal_id` bigint(20) unsigned NOT NULL COMMENT '动物ID',
|
|||
|
|
`vaccine_name` varchar(100) NOT NULL COMMENT '疫苗名称',
|
|||
|
|
`vaccine_type` varchar(50) NOT NULL COMMENT '疫苗类型',
|
|||
|
|
`batch_number` varchar(50) DEFAULT NULL COMMENT '批次号',
|
|||
|
|
`manufacturer` varchar(100) DEFAULT NULL COMMENT '生产厂家',
|
|||
|
|
`vaccination_date` date NOT NULL COMMENT '接种日期',
|
|||
|
|
`next_vaccination_date` date DEFAULT NULL COMMENT '下次接种日期',
|
|||
|
|
`dosage` varchar(50) DEFAULT NULL COMMENT '接种剂量',
|
|||
|
|
`method` varchar(50) DEFAULT NULL COMMENT '接种方式',
|
|||
|
|
`veterinarian` varchar(50) DEFAULT NULL COMMENT '接种兽医',
|
|||
|
|
`cost` decimal(10,2) DEFAULT NULL COMMENT '费用',
|
|||
|
|
`side_effects` text COMMENT '副作用',
|
|||
|
|
`notes` text COMMENT '备注',
|
|||
|
|
`created_by` bigint(20) unsigned NOT NULL COMMENT '创建人',
|
|||
|
|
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|||
|
|
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|||
|
|
PRIMARY KEY (`id`),
|
|||
|
|
KEY `fk_vaccinations_animal_id` (`animal_id`),
|
|||
|
|
KEY `idx_vaccinations_date` (`vaccination_date`),
|
|||
|
|
KEY `idx_vaccinations_next_date` (`next_vaccination_date`),
|
|||
|
|
CONSTRAINT `fk_vaccinations_animal_id` FOREIGN KEY (`animal_id`) REFERENCES `animals` (`id`)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='疫苗接种表';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2.2.5 饲养管理表
|
|||
|
|
|
|||
|
|
**饲料表 (feeds)**
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE `feeds` (
|
|||
|
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '饲料ID',
|
|||
|
|
`name` varchar(100) NOT NULL COMMENT '饲料名称',
|
|||
|
|
`code` varchar(50) NOT NULL COMMENT '饲料编码',
|
|||
|
|
`type` varchar(20) NOT NULL COMMENT '饲料类型:concentrate,roughage,additive',
|
|||
|
|
`brand` varchar(50) DEFAULT NULL COMMENT '品牌',
|
|||
|
|
`specification` varchar(100) DEFAULT NULL COMMENT '规格',
|
|||
|
|
`unit` varchar(10) NOT NULL COMMENT '单位:kg,ton,bag',
|
|||
|
|
`protein_content` decimal(5,2) DEFAULT NULL COMMENT '蛋白质含量(%)',
|
|||
|
|
`fat_content` decimal(5,2) DEFAULT NULL COMMENT '脂肪含量(%)',
|
|||
|
|
`fiber_content` decimal(5,2) DEFAULT NULL COMMENT '纤维含量(%)',
|
|||
|
|
`moisture_content` decimal(5,2) DEFAULT NULL COMMENT '水分含量(%)',
|
|||
|
|
`energy_value` decimal(8,2) DEFAULT NULL COMMENT '能量值(MJ/kg)',
|
|||
|
|
`shelf_life` int(11) DEFAULT NULL COMMENT '保质期(天)',
|
|||
|
|
`storage_conditions` varchar(255) DEFAULT NULL COMMENT '储存条件',
|
|||
|
|
`description` text COMMENT '饲料描述',
|
|||
|
|
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:0-停用,1-正常',
|
|||
|
|
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|||
|
|
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|||
|
|
PRIMARY KEY (`id`),
|
|||
|
|
UNIQUE KEY `uk_feeds_code` (`code`),
|
|||
|
|
KEY `idx_feeds_type` (`type`),
|
|||
|
|
KEY `idx_feeds_status` (`status`)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='饲料表';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**饲养记录表 (feeding_records)**
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE `feeding_records` (
|
|||
|
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
|
|||
|
|
`farm_id` bigint(20) unsigned NOT NULL COMMENT '养殖场ID',
|
|||
|
|
`animal_id` bigint(20) unsigned DEFAULT NULL COMMENT '动物ID(可为空,表示批量饲养)',
|
|||
|
|
`feed_id` bigint(20) unsigned NOT NULL COMMENT '饲料ID',
|
|||
|
|
`feeding_date` date NOT NULL COMMENT '饲养日期',
|
|||
|
|
`feeding_time` time NOT NULL COMMENT '饲养时间',
|
|||
|
|
`quantity` decimal(10,2) NOT NULL COMMENT '饲料数量',
|
|||
|
|
`unit` varchar(10) NOT NULL COMMENT '单位',
|
|||
|
|
`cost` decimal(10,2) DEFAULT NULL COMMENT '费用',
|
|||
|
|
`weather` varchar(20) DEFAULT NULL COMMENT '天气',
|
|||
|
|
`temperature` decimal(4,1) DEFAULT NULL COMMENT '温度(℃)',
|
|||
|
|
`humidity` decimal(5,2) DEFAULT NULL COMMENT '湿度(%)',
|
|||
|
|
`notes` text COMMENT '备注',
|
|||
|
|
`created_by` bigint(20) unsigned NOT NULL COMMENT '创建人',
|
|||
|
|
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|||
|
|
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|||
|
|
PRIMARY KEY (`id`),
|
|||
|
|
KEY `fk_feeding_records_farm_id` (`farm_id`),
|
|||
|
|
KEY `fk_feeding_records_animal_id` (`animal_id`),
|
|||
|
|
KEY `fk_feeding_records_feed_id` (`feed_id`),
|
|||
|
|
KEY `idx_feeding_records_date` (`feeding_date`),
|
|||
|
|
CONSTRAINT `fk_feeding_records_farm_id` FOREIGN KEY (`farm_id`) REFERENCES `farms` (`id`),
|
|||
|
|
CONSTRAINT `fk_feeding_records_animal_id` FOREIGN KEY (`animal_id`) REFERENCES `animals` (`id`),
|
|||
|
|
CONSTRAINT `fk_feeding_records_feed_id` FOREIGN KEY (`feed_id`) REFERENCES `feeds` (`id`)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='饲养记录表';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2.2.6 交易相关表
|
|||
|
|
|
|||
|
|
**订单表 (orders)**
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE `orders` (
|
|||
|
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '订单ID',
|
|||
|
|
`order_no` varchar(32) NOT NULL COMMENT '订单号',
|
|||
|
|
`buyer_id` bigint(20) unsigned NOT NULL COMMENT '买家ID',
|
|||
|
|
`seller_id` bigint(20) unsigned NOT NULL COMMENT '卖家ID',
|
|||
|
|
`farm_id` bigint(20) unsigned NOT NULL COMMENT '养殖场ID',
|
|||
|
|
`order_type` varchar(20) NOT NULL COMMENT '订单类型:animal,product,service',
|
|||
|
|
`total_amount` decimal(12,2) NOT NULL COMMENT '订单总金额',
|
|||
|
|
`discount_amount` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '优惠金额',
|
|||
|
|
`shipping_fee` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '运费',
|
|||
|
|
`actual_amount` decimal(12,2) NOT NULL COMMENT '实付金额',
|
|||
|
|
`payment_method` varchar(20) DEFAULT NULL COMMENT '支付方式:alipay,wechat,bank',
|
|||
|
|
`payment_status` varchar(20) NOT NULL DEFAULT 'pending' COMMENT '支付状态:pending,paid,failed,refunded',
|
|||
|
|
`order_status` varchar(20) NOT NULL DEFAULT 'pending' COMMENT '订单状态:pending,confirmed,shipped,delivered,completed,cancelled',
|
|||
|
|
`shipping_address` json DEFAULT NULL COMMENT '收货地址',
|
|||
|
|
`shipping_method` varchar(20) DEFAULT NULL COMMENT '配送方式:express,pickup,delivery',
|
|||
|
|
`tracking_number` varchar(50) DEFAULT NULL COMMENT '物流单号',
|
|||
|
|
`notes` text COMMENT '订单备注',
|
|||
|
|
`paid_at` timestamp NULL DEFAULT NULL COMMENT '支付时间',
|
|||
|
|
`shipped_at` timestamp NULL DEFAULT NULL COMMENT '发货时间',
|
|||
|
|
`delivered_at` timestamp NULL DEFAULT NULL COMMENT '收货时间',
|
|||
|
|
`completed_at` timestamp NULL DEFAULT NULL COMMENT '完成时间',
|
|||
|
|
`cancelled_at` timestamp NULL DEFAULT NULL COMMENT '取消时间',
|
|||
|
|
`cancel_reason` varchar(255) DEFAULT NULL COMMENT '取消原因',
|
|||
|
|
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|||
|
|
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|||
|
|
PRIMARY KEY (`id`),
|
|||
|
|
UNIQUE KEY `uk_orders_order_no` (`order_no`),
|
|||
|
|
KEY `fk_orders_buyer_id` (`buyer_id`),
|
|||
|
|
KEY `fk_orders_seller_id` (`seller_id`),
|
|||
|
|
KEY `fk_orders_farm_id` (`farm_id`),
|
|||
|
|
KEY `idx_orders_status` (`order_status`),
|
|||
|
|
KEY `idx_orders_payment_status` (`payment_status`),
|
|||
|
|
KEY `idx_orders_created_at` (`created_at`),
|
|||
|
|
CONSTRAINT `fk_orders_buyer_id` FOREIGN KEY (`buyer_id`) REFERENCES `users` (`id`),
|
|||
|
|
CONSTRAINT `fk_orders_seller_id` FOREIGN KEY (`seller_id`) REFERENCES `users` (`id`),
|
|||
|
|
CONSTRAINT `fk_orders_farm_id` FOREIGN KEY (`farm_id`) REFERENCES `farms` (`id`)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单表';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**订单明细表 (order_items)**
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE `order_items` (
|
|||
|
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '明细ID',
|
|||
|
|
`order_id` bigint(20) unsigned NOT NULL COMMENT '订单ID',
|
|||
|
|
`item_type` varchar(20) NOT NULL COMMENT '商品类型:animal,product,service',
|
|||
|
|
`item_id` bigint(20) unsigned NOT NULL COMMENT '商品ID',
|
|||
|
|
`item_name` varchar(255) NOT NULL COMMENT '商品名称',
|
|||
|
|
`item_code` varchar(50) DEFAULT NULL COMMENT '商品编码',
|
|||
|
|
`item_spec` varchar(255) DEFAULT NULL COMMENT '商品规格',
|
|||
|
|
`unit_price` decimal(10,2) NOT NULL COMMENT '单价',
|
|||
|
|
`quantity` decimal(10,2) NOT NULL COMMENT '数量',
|
|||
|
|
`unit` varchar(10) NOT NULL COMMENT '单位',
|
|||
|
|
`subtotal` decimal(12,2) NOT NULL COMMENT '小计',
|
|||
|
|
`notes` text COMMENT '备注',
|
|||
|
|
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|||
|
|
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|||
|
|
PRIMARY KEY (`id`),
|
|||
|
|
KEY `fk_order_items_order_id` (`order_id`),
|
|||
|
|
KEY `idx_order_items_item` (`item_type`, `item_id`),
|
|||
|
|
CONSTRAINT `fk_order_items_order_id` FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`) ON DELETE CASCADE
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单明细表';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2.2.7 财务相关表
|
|||
|
|
|
|||
|
|
**财务记录表 (financial_records)**
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE `financial_records` (
|
|||
|
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
|
|||
|
|
`user_id` bigint(20) unsigned NOT NULL COMMENT '用户ID',
|
|||
|
|
`farm_id` bigint(20) unsigned DEFAULT NULL COMMENT '养殖场ID',
|
|||
|
|
`record_type` varchar(20) NOT NULL COMMENT '记录类型:income,expense',
|
|||
|
|
`category` varchar(50) NOT NULL COMMENT '分类:feed,medicine,equipment,labor,sale,other',
|
|||
|
|
`amount` decimal(12,2) NOT NULL COMMENT '金额',
|
|||
|
|
`description` varchar(255) NOT NULL COMMENT '描述',
|
|||
|
|
`related_id` bigint(20) unsigned DEFAULT NULL COMMENT '关联ID(订单ID等)',
|
|||
|
|
`related_type` varchar(20) DEFAULT NULL COMMENT '关联类型:order,purchase,salary',
|
|||
|
|
`payment_method` varchar(20) DEFAULT NULL COMMENT '支付方式',
|
|||
|
|
`receipt_image` varchar(255) DEFAULT NULL COMMENT '凭证图片',
|
|||
|
|
`record_date` date NOT NULL COMMENT '记录日期',
|
|||
|
|
`notes` text COMMENT '备注',
|
|||
|
|
`created_by` bigint(20) unsigned NOT NULL COMMENT '创建人',
|
|||
|
|
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|||
|
|
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|||
|
|
PRIMARY KEY (`id`),
|
|||
|
|
KEY `fk_financial_records_user_id` (`user_id`),
|
|||
|
|
KEY `fk_financial_records_farm_id` (`farm_id`),
|
|||
|
|
KEY `idx_financial_records_type` (`record_type`),
|
|||
|
|
KEY `idx_financial_records_category` (`category`),
|
|||
|
|
KEY `idx_financial_records_date` (`record_date`),
|
|||
|
|
CONSTRAINT `fk_financial_records_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`),
|
|||
|
|
CONSTRAINT `fk_financial_records_farm_id` FOREIGN KEY (`farm_id`) REFERENCES `farms` (`id`)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='财务记录表';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2.2.8 系统相关表
|
|||
|
|
|
|||
|
|
**系统配置表 (system_configs)**
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE `system_configs` (
|
|||
|
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '配置ID',
|
|||
|
|
`config_key` varchar(100) NOT NULL COMMENT '配置键',
|
|||
|
|
`config_value` text NOT NULL COMMENT '配置值',
|
|||
|
|
`config_type` varchar(20) NOT NULL DEFAULT 'string' COMMENT '配置类型:string,number,boolean,json',
|
|||
|
|
`description` varchar(255) DEFAULT NULL COMMENT '配置描述',
|
|||
|
|
`is_public` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否公开:0-否,1-是',
|
|||
|
|
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|||
|
|
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|||
|
|
PRIMARY KEY (`id`),
|
|||
|
|
UNIQUE KEY `uk_system_configs_key` (`config_key`)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统配置表';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**操作日志表 (operation_logs)**
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE `operation_logs` (
|
|||
|
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '日志ID',
|
|||
|
|
`user_id` bigint(20) unsigned DEFAULT NULL COMMENT '用户ID',
|
|||
|
|
`module` varchar(50) NOT NULL COMMENT '模块',
|
|||
|
|
`action` varchar(50) NOT NULL COMMENT '操作',
|
|||
|
|
`method` varchar(10) NOT NULL COMMENT '请求方法',
|
|||
|
|
`url` varchar(255) NOT NULL COMMENT '请求URL',
|
|||
|
|
`ip` varchar(45) NOT NULL COMMENT 'IP地址',
|
|||
|
|
`user_agent` varchar(500) DEFAULT NULL COMMENT '用户代理',
|
|||
|
|
`request_data` json DEFAULT NULL COMMENT '请求数据',
|
|||
|
|
`response_data` json DEFAULT NULL COMMENT '响应数据',
|
|||
|
|
`status_code` int(11) NOT NULL COMMENT '状态码',
|
|||
|
|
`execution_time` int(11) NOT NULL COMMENT '执行时间(ms)',
|
|||
|
|
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|||
|
|
PRIMARY KEY (`id`),
|
|||
|
|
KEY `idx_operation_logs_user_id` (`user_id`),
|
|||
|
|
KEY `idx_operation_logs_module` (`module`),
|
|||
|
|
KEY `idx_operation_logs_created_at` (`created_at`)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='操作日志表';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2.3 索引设计
|
|||
|
|
|
|||
|
|
#### 2.3.1 主键索引
|
|||
|
|
所有表都使用自增的 `bigint` 类型作为主键,确保唯一性和性能。
|
|||
|
|
|
|||
|
|
#### 2.3.2 唯一索引
|
|||
|
|
- 用户表:用户名、手机号、邮箱
|
|||
|
|
- 养殖场表:养殖场编码
|
|||
|
|
- 动物表:动物编号
|
|||
|
|
- 订单表:订单号
|
|||
|
|
|
|||
|
|
#### 2.3.3 普通索引
|
|||
|
|
- 状态字段:便于按状态查询
|
|||
|
|
- 时间字段:便于按时间范围查询
|
|||
|
|
- 外键字段:提高关联查询性能
|
|||
|
|
- 分类字段:便于分类统计
|
|||
|
|
|
|||
|
|
#### 2.3.4 复合索引
|
|||
|
|
```sql
|
|||
|
|
-- 用户角色复合索引
|
|||
|
|
CREATE INDEX idx_user_roles_user_role ON user_roles (user_id, role_id);
|
|||
|
|
|
|||
|
|
-- 订单状态和时间复合索引
|
|||
|
|
CREATE INDEX idx_orders_status_time ON orders (order_status, created_at);
|
|||
|
|
|
|||
|
|
-- 动物养殖场和状态复合索引
|
|||
|
|
CREATE INDEX idx_animals_farm_status ON animals (farm_id, status);
|
|||
|
|
|
|||
|
|
-- 财务记录类型和日期复合索引
|
|||
|
|
CREATE INDEX idx_financial_type_date ON financial_records (record_type, record_date);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2.4 分区设计
|
|||
|
|
|
|||
|
|
对于数据量较大的表,采用分区策略:
|
|||
|
|
|
|||
|
|
#### 2.4.1 按时间分区
|
|||
|
|
```sql
|
|||
|
|
-- 操作日志表按月分区
|
|||
|
|
ALTER TABLE operation_logs PARTITION BY RANGE (YEAR(created_at) * 100 + MONTH(created_at)) (
|
|||
|
|
PARTITION p202401 VALUES LESS THAN (202402),
|
|||
|
|
PARTITION p202402 VALUES LESS THAN (202403),
|
|||
|
|
PARTITION p202403 VALUES LESS THAN (202404),
|
|||
|
|
-- ... 更多分区
|
|||
|
|
PARTITION p_future VALUES LESS THAN MAXVALUE
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
-- 财务记录表按年分区
|
|||
|
|
ALTER TABLE financial_records PARTITION BY RANGE (YEAR(record_date)) (
|
|||
|
|
PARTITION p2023 VALUES LESS THAN (2024),
|
|||
|
|
PARTITION p2024 VALUES LESS THAN (2025),
|
|||
|
|
PARTITION p2025 VALUES LESS THAN (2026),
|
|||
|
|
PARTITION p_future VALUES LESS THAN MAXVALUE
|
|||
|
|
);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 3. Redis缓存设计
|
|||
|
|
|
|||
|
|
### 3.1 缓存策略
|
|||
|
|
|
|||
|
|
#### 3.1.1 缓存分类
|
|||
|
|
- **热点数据缓存**: 用户信息、系统配置
|
|||
|
|
- **会话缓存**: 用户登录状态、权限信息
|
|||
|
|
- **计数器缓存**: 访问统计、点赞数量
|
|||
|
|
- **队列缓存**: 异步任务队列
|
|||
|
|
- **分布式锁**: 防止并发操作
|
|||
|
|
|
|||
|
|
#### 3.1.2 Key命名规范
|
|||
|
|
```
|
|||
|
|
项目前缀:模块:类型:标识
|
|||
|
|
例如:
|
|||
|
|
xlxumu:user:info:123456 # 用户信息
|
|||
|
|
xlxumu:farm:stats:789 # 养殖场统计
|
|||
|
|
xlxumu:session:token:abc123 # 会话token
|
|||
|
|
xlxumu:lock:order:456789 # 订单锁
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3.2 具体缓存设计
|
|||
|
|
|
|||
|
|
#### 3.2.1 用户相关缓存
|
|||
|
|
```redis
|
|||
|
|
# 用户基本信息 (Hash)
|
|||
|
|
HSET xlxumu:user:info:123456
|
|||
|
|
id 123456
|
|||
|
|
username "farmer001"
|
|||
|
|
phone "13800138000"
|
|||
|
|
status 1
|
|||
|
|
last_login_at "2024-01-20 10:30:00"
|
|||
|
|
EXPIRE xlxumu:user:info:123456 3600
|
|||
|
|
|
|||
|
|
# 用户权限 (Set)
|
|||
|
|
SADD xlxumu:user:permissions:123456 "user:view" "farm:create" "animal:manage"
|
|||
|
|
EXPIRE xlxumu:user:permissions:123456 1800
|
|||
|
|
|
|||
|
|
# 用户会话 (String)
|
|||
|
|
SET xlxumu:session:token:abc123def456 123456
|
|||
|
|
EXPIRE xlxumu:session:token:abc123def456 7200
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3.2.2 业务数据缓存
|
|||
|
|
```redis
|
|||
|
|
# 养殖场统计 (Hash)
|
|||
|
|
HSET xlxumu:farm:stats:789
|
|||
|
|
total_animals 150
|
|||
|
|
healthy_animals 145
|
|||
|
|
sick_animals 5
|
|||
|
|
total_value 50000.00
|
|||
|
|
last_updated "2024-01-20 15:30:00"
|
|||
|
|
EXPIRE xlxumu:farm:stats:789 1800
|
|||
|
|
|
|||
|
|
# 热门动物品种 (ZSet)
|
|||
|
|
ZADD xlxumu:animal:breeds:popular 100 "杜洛克猪" 95 "长白猪" 90 "大白猪"
|
|||
|
|
EXPIRE xlxumu:animal:breeds:popular 3600
|
|||
|
|
|
|||
|
|
# 系统配置 (Hash)
|
|||
|
|
HSET xlxumu:system:config
|
|||
|
|
site_name "畜牧养殖管理平台"
|
|||
|
|
max_upload_size "10MB"
|
|||
|
|
default_page_size "20"
|
|||
|
|
EXPIRE xlxumu:system:config 86400
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3.2.3 计数器缓存
|
|||
|
|
```redis
|
|||
|
|
# 日访问量 (String)
|
|||
|
|
INCR xlxumu:stats:daily_visits:2024-01-20
|
|||
|
|
EXPIRE xlxumu:stats:daily_visits:2024-01-20 86400
|
|||
|
|
|
|||
|
|
# 用户在线数 (Set)
|
|||
|
|
SADD xlxumu:stats:online_users 123456 789012 345678
|
|||
|
|
EXPIRE xlxumu:stats:online_users 300
|
|||
|
|
|
|||
|
|
# 订单数量统计 (Hash)
|
|||
|
|
HINCRBY xlxumu:stats:orders:2024-01-20 total 1
|
|||
|
|
HINCRBY xlxumu:stats:orders:2024-01-20 pending 1
|
|||
|
|
EXPIRE xlxumu:stats:orders:2024-01-20 86400
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3.3 缓存更新策略
|
|||
|
|
|
|||
|
|
#### 3.3.1 Cache-Aside模式
|
|||
|
|
```python
|
|||
|
|
def get_user_info(user_id):
|
|||
|
|
# 先从缓存获取
|
|||
|
|
cache_key = f"xlxumu:user:info:{user_id}"
|
|||
|
|
user_info = redis.hgetall(cache_key)
|
|||
|
|
|
|||
|
|
if user_info:
|
|||
|
|
return user_info
|
|||
|
|
|
|||
|
|
# 缓存未命中,从数据库获取
|
|||
|
|
user_info = db.get_user(user_id)
|
|||
|
|
if user_info:
|
|||
|
|
# 写入缓存
|
|||
|
|
redis.hset(cache_key, mapping=user_info)
|
|||
|
|
redis.expire(cache_key, 3600)
|
|||
|
|
|
|||
|
|
return user_info
|
|||
|
|
|
|||
|
|
def update_user_info(user_id, data):
|
|||
|
|
# 更新数据库
|
|||
|
|
db.update_user(user_id, data)
|
|||
|
|
|
|||
|
|
# 删除缓存
|
|||
|
|
cache_key = f"xlxumu:user:info:{user_id}"
|
|||
|
|
redis.delete(cache_key)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3.3.2 Write-Through模式
|
|||
|
|
```python
|
|||
|
|
def update_farm_stats(farm_id, stats):
|
|||
|
|
# 同时更新数据库和缓存
|
|||
|
|
db.update_farm_stats(farm_id, stats)
|
|||
|
|
|
|||
|
|
cache_key = f"xlxumu:farm:stats:{farm_id}"
|
|||
|
|
redis.hset(cache_key, mapping=stats)
|
|||
|
|
redis.expire(cache_key, 1800)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 4. MongoDB文档设计
|
|||
|
|
|
|||
|
|
### 4.1 集合设计
|
|||
|
|
|
|||
|
|
#### 4.1.1 操作日志集合 (operation_logs)
|
|||
|
|
```javascript
|
|||
|
|
{
|
|||
|
|
"_id": ObjectId("..."),
|
|||
|
|
"user_id": 123456,
|
|||
|
|
"username": "farmer001",
|
|||
|
|
"module": "animal",
|
|||
|
|
"action": "create",
|
|||
|
|
"method": "POST",
|
|||
|
|
"url": "/api/animals",
|
|||
|
|
"ip": "192.168.1.100",
|
|||
|
|
"user_agent": "Mozilla/5.0...",
|
|||
|
|
"request_data": {
|
|||
|
|
"name": "小猪001",
|
|||
|
|
"breed": "杜洛克",
|
|||
|
|
"farm_id": 789
|
|||
|
|
},
|
|||
|
|
"response_data": {
|
|||
|
|
"success": true,
|
|||
|
|
"data": {
|
|||
|
|
"id": 12345,
|
|||
|
|
"code": "PIG001"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"status_code": 200,
|
|||
|
|
"execution_time": 150,
|
|||
|
|
"created_at": ISODate("2024-01-20T10:30:00Z")
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 4.1.2 系统监控集合 (system_metrics)
|
|||
|
|
```javascript
|
|||
|
|
{
|
|||
|
|
"_id": ObjectId("..."),
|
|||
|
|
"metric_type": "performance",
|
|||
|
|
"metric_name": "api_response_time",
|
|||
|
|
"value": 120,
|
|||
|
|
"unit": "ms",
|
|||
|
|
"tags": {
|
|||
|
|
"endpoint": "/api/animals",
|
|||
|
|
"method": "GET",
|
|||
|
|
"status": "success"
|
|||
|
|
},
|
|||
|
|
"timestamp": ISODate("2024-01-20T10:30:00Z"),
|
|||
|
|
"server": "api-server-01"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 4.1.3 消息通知集合 (notifications)
|
|||
|
|
```javascript
|
|||
|
|
{
|
|||
|
|
"_id": ObjectId("..."),
|
|||
|
|
"user_id": 123456,
|
|||
|
|
"type": "health_alert",
|
|||
|
|
"title": "动物健康预警",
|
|||
|
|
"content": "您的养殖场有5头动物需要进行健康检查",
|
|||
|
|
"data": {
|
|||
|
|
"farm_id": 789,
|
|||
|
|
"animal_ids": [1001, 1002, 1003, 1004, 1005],
|
|||
|
|
"alert_level": "warning"
|
|||
|
|
},
|
|||
|
|
"status": "unread",
|
|||
|
|
"created_at": ISODate("2024-01-20T10:30:00Z"),
|
|||
|
|
"read_at": null,
|
|||
|
|
"expires_at": ISODate("2024-01-27T10:30:00Z")
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4.2 索引设计
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 操作日志索引
|
|||
|
|
db.operation_logs.createIndex({ "user_id": 1, "created_at": -1 })
|
|||
|
|
db.operation_logs.createIndex({ "module": 1, "action": 1 })
|
|||
|
|
db.operation_logs.createIndex({ "created_at": -1 })
|
|||
|
|
|
|||
|
|
// 系统监控索引
|
|||
|
|
db.system_metrics.createIndex({ "metric_type": 1, "timestamp": -1 })
|
|||
|
|
db.system_metrics.createIndex({ "metric_name": 1, "timestamp": -1 })
|
|||
|
|
|
|||
|
|
// 消息通知索引
|
|||
|
|
db.notifications.createIndex({ "user_id": 1, "status": 1, "created_at": -1 })
|
|||
|
|
db.notifications.createIndex({ "type": 1, "created_at": -1 })
|
|||
|
|
db.notifications.createIndex({ "expires_at": 1 }, { expireAfterSeconds: 0 })
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 5. 数据库优化
|
|||
|
|
|
|||
|
|
### 5.1 查询优化
|
|||
|
|
|
|||
|
|
#### 5.1.1 慢查询优化
|
|||
|
|
```sql
|
|||
|
|
-- 开启慢查询日志
|
|||
|
|
SET GLOBAL slow_query_log = 'ON';
|
|||
|
|
SET GLOBAL long_query_time = 2;
|
|||
|
|
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
|
|||
|
|
|
|||
|
|
-- 分析慢查询
|
|||
|
|
EXPLAIN SELECT * FROM animals a
|
|||
|
|
JOIN farms f ON a.farm_id = f.id
|
|||
|
|
WHERE f.user_id = 123456 AND a.status = 1;
|
|||
|
|
|
|||
|
|
-- 优化后的查询
|
|||
|
|
SELECT a.id, a.code, a.name, a.breed, f.name as farm_name
|
|||
|
|
FROM animals a
|
|||
|
|
JOIN farms f ON a.farm_id = f.id
|
|||
|
|
WHERE f.user_id = 123456 AND a.status = 1
|
|||
|
|
ORDER BY a.created_at DESC
|
|||
|
|
LIMIT 20;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 5.1.2 索引优化
|
|||
|
|
```sql
|
|||
|
|
-- 分析索引使用情况
|
|||
|
|
SHOW INDEX FROM animals;
|
|||
|
|
|
|||
|
|
-- 删除不必要的索引
|
|||
|
|
DROP INDEX idx_animals_unused ON animals;
|
|||
|
|
|
|||
|
|
-- 创建复合索引
|
|||
|
|
CREATE INDEX idx_animals_farm_status_created ON animals (farm_id, status, created_at);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 5.2 存储优化
|
|||
|
|
|
|||
|
|
#### 5.2.1 表结构优化
|
|||
|
|
```sql
|
|||
|
|
-- 使用合适的数据类型
|
|||
|
|
ALTER TABLE animals MODIFY COLUMN status TINYINT(1) NOT NULL DEFAULT 1;
|
|||
|
|
ALTER TABLE animals MODIFY COLUMN weight DECIMAL(8,2) UNSIGNED;
|
|||
|
|
|
|||
|
|
-- 分离大字段
|
|||
|
|
CREATE TABLE animal_details (
|
|||
|
|
animal_id BIGINT(20) UNSIGNED NOT NULL,
|
|||
|
|
description TEXT,
|
|||
|
|
images JSON,
|
|||
|
|
PRIMARY KEY (animal_id),
|
|||
|
|
CONSTRAINT fk_animal_details_animal_id FOREIGN KEY (animal_id) REFERENCES animals (id)
|
|||
|
|
);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 5.2.2 分表策略
|
|||
|
|
```sql
|
|||
|
|
-- 按时间分表 - 操作日志
|
|||
|
|
CREATE TABLE operation_logs_2024_01 LIKE operation_logs;
|
|||
|
|
CREATE TABLE operation_logs_2024_02 LIKE operation_logs;
|
|||
|
|
|
|||
|
|
-- 按用户分表 - 大用户数据
|
|||
|
|
CREATE TABLE user_data_0 LIKE user_data;
|
|||
|
|
CREATE TABLE user_data_1 LIKE user_data;
|
|||
|
|
-- 根据 user_id % 10 分表
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 5.3 性能监控
|
|||
|
|
|
|||
|
|
#### 5.3.1 关键指标监控
|
|||
|
|
```sql
|
|||
|
|
-- 查看数据库状态
|
|||
|
|
SHOW GLOBAL STATUS LIKE 'Threads_connected';
|
|||
|
|
SHOW GLOBAL STATUS LIKE 'Queries';
|
|||
|
|
SHOW GLOBAL STATUS LIKE 'Slow_queries';
|
|||
|
|
|
|||
|
|
-- 查看InnoDB状态
|
|||
|
|
SHOW ENGINE INNODB STATUS;
|
|||
|
|
|
|||
|
|
-- 查看表大小
|
|||
|
|
SELECT
|
|||
|
|
table_name,
|
|||
|
|
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'Size (MB)'
|
|||
|
|
FROM information_schema.tables
|
|||
|
|
WHERE table_schema = 'xlxumu_main'
|
|||
|
|
ORDER BY (data_length + index_length) DESC;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 5.3.2 性能调优参数
|
|||
|
|
```ini
|
|||
|
|
# MySQL配置优化
|
|||
|
|
[mysqld]
|
|||
|
|
# 缓冲池大小 (物理内存的70-80%)
|
|||
|
|
innodb_buffer_pool_size = 4G
|
|||
|
|
|
|||
|
|
# 日志文件大小
|
|||
|
|
innodb_log_file_size = 256M
|
|||
|
|
|
|||
|
|
# 并发线程数
|
|||
|
|
innodb_thread_concurrency = 16
|
|||
|
|
|
|||
|
|
# 查询缓存
|
|||
|
|
query_cache_size = 128M
|
|||
|
|
query_cache_type = 1
|
|||
|
|
|
|||
|
|
# 连接数
|
|||
|
|
max_connections = 1000
|
|||
|
|
max_connect_errors = 100000
|
|||
|
|
|
|||
|
|
# 表缓存
|
|||
|
|
table_open_cache = 2000
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 6. 数据安全
|
|||
|
|
|
|||
|
|
### 6.1 数据加密
|
|||
|
|
|
|||
|
|
#### 6.1.1 敏感字段加密
|
|||
|
|
```sql
|
|||
|
|
-- 身份证号加密存储
|
|||
|
|
ALTER TABLE users ADD COLUMN id_card_encrypted VARBINARY(255);
|
|||
|
|
|
|||
|
|
-- 手机号部分加密
|
|||
|
|
UPDATE users SET phone_display = CONCAT(LEFT(phone, 3), '****', RIGHT(phone, 4));
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 6.1.2 传输加密
|
|||
|
|
- 使用SSL/TLS加密数据传输
|
|||
|
|
- API接口使用HTTPS协议
|
|||
|
|
- 数据库连接使用SSL
|
|||
|
|
|
|||
|
|
### 6.2 访问控制
|
|||
|
|
|
|||
|
|
#### 6.2.1 数据库用户权限
|
|||
|
|
```sql
|
|||
|
|
-- 创建应用数据库用户
|
|||
|
|
CREATE USER 'xlxumu_app'@'%' IDENTIFIED BY 'strong_password';
|
|||
|
|
GRANT SELECT, INSERT, UPDATE, DELETE ON xlxumu_main.* TO 'xlxumu_app'@'%';
|
|||
|
|
|
|||
|
|
-- 创建只读用户
|
|||
|
|
CREATE USER 'xlxumu_readonly'@'%' IDENTIFIED BY 'readonly_password';
|
|||
|
|
GRANT SELECT ON xlxumu_main.* TO 'xlxumu_readonly'@'%';
|
|||
|
|
|
|||
|
|
-- 创建备份用户
|
|||
|
|
CREATE USER 'xlxumu_backup'@'localhost' IDENTIFIED BY 'backup_password';
|
|||
|
|
GRANT SELECT, LOCK TABLES, SHOW VIEW ON xlxumu_main.* TO 'xlxumu_backup'@'localhost';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 6.2.2 行级安全
|
|||
|
|
```sql
|
|||
|
|
-- 创建安全策略视图
|
|||
|
|
CREATE VIEW user_animals AS
|
|||
|
|
SELECT * FROM animals
|
|||
|
|
WHERE farm_id IN (
|
|||
|
|
SELECT id FROM farms WHERE user_id = @current_user_id
|
|||
|
|
);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 6.3 数据备份
|
|||
|
|
|
|||
|
|
#### 6.3.1 备份策略
|
|||
|
|
```bash
|
|||
|
|
#!/bin/bash
|
|||
|
|
# 全量备份脚本
|
|||
|
|
DATE=$(date +%Y%m%d_%H%M%S)
|
|||
|
|
BACKUP_DIR="/backup/mysql"
|
|||
|
|
DB_NAME="xlxumu_main"
|
|||
|
|
|
|||
|
|
# 创建备份目录
|
|||
|
|
mkdir -p $BACKUP_DIR
|
|||
|
|
|
|||
|
|
# 执行备份
|
|||
|
|
mysqldump --single-transaction --routines --triggers \
|
|||
|
|
--user=xlxumu_backup --password=backup_password \
|
|||
|
|
$DB_NAME > $BACKUP_DIR/xlxumu_full_$DATE.sql
|
|||
|
|
|
|||
|
|
# 压缩备份文件
|
|||
|
|
gzip $BACKUP_DIR/xlxumu_full_$DATE.sql
|
|||
|
|
|
|||
|
|
# 删除7天前的备份
|
|||
|
|
find $BACKUP_DIR -name "xlxumu_full_*.sql.gz" -mtime +7 -delete
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 6.3.2 增量备份
|
|||
|
|
```bash
|
|||
|
|
#!/bin/bash
|
|||
|
|
# 增量备份脚本 (基于binlog)
|
|||
|
|
DATE=$(date +%Y%m%d_%H%M%S)
|
|||
|
|
BACKUP_DIR="/backup/mysql/binlog"
|
|||
|
|
LAST_BACKUP_FILE="/backup/mysql/last_backup_position"
|
|||
|
|
|
|||
|
|
# 获取当前binlog位置
|
|||
|
|
CURRENT_LOG=$(mysql -u root -p -e "SHOW MASTER STATUS\G" | grep File | awk '{print $2}')
|
|||
|
|
CURRENT_POS=$(mysql -u root -p -e "SHOW MASTER STATUS\G" | grep Position | awk '{print $2}')
|
|||
|
|
|
|||
|
|
# 读取上次备份位置
|
|||
|
|
if [ -f $LAST_BACKUP_FILE ]; then
|
|||
|
|
LAST_LOG=$(cat $LAST_BACKUP_FILE | grep File | awk '{print $2}')
|
|||
|
|
LAST_POS=$(cat $LAST_BACKUP_FILE | grep Position | awk '{print $2}')
|
|||
|
|
else
|
|||
|
|
LAST_LOG=$CURRENT_LOG
|
|||
|
|
LAST_POS=4
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# 导出增量数据
|
|||
|
|
mysqlbinlog --start-position=$LAST_POS $LAST_LOG > $BACKUP_DIR/incremental_$DATE.sql
|
|||
|
|
|
|||
|
|
# 更新备份位置
|
|||
|
|
echo "File: $CURRENT_LOG" > $LAST_BACKUP_FILE
|
|||
|
|
echo "Position: $CURRENT_POS" >> $LAST_BACKUP_FILE
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 7. 数据迁移
|
|||
|
|
|
|||
|
|
### 7.1 版本升级脚本
|
|||
|
|
|
|||
|
|
#### 7.1.1 数据库版本管理
|
|||
|
|
```sql
|
|||
|
|
-- 创建版本管理表
|
|||
|
|
CREATE TABLE `schema_migrations` (
|
|||
|
|
`version` varchar(255) NOT NULL,
|
|||
|
|
`applied_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|||
|
|
PRIMARY KEY (`version`)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|||
|
|
|
|||
|
|
-- 版本1.0.0 -> 1.1.0 升级脚本
|
|||
|
|
-- 添加动物体重历史表
|
|||
|
|
CREATE TABLE `animal_weight_history` (
|
|||
|
|
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
|||
|
|
`animal_id` bigint(20) unsigned NOT NULL,
|
|||
|
|
`weight` decimal(8,2) NOT NULL,
|
|||
|
|
`measured_at` timestamp NOT NULL,
|
|||
|
|
`notes` text,
|
|||
|
|
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|||
|
|
PRIMARY KEY (`id`),
|
|||
|
|
KEY `fk_weight_history_animal_id` (`animal_id`),
|
|||
|
|
CONSTRAINT `fk_weight_history_animal_id` FOREIGN KEY (`animal_id`) REFERENCES `animals` (`id`)
|
|||
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|||
|
|
|
|||
|
|
-- 记录版本
|
|||
|
|
INSERT INTO schema_migrations (version) VALUES ('1.1.0');
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 7.2 数据清理
|
|||
|
|
|
|||
|
|
#### 7.2.1 定期清理脚本
|
|||
|
|
```sql
|
|||
|
|
-- 清理过期的操作日志 (保留3个月)
|
|||
|
|
DELETE FROM operation_logs
|
|||
|
|
WHERE created_at < DATE_SUB(NOW(), INTERVAL 3 MONTH);
|
|||
|
|
|
|||
|
|
-- 清理软删除的数据 (删除超过1年的)
|
|||
|
|
DELETE FROM users
|
|||
|
|
WHERE deleted_at IS NOT NULL
|
|||
|
|
AND deleted_at < DATE_SUB(NOW(), INTERVAL 1 YEAR);
|
|||
|
|
|
|||
|
|
-- 清理临时数据
|
|||
|
|
DELETE FROM temp_data
|
|||
|
|
WHERE created_at < DATE_SUB(NOW(), INTERVAL 1 DAY);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 8. 监控与告警
|
|||
|
|
|
|||
|
|
### 8.1 数据库监控
|
|||
|
|
|
|||
|
|
#### 8.1.1 关键指标
|
|||
|
|
- **连接数**: 当前连接数/最大连接数
|
|||
|
|
- **QPS**: 每秒查询数
|
|||
|
|
- **慢查询**: 慢查询数量和比例
|
|||
|
|
- **锁等待**: InnoDB锁等待情况
|
|||
|
|
- **复制延迟**: 主从复制延迟时间
|
|||
|
|
|
|||
|
|
#### 8.1.2 监控脚本
|
|||
|
|
```bash
|
|||
|
|
#!/bin/bash
|
|||
|
|
# 数据库监控脚本
|
|||
|
|
MYSQL_USER="monitor"
|
|||
|
|
MYSQL_PASS="monitor_password"
|
|||
|
|
|
|||
|
|
# 获取连接数
|
|||
|
|
CONNECTIONS=$(mysql -u$MYSQL_USER -p$MYSQL_PASS -e "SHOW STATUS LIKE 'Threads_connected';" | awk 'NR==2{print $2}')
|
|||
|
|
|
|||
|
|
# 获取慢查询数
|
|||
|
|
SLOW_QUERIES=$(mysql -u$MYSQL_USER -p$MYSQL_PASS -e "SHOW STATUS LIKE 'Slow_queries';" | awk 'NR==2{print $2}')
|
|||
|
|
|
|||
|
|
# 发送监控数据到监控系统
|
|||
|
|
curl -X POST http://monitoring-system/api/metrics \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d "{
|
|||
|
|
\"metric\": \"mysql_connections\",
|
|||
|
|
\"value\": $CONNECTIONS,
|
|||
|
|
\"timestamp\": $(date +%s)
|
|||
|
|
}"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 8.2 告警规则
|
|||
|
|
|
|||
|
|
#### 8.2.1 告警配置
|
|||
|
|
```yaml
|
|||
|
|
# 数据库告警规则
|
|||
|
|
alerts:
|
|||
|
|
- name: mysql_connections_high
|
|||
|
|
condition: mysql_connections > 800
|
|||
|
|
severity: warning
|
|||
|
|
message: "MySQL连接数过高: {{ $value }}"
|
|||
|
|
|
|||
|
|
- name: mysql_slow_queries_high
|
|||
|
|
condition: rate(mysql_slow_queries[5m]) > 10
|
|||
|
|
severity: critical
|
|||
|
|
message: "MySQL慢查询增长过快"
|
|||
|
|
|
|||
|
|
- name: mysql_replication_lag
|
|||
|
|
condition: mysql_slave_lag_seconds > 60
|
|||
|
|
severity: critical
|
|||
|
|
message: "MySQL主从复制延迟: {{ $value }}秒"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 9. 扩展规划
|
|||
|
|
|
|||
|
|
### 9.1 水平扩展
|
|||
|
|
|
|||
|
|
#### 9.1.1 读写分离
|
|||
|
|
```python
|
|||
|
|
# 数据库路由配置
|
|||
|
|
DATABASE_ROUTERS = {
|
|||
|
|
'master': {
|
|||
|
|
'host': 'mysql-master.example.com',
|
|||
|
|
'port': 3306,
|
|||
|
|
'user': 'xlxumu_app',
|
|||
|
|
'password': 'password',
|
|||
|
|
'database': 'xlxumu_main'
|
|||
|
|
},
|
|||
|
|
'slaves': [
|
|||
|
|
{
|
|||
|
|
'host': 'mysql-slave1.example.com',
|
|||
|
|
'port': 3306,
|
|||
|
|
'user': 'xlxumu_readonly',
|
|||
|
|
'password': 'password',
|
|||
|
|
'database': 'xlxumu_main'
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
'host': 'mysql-slave2.example.com',
|
|||
|
|
'port': 3306,
|
|||
|
|
'user': 'xlxumu_readonly',
|
|||
|
|
'password': 'password',
|
|||
|
|
'database': 'xlxumu_main'
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 9.1.2 分库分表
|
|||
|
|
```python
|
|||
|
|
# 分库分表策略
|
|||
|
|
def get_database_shard(user_id):
|
|||
|
|
"""根据用户ID获取分库"""
|
|||
|
|
shard_id = user_id % 4
|
|||
|
|
return f"xlxumu_shard_{shard_id}"
|
|||
|
|
|
|||
|
|
def get_table_shard(user_id, table_name):
|
|||
|
|
"""根据用户ID获取分表"""
|
|||
|
|
shard_id = user_id % 10
|
|||
|
|
return f"{table_name}_{shard_id}"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 9.2 垂直扩展
|
|||
|
|
|
|||
|
|
#### 9.2.1 服务拆分
|
|||
|
|
- **用户服务数据库**: 用户、角色、权限相关表
|
|||
|
|
- **养殖服务数据库**: 养殖场、动物、健康记录相关表
|
|||
|
|
- **交易服务数据库**: 订单、支付、财务相关表
|
|||
|
|
- **日志服务数据库**: 操作日志、监控数据相关表
|
|||
|
|
|
|||
|
|
#### 9.2.2 数据同步
|
|||
|
|
```python
|
|||
|
|
# 跨库数据同步
|
|||
|
|
class DataSyncService:
|
|||
|
|
def sync_user_data(self, user_id, data):
|
|||
|
|
"""同步用户数据到相关服务"""
|
|||
|
|
# 同步到养殖服务
|
|||
|
|
farming_db.update_user_cache(user_id, data)
|
|||
|
|
|
|||
|
|
# 同步到交易服务
|
|||
|
|
trading_db.update_user_cache(user_id, data)
|
|||
|
|
|
|||
|
|
# 发送消息队列通知
|
|||
|
|
message_queue.publish('user.updated', {
|
|||
|
|
'user_id': user_id,
|
|||
|
|
'data': data
|
|||
|
|
})
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 10. 总结
|
|||
|
|
|
|||
|
|
本数据库设计文档详细描述了畜牧养殖管理平台的数据库架构,包括:
|
|||
|
|
|
|||
|
|
### 10.1 设计亮点
|
|||
|
|
- **完整的业务模型**: 覆盖用户管理、养殖管理、交易管理、财务管理等核心业务
|
|||
|
|
- **灵活的权限体系**: 基于RBAC的权限管理,支持细粒度权限控制
|
|||
|
|
- **高性能设计**: 合理的索引设计、分区策略、缓存机制
|
|||
|
|
- **数据安全**: 敏感数据加密、访问控制、备份策略
|
|||
|
|
- **可扩展性**: 支持读写分离、分库分表、服务拆分
|
|||
|
|
|
|||
|
|
### 10.2 技术特色
|
|||
|
|
- **多数据库架构**: MySQL + Redis + MongoDB,各司其职
|
|||
|
|
- **规范化设计**: 统一的命名规范、字段类型、索引策略
|
|||
|
|
- **监控完善**: 全面的性能监控和告警机制
|
|||
|
|
- **运维友好**: 自动化备份、版本管理、数据清理
|
|||
|
|
|
|||
|
|
### 10.3 后续优化
|
|||
|
|
- 根据实际业务量调整分区策略
|
|||
|
|
- 持续优化慢查询和索引设计
|
|||
|
|
- 完善监控指标和告警规则
|
|||
|
|
- 评估和实施分库分表方案
|
|||
|
|
|
|||
|
|
本设计为平台的稳定运行和未来扩展提供了坚实的数据基础。
|