evo-BMS/sql/README_DATABASE_DESIGN.md
2025-11-09 19:21:01 +08:00

154 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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. 数据同步
- 支持多数据中心同步
- 数据备份和恢复机制
这种设计既满足了大数据量存储的需求,又保证了查询性能和系统的可扩展性。