# BMS 数据库设计说明

## 设计理念

针对您提出的"电池和设备的表建议分开，因为电池的需要有数据表且数据量很大"的需求，我们采用了**分离式设计**，将基础信息和实时数据分开存储，以优化性能和管理效率。

## 表结构设计

### 1. BOX设备表 (`bms_box_device`)

**用途**: 存储BOX设备的基础信息和汇总数据
- 设备基本信息（编号、名称、型号等）
- 设备配置信息（IP地址、通信协议等）
- 汇总统计数据（总容量、总电压、电池数量等）
- 设备状态和告警信息

### 2. 电池基础信息表 (`bms_battery`)

**用途**: 存储电池的静态基础信息
- 电池基本信息（编号、名称、型号等）
- 电池规格参数（额定容量、额定电压等）
- 电池配置信息（在BOX中的位置、保修信息等）
- **不包含实时数据**，避免频繁更新影响性能

### 3. 电池实时数据表 (`bms_battery_data`)

**用途**: 专门存储电池的实时监测数据
- 实时电压、电流、功率数据
- SOC、SOH、温度等状态数据
- 告警信息和运行状态
- 支持大数据量存储和高频写入

## 设计优势

### 1. 性能优化
- **读写分离**: 基础信息表读多写少，数据表写多读少
- **索引优化**: 针对不同查询场景设计专门索引
- **分区支持**: 数据表支持按时间分区，提高查询效率

### 2. 数据管理
- **历史数据**: 实时数据表可保存完整历史记录
- **数据清理**: 可按时间策略清理历史数据
- **备份策略**: 基础信息和实时数据可采用不同备份策略

### 3. 扩展性
- **水平扩展**: 数据表可按设备或时间进行分片
- **垂直扩展**: 可根据需要增加新的监测指标
- **多数据源**: 支持MQTT、Modbus、CAN等多种数据来源

## 关系模型

```
bms_box_device (1) -----> (N) bms_battery
                                |
                                | (1)
                                |
                                v
                              (N) bms_battery_data
```

- 一个BOX设备包含多个电池（1:N）
- 一个电池产生多条实时数据记录（1:N）
- 通过外键约束保证数据一致性

## 查询场景

### 1. 设备概览查询
```sql
-- 查询BOX设备及其电池概况
SELECT b.box_name, b.battery_count, b.total_capacity, b.soc
FROM bms_box_device b
WHERE b.status = 1;
```

### 2. 电池实时状态查询
```sql
-- 查询指定BOX下所有电池的最新状态
SELECT bt.battery_name, bd.current_voltage, bd.soc, bd.temperature
FROM bms_battery bt
LEFT JOIN bms_battery_data bd ON bt.battery_id = bd.battery_id
WHERE bt.box_id = 1
  AND bd.collect_time = (
    SELECT MAX(collect_time) 
    FROM bms_battery_data 
    WHERE battery_id = bt.battery_id
  );
```

### 3. 历史数据分析
```sql
-- 查询电池24小时内的数据趋势
SELECT collect_time, current_voltage, soc, temperature
FROM bms_battery_data
WHERE battery_id = 1
  AND collect_time >= DATE_SUB(NOW(), INTERVAL 24 HOUR)
ORDER BY collect_time;
```

### 4. 告警数据查询
```sql
-- 查询当前所有告警电池
SELECT bt.battery_name, bd.alarm_info, bd.collect_time
FROM bms_battery bt
JOIN bms_battery_data bd ON bt.battery_id = bd.battery_id
WHERE bd.alarm_status = 1
  AND bd.collect_time >= DATE_SUB(NOW(), INTERVAL 1 HOUR);
```

## 性能优化建议

### 1. 索引策略
- `bms_battery_data`表按`(battery_id, collect_time)`建立复合索引
- 按查询频率建立单列索引（soc、temperature、alarm_status等）

### 2. 分区策略
```sql
-- 按月分区（已在SQL中提供示例）
ALTER TABLE bms_battery_data PARTITION BY RANGE (YEAR(collect_time)*100 + MONTH(collect_time));
```

### 3. 数据清理策略
```sql
-- 定期清理3个月前的历史数据
DELETE FROM bms_battery_data 
WHERE collect_time < DATE_SUB(NOW(), INTERVAL 3 MONTH);
```

### 4. 缓存策略
- 最新数据缓存到Redis
- 设备状态汇总数据缓存
- 告警信息实时推送

## 使用建议

1. **实时数据写入**: 建议使用批量插入提高性能
2. **查询优化**: 尽量使用时间范围限制查询
3. **监控告警**: 对数据表大小和查询性能进行监控
4. **定期维护**: 定期执行表优化和统计信息更新

## 扩展功能

### 1. 数据压缩
- 对历史数据进行压缩存储
- 按时间粒度进行数据聚合

### 2. 实时计算
- 使用流处理计算实时统计指标
- 异常检测和预警

### 3. 数据同步
- 支持多数据中心同步
- 数据备份和恢复机制

这种设计既满足了大数据量存储的需求，又保证了查询性能和系统的可扩展性。