跳到主要内容

MyEMS 数据库设计文档

本文档面向程序员,详细说明 MyEMS 能源管理系统的数据库架构、表结构和设计理念。

目录


数据库架构设计

设计理念

  1. 数据分离: 按数据类型和用途分离到不同数据库,避免单库过大
  2. 读写分离: 历史数据采用时间序列存储,支持高效查询
  3. 水平扩展: 大型数据库(historical_db, energy_db)可独立扩展
  4. 统一规范: 所有数据库使用相同的字符集和排序规则

数据库配置

所有数据库统一使用以下配置:

  • 字符集: utf8mb4 (支持完整的 UTF-8 字符,包括 emoji)
  • 排序规则: utf8mb4_unicode_ci (Unicode 排序规则)
  • 存储引擎: InnoDB (默认,支持事务和外键)

命名规范

  • 数据库命名: myems_{功能}_db (小写,下划线分隔)
  • 表命名: tbl_{实体名} (小写,下划线分隔)
  • 字段命名: 小写,下划线分隔,如 start_datetime_utc
  • 索引命名: tbl_{表名}_index_{序号}

数据库详细说明

1. myems_system_db (系统配置数据库)

用途: 存储系统的基础配置和元数据,是整个系统的核心配置库。

特点:

  • 包含最多的表(约 150+ 张表)
  • 数据量相对较小,但结构复杂
  • 包含大量的关联关系表

主要表分类:

1.1 基础配置表

表名说明关键字段
tbl_energy_categories能源分类(电、水、气、冷、热等)id, name, unit_of_measure, kgce, kgco2e
tbl_energy_items能耗分项(照明、空调、动力等)id, name, energy_category_id
tbl_cost_centers成本中心id, name, external_id
tbl_data_sources数据源配置id, name, gateway_id, protocol, connection
tbl_protocols协议配置id, name, protocol_type

1.2 设备管理表

表名说明关键字段
tbl_equipments设备信息id, name, uuid, equipment_type_id, cost_center_id
tbl_combined_equipments组合设备(多个设备的组合)id, name, is_input_counted, is_output_counted
tbl_meters计量表信息id, name, uuid, energy_category_id, is_counted
tbl_offline_meters离线计量表(手动录入)id, name, energy_category_id
tbl_virtual_meters虚拟计量表(计算得出)id, name, expression (JSON格式)
tbl_points数据点信息id, name, data_source_id, object_type, object_id

1.3 空间组织表

表名说明关键字段
tbl_spaces空间信息(房间、楼层等)id, name, uuid, parent_space_id, area
tbl_stores门店信息id, name, uuid, space_id
tbl_tenants租户信息id, name, uuid, space_id
tbl_shopfloors车间信息id, name, uuid, space_id

1.4 关联关系表

系统使用大量的关联表来建立多对多关系:

  • tbl_equipments_meters: 设备与计量表的关联
  • tbl_equipments_offline_meters: 设备与离线计量表的关联
  • tbl_equipments_virtual_meters: 设备与虚拟计量表的关联
  • tbl_spaces_equipments: 空间与设备的关联
  • tbl_spaces_meters: 空间与计量表的关联
  • tbl_combined_equipments_equipments: 组合设备与设备的关联
  • 等等...

1.5 新能源设备表

表名说明关键字段
tbl_photovoltaic_power_stations光伏电站id, name, capacity, contact_id
tbl_energy_storage_containers储能容器id, name, rated_capacity, rated_power
tbl_energy_storage_power_stations储能电站id, name, rated_capacity
tbl_microgrids微电网id, name, address
tbl_charging_stations充电站id, name, rated_capacity, rated_power

1.6 控制与调度表

表名说明关键字段
tbl_commands控制命令id, name, topic, payload (JSON格式)
tbl_control_modes控制模式id, name, is_active
tbl_control_modes_times控制模式时间段id, control_mode_id, start_time_of_day, end_time_of_day

1.7 其他配置表

  • tbl_contacts: 联系人信息
  • tbl_distribution_systems: 配电系统
  • tbl_distribution_circuits: 配电回路
  • tbl_energy_flow_diagrams: 能源流向图
  • tbl_tariffs: 电价配置
  • tbl_working_calendars: 工作日历
  • tbl_web_messages: Web 消息

