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

4.6 KiB
Raw Blame History

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. 监控告警: 对数据表大小和查询性能进行监控
  4. 定期维护: 定期执行表优化和统计信息更新

扩展功能

1. 数据压缩

  • 对历史数据进行压缩存储
  • 按时间粒度进行数据聚合

2. 实时计算

  • 使用流处理计算实时统计指标
  • 异常检测和预警

3. 数据同步

  • 支持多数据中心同步
  • 数据备份和恢复机制

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