MyEMS 数据库设计文档
本文档面向程序员,详细说明 MyEMS 能源管理系统的数据库架构、表结构和设计理念。
目录
数据库架构设计
设计理念
- 数据分离: 按数据类型和用途分离到不同数据库,避免单库过大
- 读写分离: 历史数据采用时间序列存储,支持高效查询
- 水平扩展: 大型数据库(historical_db, energy_db)可独立扩展
- 统一规范: 所有数据库使用相同的字符集和排序规则
数据库配置
所有数据库统一使用以下配置:
- 字符集:
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 时间,所有时间统一使用 UTCis_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_messages | Web 消息 | 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)- 规则支持定时执行和立即执行
- 消息状态:
new→sent→acknowledged/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_keys | API 密钥 | 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 需要定期清理过期记录
- 操作日志记录所有关键操作,便于审计
- 通知状态:
unread→read→archived
12. myems_reporting_db (报告数据库)
用途: 存储报告相关的邮件消息和附件。
特点:
- 数据量小