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