开发注意事项:

  • 所有表都有 id (BIGINT AUTO_INCREMENT) 作为主键
  • 大部分表都有 uuid (CHAR(36)) 字段,用于外部系统集成
  • 关联表通常只有 id 和两个外键字段
  • JSON 字段使用 LONGTEXT 类型,存储格式化的 JSON 字符串

2. myems_historical_db (历史数据数据库)

用途: 存储实时监测数据和历史数据,是系统数据量最大的数据库之一。

特点:

  • 数据量巨大,采用时间序列存储
  • 包含原始数据和最新值缓存表
  • 支持数据质量标记(is_bad, is_published

主要表结构:

表名说明关键字段索引策略
tbl_analog_value模拟量历史数据point_id, utc_date_time, actual_value, is_bad, is_published(point_id, utc_date_time), (utc_date_time)
tbl_analog_value_latest模拟量最新值(缓存)point_id, utc_date_time, actual_value(point_id, utc_date_time)
tbl_digital_value数字量历史数据point_id, utc_date_time, actual_value (INT)(point_id, utc_date_time), (utc_date_time)
tbl_digital_value_latest数字量最新值(缓存)point_id, utc_date_time, actual_value(point_id, utc_date_time)
tbl_energy_value能耗历史数据point_id, utc_date_time, actual_value, is_bad, is_published(point_id, utc_date_time), (utc_date_time)
tbl_energy_value_latest能耗最新值(缓存)point_id, utc_date_time, actual_value(point_id, utc_date_time)
tbl_text_value文本量历史数据point_id, utc_date_time, actual_value (LONGTEXT)(point_id, utc_date_time), (utc_date_time)
tbl_text_value_latest文本量最新值(缓存)point_id, utc_date_time, actual_value(point_id, utc_date_time)

文件存储表:

表名说明关键字段
tbl_cost_files成本文件(Excel/CSV)file_name, uuid, upload_datetime_utc, status, file_object (LONGBLOB)
tbl_offline_meter_files离线计量表数据文件file_name, uuid, upload_datetime_utc, status, file_object
tbl_data_repair_files数据修复文件file_name, uuid, upload_datetime_utc, status, file_object
tbl_energy_plan_files能耗计划文件file_name, uuid, upload_datetime_utc, status, file_object

数据类型说明:

  • actual_value: DECIMAL(21, 6) - 支持高精度数值,6位小数
  • utc_date_time: DATETIME - UTC 时间,所有时间统一使用 UTC
  • is_bad: BOOL - 数据质量标记,True 表示坏数据
  • is_published: BOOL - 发布标记,True 表示已发布

开发注意事项:

  • 所有时间字段使用 UTC 时间,前端显示时转换为本地时间
  • _latest 表用于快速查询最新值,避免扫描历史表
  • 文件表使用 LONGBLOB 存储二进制文件,注意大小限制
  • 定期清理历史数据,避免表过大影响性能

3. myems_energy_db (能耗数据库)

用途: 存储各种设备的能耗统计数据,按小时、日、月、年进行聚合。

特点:

  • 数据由 myems-aggregation 服务计算生成
  • 按时间粒度分为 hourly, daily, monthly, yearly 表
  • 支持按能源分类(category)和能耗分项(item)统计

表命名规则:

  • tbl_{对象类型}_{方向}_{分类}_{时间粒度}
  • 对象类型: meter, equipment, combined_equipment, space, store, tenant, shopfloor
  • 方向: input (输入), output (输出)
  • 分类: category (能源分类), item (能耗分项)
  • 时间粒度: hourly, daily, monthly, yearly

主要表结构:

3.1 计量表能耗表

表名说明关键字段
tbl_meter_hourly计量表小时能耗meter_id, start_datetime_utc, actual_value
tbl_meter_daily计量表日能耗meter_id, start_datetime_utc, actual_value
tbl_meter_monthly计量表月能耗meter_id, start_datetime_utc, actual_value
tbl_meter_yearly计量表年能耗meter_id, start_datetime_utc, actual_value
tbl_offline_meter_hourly离线计量表小时能耗offline_meter_id, start_datetime_utc, actual_value
tbl_virtual_meter_hourly虚拟计量表小时能耗virtual_meter_id, start_datetime_utc, actual_value

3.2 设备能耗表

表名说明关键字段
tbl_equipment_input_category_hourly设备输入能耗(按分类)equipment_id, energy_category_id, start_datetime_utc, actual_value
tbl_equipment_input_item_hourly设备输入能耗(按分项)equipment_id, energy_item_id, start_datetime_utc, actual_value
tbl_equipment_output_category_hourly设备输出能耗(按分类)equipment_id, energy_category_id, start_datetime_utc, actual_value
tbl_combined_equipment_input_category_hourly组合设备输入能耗(按分类)combined_equipment_id, energy_category_id, start_datetime_utc, actual_value
tbl_combined_equipment_output_category_hourly组合设备输出能耗(按分类)combined_equipment_id, energy_category_id, start_datetime_utc, actual_value

3.3 空间能耗表

表名说明关键字段
tbl_space_input_category_hourly空间输入能耗(按分类)space_id, energy_category_id, start_datetime_utc, actual_value
tbl_space_input_item_hourly空间输入能耗(按分项)space_id, energy_item_id, start_datetime_utc, actual_value
tbl_space_output_category_hourly空间输出能耗(按分类)space_id, energy_category_id, start_datetime_utc, actual_value
tbl_store_input_category_hourly门店输入能耗store_id, energy_category_id, start_datetime_utc, actual_value
tbl_tenant_input_category_hourly租户输入能耗tenant_id, energy_category_id, start_datetime_utc, actual_value
tbl_shopfloor_input_category_hourly车间输入能耗shopfloor_id, energy_category_id, start_datetime_utc, actual_value

3.4 新能源设备能耗表

表名说明关键字段
tbl_photovoltaic_power_station_hourly光伏电站小时发电量photovoltaic_power_station_id, start_datetime_utc, actual_value
tbl_energy_storage_container_charge_hourly储能容器充电量energy_storage_container_id, start_datetime_utc, actual_value
tbl_energy_storage_container_discharge_hourly储能容器放电量energy_storage_container_id, start_datetime_utc, actual_value
tbl_energy_storage_container_grid_buy_hourly储能容器购电量energy_storage_container_id, start_datetime_utc, actual_value
tbl_energy_storage_container_grid_sell_hourly储能容器售电量energy_storage_container_id, start_datetime_utc, actual_value
tbl_microgrid_charge_hourly微电网充电量microgrid_id, start_datetime_utc, actual_value
tbl_microgrid_discharge_hourly微电网放电量microgrid_id, start_datetime_utc, actual_value

索引设计:

  • 所有表都有复合索引: (对象_id, 分类_id, start_datetime_utc)(对象_id, start_datetime_utc)
  • 支持按对象和时间范围快速查询

开发注意事项:

  • start_datetime_utc 表示时间段的开始时间(如 2024-01-01 00:00:00 表示 1 月 1 日 0 点到 1 点)
  • actual_value 是聚合后的值,不是原始值
  • 数据由 aggregation 服务定期计算,不是实时写入
  • 查询时注意时区转换

4. myems_billing_db (计费数据库)

用途: 存储计费相关的能耗数据,结构与 myems_energy_db 类似,但数据经过电价计算。

特点:

  • 表结构与 myems_energy_db 完全一致
  • 数据由 myems-aggregation 服务根据电价配置计算
  • 支持分时电价、阶梯电价等复杂计费规则

主要表:

  • myems_energy_db 相同的表结构
  • 数据值已乘以对应电价,单位通常是货币单位(如元、美元)

开发注意事项:

  • 计费数据依赖于 myems_system_db.tbl_tariffs 电价配置
  • 需要与成本中心(cost_center)关联
  • 支持多电价策略(分时、阶梯、容量等)

5. myems_carbon_db (碳排放数据库)

用途: 存储碳排放相关的能耗数据,用于碳足迹计算。

特点:

  • 表结构与 myems_energy_db 完全一致
  • 数据由 myems-aggregation 服务根据碳排放因子计算
  • 碳排放因子存储在 myems_system_db.tbl_energy_categories.kgco2e

主要表:

  • myems_energy_db 相同的表结构
  • 数据值已乘以碳排放因子,单位通常是 kgCO2e(千克二氧化碳当量)

开发注意事项:

  • 碳排放因子可能随时间变化,需要支持历史因子
  • 不同能源类型的碳排放因子不同(电、气、油等)
  • 支持范围 1、范围 2、范围 3 的碳排放计算

6. myems_energy_baseline_db (能耗基线数据库)

用途: 存储能耗基线数据,用于节能分析和能效评估。

特点:

  • 表结构与 myems_energy_db 类似
  • 基线数据通常基于历史数据或标准值计算
  • 用于对比实际能耗与基线能耗,计算节能效果

主要表:

  • myems_energy_db 相同的表结构
  • 存储基线值而非实际值

开发注意事项:

  • 基线数据需要定期更新
  • 支持多种基线计算方法(历史平均、回归分析、标准值等)

7. myems_energy_model_db (能耗模型数据库)

用途: 存储 8760 小时年度能耗模型数据(一年 8760 小时)。

特点:

  • 每个对象存储 8760 条记录(一年的小时数据)
  • 用于能耗预测和规划
  • 表名包含 _8760 后缀

主要表:

表名说明关键字段
tbl_meter_8760计量表 8760 小时模型meter_id, start_datetime_utc, actual_value
tbl_equipment_input_category_8760设备输入能耗模型equipment_id, energy_category_id, start_datetime_utc, actual_value
tbl_combined_equipment_input_category_8760组合设备输入能耗模型combined_equipment_id, energy_category_id, start_datetime_utc, actual_value
tbl_space_input_category_8760空间输入能耗模型space_id, energy_category_id, start_datetime_utc, actual_value
tbl_shopfloor_input_category_8760车间输入能耗模型shopfloor_id, energy_category_id, start_datetime_utc, actual_value
tbl_store_input_category_8760门店输入能耗模型store_id, energy_category_id, start_datetime_utc, actual_value
tbl_tenant_input_category_8760租户输入能耗模型tenant_id, energy_category_id, start_datetime_utc, actual_value

开发注意事项:

  • 8760 小时模型通常基于历史数据或标准模型生成
  • 用于年度能耗预测和预算编制
  • 支持按周、月、季度等维度查看

8. myems_energy_plan_db (能耗计划数据库)

用途: 存储能耗计划和目标数据。

特点:

  • 表结构与 myems_energy_db 类似
  • 存储计划值而非实际值
  • 用于能耗预算和目标管理

主要表:

  • myems_energy_db 相同的表结构
  • 数据来自计划文件或手动录入

开发注意事项:

  • 计划数据需要与实际数据对比分析
  • 支持多级计划(年度、月度、周度等)

9. myems_energy_prediction_db (能耗预测数据库)

用途: 存储能耗预测数据。

特点:

  • 表结构与 myems_energy_db 类似
  • 存储预测值而非实际值
  • 用于能耗预测和预警

主要表:

  • myems_energy_db 相同的表结构
  • 数据由预测算法生成

开发注意事项:

  • 预测数据需要定期更新
  • 支持多种预测算法(时间序列、机器学习等)
  • 预测精度需要持续优化

10. myems_fdd_db (故障诊断数据库)

用途: 存储故障检测和诊断相关数据。

特点:

  • 支持多种告警渠道(Web、Email、SMS、微信、电话)
  • 规则引擎支持复杂的故障检测逻辑
  • 支持故障消息的确认和处理

主要表结构:

表名说明关键字段
tbl_rules诊断规则id, name, category, fdd_code, priority, channel, expression (JSON), message_template, is_enabled
tbl_web_messagesWeb 消息id, rule_id, user_id, subject, category, priority, message, status, belong_to_object_type, belong_to_object_id
tbl_email_messages邮件消息id, rule_id, recipient_name, recipient_email, subject, message, attachment_file_name, status
tbl_text_messages_outbox短信发件箱id, rule_id, recipient_mobile, message, status, acknowledge_code
tbl_text_messages_inbox短信收件箱id, sender_mobile, message, status
tbl_wechat_messages_outbox微信消息发件箱id, rule_id, recipient_openid, message_template_id, message_data (JSON)
tbl_wechat_messages_inbox微信消息收件箱id, sender_openid, message, status
tbl_email_servers邮件服务器配置id, host, port, requires_authentication, user_name, password, from_addr
tbl_wechat_configs微信配置id, api_server, app_id, app_secret, access_token, expires_datetime_utc

规则分类 (category):

  • REALTIME: 实时告警
  • SYSTEM: 系统告警
  • SPACE: 空间告警
  • METER: 计量表告警
  • TENANT: 租户告警
  • STORE: 门店告警
  • SHOPFLOOR: 车间告警
  • EQUIPMENT: 设备告警
  • COMBINEDEQUIPMENT: 组合设备告警

优先级 (priority):

  • CRITICAL: 严重
  • HIGH: 高
  • MEDIUM: 中
  • LOW: 低

开发注意事项:

  • expression 字段存储 JSON 格式的规则表达式
  • message_template 支持变量替换(如 $name, $value
  • 规则支持定时执行和立即执行
  • 消息状态: newsentacknowledged / timeout

11. myems_user_db (用户数据库)

用途: 存储用户认证、API 密钥、邮件消息等。

特点:

  • 数据量小,但安全性要求高
  • 支持用户权限管理
  • 支持 API 密钥认证

主要表结构:

表名说明关键字段
tbl_users用户信息id, name, uuid, display_name, email, salt, password, is_admin, is_read_only, privilege_id, account_expiration_datetime_utc, password_expiration_datetime_utc, failed_login_count
tbl_privileges权限配置id, name, data (JSON格式)
tbl_sessions用户会话id, user_uuid, token, utc_expires
tbl_api_keysAPI 密钥id, name, token, created_datetime_utc, expires_datetime_utc
tbl_email_messages邮件消息id, recipient_name, recipient_email, subject, message, attachment_file_name, status, scheduled_datetime_utc
tbl_email_message_sessions邮件会话id, recipient_email, token, expires_datetime_utc
tbl_logs操作日志id, user_uuid, request_datetime_utc, request_method, resource_type, resource_id, request_body (JSON)
tbl_notifications通知消息id, user_id, created_datetime_utc, status, subject, message, url
tbl_new_users新用户(待激活)id, name, uuid, display_name, email, salt, password
tbl_verification_codes验证码id, recipient_email, verification_code, created_datetime_utc, expires_datetime_utc

安全设计:

  • 密码使用 salt + hash 存储,不存储明文
  • 支持账户和密码过期时间
  • 支持登录失败次数限制
  • API 密钥支持过期时间

开发注意事项:

  • 密码字段使用加密存储,不要直接查询
  • 会话 token 需要定期清理过期记录
  • 操作日志记录所有关键操作,便于审计
  • 通知状态: unreadreadarchived

12. myems_reporting_db (报告数据库)

用途: 存储报告相关的邮件消息和附件。

特点:

  • 数据量小
  • 支持报告模板和生成的文件存储

主要表结构:

表名说明关键字段
tbl_reports报告配置id, name, uuid, expression (JSON), is_enabled, last_run_datetime_utc, next_run_datetime_utc, is_run_immediately
tbl_reports_files报告文件id, uuid, create_datetime_utc, file_name, file_type (xlsx/pdf/docx), file_object (LONGBLOB)
tbl_template_files报告模板文件id, uuid, report_id, file_name, file_type, file_object
tbl_email_messages邮件消息id, recipient_name, recipient_email, subject, message, attachment_file_name, attachment_file_object, status

开发注意事项:

  • 报告文件支持 Excel、PDF、Word 格式
  • 模板文件用于生成报告
  • 报告支持定时生成和立即生成
  • 文件使用 LONGBLOB 存储,注意大小限制

13. myems_production_db (生产数据库)

用途: 存储生产相关的产品数据。

特点:

  • 数据量小
  • 用于生产能耗关联分析

主要表结构:

表名说明关键字段
tbl_products产品信息id, name, uuid, unit_of_measure, tag, standard_product_coefficient
tbl_teams班组信息id, name, uuid, description
tbl_shifts班次信息id, shopfloor_id, team_id, product_id, product_count, start_datetime_utc, end_datetime_utc, reference_timestamp
tbl_shopfloor_hourly车间小时产量id, shopfloor_id, start_datetime_utc, product_id, product_count
tbl_space_hourly空间小时产量id, space_id, start_datetime_utc, product_id, product_count
tbl_shopfloors_products车间与产品关联id, shopfloor_id, product_id
tbl_shopfloors_teams车间与班组关联id, shopfloor_id, team_id

开发注意事项:

  • 生产数据用于计算单位产品能耗
  • 支持按产品、班组、车间等维度统计
  • 与能耗数据关联,计算能效指标

数据流转关系

数据采集流程

设备/传感器
↓ (Modbus TCP/MQTT/HTTP)
myems-modbus-tcp (数据采集服务)
↓ (写入)
myems_historical_db.tbl_analog_value / tbl_digital_value / tbl_energy_value
↓ (数据规范化)
myems-normalization (数据规范化服务)
↓ (数据清洗)
myems-cleaning (数据清洗服务)
↓ (数据聚合)
myems-aggregation (数据汇总服务)
↓ (写入)
myems_energy_db (能耗数据)
myems_billing_db (计费数据)
myems_carbon_db (碳排放数据)

数据查询流程

用户请求

myems-api (API 服务)
↓ (查询)
myems_system_db (配置数据)
myems_historical_db (历史数据)
myems_energy_db (能耗数据)
↓ (返回)
myems-web / myems-admin (前端展示)

数据关联关系

myems_system_db.tbl_points
↓ (point_id)
myems_historical_db.tbl_analog_value
↓ (聚合计算)
myems_energy_db.tbl_meter_hourly
↓ (关联)
myems_system_db.tbl_meters
↓ (关联)
myems_system_db.tbl_equipments
↓ (关联)
myems_system_db.tbl_spaces

表结构设计规范

通用字段

所有表都包含以下通用字段:

字段名类型说明
idBIGINT NOT NULL AUTO_INCREMENT主键,自增
nameVARCHAR(255)名称
uuidCHAR(36)UUID,用于外部系统集成
descriptionVARCHAR(255)描述(可选)

时间字段

字段名类型说明
utc_date_timeDATETIMEUTC 时间(历史数据表)
start_datetime_utcDATETIME时间段开始时间(聚合数据表)
created_datetime_utcDATETIME创建时间
updated_datetime_utcDATETIME更新时间
last_run_datetime_utcDATETIME最后运行时间
next_run_datetime_utcDATETIME下次运行时间

注意: 所有时间字段统一使用 UTC 时间,前端显示时转换为本地时间。

数值字段

字段名类型说明
actual_valueDECIMAL(21, 6)实际值,支持高精度(6位小数)
set_valueDECIMAL(21, 6)设定值
rated_capacityDECIMAL(21, 6)额定容量
rated_powerDECIMAL(21, 6)额定功率

JSON 字段

字段名类型说明
connectionLONGTEXT连接配置(JSON 格式)
expressionLONGTEXT表达式(JSON 格式)
payloadLONGTEXT负载(JSON 格式)
dataLONGTEXT数据(JSON 格式)

注意: JSON 字段存储格式化的 JSON 字符串,需要解析后使用。

状态字段

字段名类型说明
is_enabledBOOL是否启用
is_activeBOOL是否激活
is_badBOOL是否坏数据
is_publishedBOOL是否已发布
is_countedBOOL是否计入统计
statusVARCHAR(32)状态(如: new, sent, done, error)

索引设计

主键索引:

  • 所有表都有 PRIMARY KEY (id)

唯一索引:

  • 关键字段(如 name, uuid)通常有唯一索引

复合索引:

  • 查询频繁的字段组合建立复合索引
  • 如: (point_id, utc_date_time), (meter_id, start_datetime_utc)

时间索引:

  • 时间字段通常单独建立索引,支持时间范围查询