4.6 KiB
4.6 KiB
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. 设备概览查询
-- 查询BOX设备及其电池概况
SELECT b.box_name, b.battery_count, b.total_capacity, b.soc
FROM bms_box_device b
WHERE b.status = 1;
2. 电池实时状态查询
-- 查询指定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. 历史数据分析
-- 查询电池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. 告警数据查询
-- 查询当前所有告警电池
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中提供示例)
ALTER TABLE bms_battery_data PARTITION BY RANGE (YEAR(collect_time)*100 + MONTH(collect_time));
3. 数据清理策略
-- 定期清理3个月前的历史数据
DELETE FROM bms_battery_data
WHERE collect_time < DATE_SUB(NOW(), INTERVAL 3 MONTH);
4. 缓存策略
- 最新数据缓存到Redis
- 设备状态汇总数据缓存
- 告警信息实时推送
使用建议
- 实时数据写入: 建议使用批量插入提高性能
- 查询优化: 尽量使用时间范围限制查询
- 监控告警: 对数据表大小和查询性能进行监控
- 定期维护: 定期执行表优化和统计信息更新
扩展功能
1. 数据压缩
- 对历史数据进行压缩存储
- 按时间粒度进行数据聚合
2. 实时计算
- 使用流处理计算实时统计指标
- 异常检测和预警
3. 数据同步
- 支持多数据中心同步
- 数据备份和恢复机制
这种设计既满足了大数据量存储的需求,又保证了查询性能和系统的可扩展性。