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