fastbee/docs/knowledge-base/03-data-model.md
2026-07-18 10:18:53 +08:00

280 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 数据库与表关系
## 数据库来源
主初始化脚本:`sql/yack-init.sql`。
补充脚本:
- `sql/iot_device_deferred_command.sql`
- `sql/iot_things_model_push.sql`
`yack-init.sql` 中包含约 100+ 张核心表,并带有大量初始化数据。业务表普遍不使用数据库外键;关系主要由字段命名、联合主键、索引和业务代码保证。Quartz 表保留真实外键。
## 通用字段约定
| 字段 | 含义 |
| --- | --- |
| `tenant_id`, `tenant_name` | 多租户归属,IoT/通知/可视化等表常见。 |
| `user_id`, `user_name` | 用户归属或操作者。 |
| `create_by`, `create_time`, `update_by`, `update_time` | 若依通用审计字段。 |
| `del_flag` | 软删除标记,常见取值 0 正常、2 删除。 |
| `status` | 业务状态,不同表含义不同,需结合枚举/字典。 |
| `serial_number` | 设备唯一编号,是设备日志、Topic、指令和网关关系中的高频关联键。 |
## 核心业务 ER 概览
```mermaid
erDiagram
SYS_USER ||--o{ IOT_DEVICE_USER : owns
SYS_USER ||--o{ IOT_GROUP : creates
SYS_USER ||--o{ IOT_DEVICE_SHARE : shared_to
IOT_CATEGORY ||--o{ IOT_PRODUCT : classifies
IOT_PRODUCT ||--o{ IOT_DEVICE : has
IOT_PRODUCT ||--o{ IOT_THINGS_MODEL : defines
IOT_DEVICE ||--o{ IOT_THINGS_MODEL : overrides
IOT_DEVICE ||--o{ IOT_DEVICE_LOG : reports
IOT_DEVICE ||--o{ IOT_EVENT_LOG : emits
IOT_DEVICE ||--o{ IOT_FUNCTION_LOG : receives
IOT_PRODUCT ||--o{ IOT_FIRMWARE : owns
IOT_FIRMWARE ||--o{ IOT_FIRMWARE_TASK : upgrades
IOT_FIRMWARE_TASK ||--o{ IOT_FIRMWARE_TASK_DETAIL : tracks
IOT_SCENE ||--o{ IOT_SCENE_DEVICE : triggers
IOT_SCENE ||--o{ IOT_SCENE_SCRIPT : actions
IOT_SCRIPT ||--o{ IOT_SCRIPT_BRIDGE : uses
BRIDGE ||--o{ IOT_SCRIPT_BRIDGE : bound
```
上图是业务约定关系,不代表 SQL 外键。
## 产品、设备、物模型
| 表 | 主键 | 说明 | 关键关系 |
| --- | --- | --- | --- |
| `iot_category` | `category_id` | 产品分类,支持 `parent_id` 层级。 | `iot_product.category_id` 关联分类。 |
| `iot_product` | `product_id` | 产品定义,包含分类、租户、协议、设备类型等。 | 一对多关联设备、物模型、固件、Modbus 配置。 |
| `iot_protocol` | `id` | 协议定义,`protocol_code` 唯一。 | 产品通过协议编码/配置选择编解码实现。 |
| `iot_device` | `device_id` | 设备注册表,`serial_number` 唯一。 | 关联产品、租户、用户、日志、网关、物模型覆盖。 |
| `iot_things_model` | `model_id` | 产品级/设备级物模型。 | `product_id` 关联产品;`device_id=0` 通常表示产品级,`device_id>0` 表示设备级覆盖或计算物模型。 |
| `iot_things_model_template` | `template_id` | 物模型模板。 | 可用于产品物模型复用。 |
| `iot_device_template` | `id` | 产品和采集点模板关系。 | `product_id` + `template_id`。 |
| `iot_things_model_translate` | `id` | 物模型翻译。 | 通过 `product_id`、标识符等业务字段关联。 |
| `iot_things_model_template_translate` | `id` | 物模型模板翻译。 | 通过模板标识业务关联。 |
关键约束/索引:
- `iot_device.serial_number` 是唯一索引。
- `iot_product.category_id`、`iot_product.tenant_id` 有普通索引。
- `iot_things_model.product_id`、`tenant_id`、`model_order` 有普通索引。
- `iot_things_model` 还有 `idx_calculated_serial(is_calculated, serial_number)`,用于计算物模型按设备检索。
## 设备归属、共享和分组
| 表 | 主键 | 说明 | 关键关系 |
| --- | --- | --- | --- |
| `iot_device_user` | `device_id`, `user_id` | 设备与用户归属关系。 | 关联 `iot_device` 和 `sys_user`。 |
| `iot_device_share` | `device_id`, `user_id` | 设备共享关系和权限。 | 关联设备与被共享用户。 |
| `iot_device_group` | `device_id`, `group_id` | 设备加入分组。 | 关联 `iot_device` 和 `iot_group`。 |
| `iot_group` | `group_id` | 用户创建的设备分组。 | `user_id` 关联 `sys_user`。 |
| `iot_device_alert_user` | `device_id`, `user_id` | 设备告警接收用户。 | 关联设备与告警接收用户。 |
| `order_control` | `id` | 指令权限控制。 | `user_id` + `device_id` 限制控制权限。 |
| `command_preferences` | `id` | 指令偏好模板。 | `product_id` 和 `serial_number` 关联设备/产品。 |
## 网关、子设备和 Modbus
| 表 | 主键 | 说明 | 关键关系 |
| --- | --- | --- | --- |
| `iot_sub_gateway` | `id` | 网关设备与子设备关系。 | `gw_device_id`、`sub_device_id` 均约定关联 `iot_device.device_id`。 |
| `iot_product_sub_gateway` | `id` | 网关产品与子产品关系。 | `gw_product_id`、`sub_product_id` 约定关联 `iot_product.product_id`。 |
| `iot_modbus_config` | `id` | 产品物模型的 Modbus 点位配置。 | `product_id` 关联产品。 |
| `iot_modbus_params` | `id` | 产品级 Modbus 默认参数。 | `product_id` 关联产品,`slave_id` 表示默认从机。 |
| `iot_modbus_job` | `task_id` | 设备轮询任务。 | `sub_device_id`、`job_id` 是业务关联字段。 |
| `iot_product_modbus_job` | `task_id` | 产品轮询任务模板。 | `product_id` 关联产品。 |
| `iot_var_temp` | `template_id` | 采集变量模板。 | `user_id` 关联模板所属用户。 |
| `iot_var_temp_salve` | `id` | 模板下从机/点位配置。 | `device_temp_id` 关联 `iot_var_temp.template_id`。 |
## 数据日志
| 表 | 主键 | 说明 | 关键关系 |
| --- | --- | --- | --- |
| `iot_device_log` | `log_id` | 设备属性/监测日志。 | `device_id`、`serial_number`、`tenant_id`、`user_id`。 |
| `iot_event_log` | `log_id` | 设备事件日志。 | 关联设备、租户和用户。 |
| `iot_function_log` | `id` | 服务/指令下发日志。 | `serial_number`、`message_id`、`user_id`。 |
| `iot_alert_log` | `alert_log_id` | 告警历史。 | `serial_number`、`product_id`、`user_id`。 |
| `iot_simulate_log` | `log_id` | 模拟设备日志。 | `device_id`、`serial_number`。 |
| `iot_device_air_log` | `id` | Air780 上报记录。 | `product_id`、`device_id`。 |
高频查询索引:
- `iot_device_log(serial_number, create_time)`
- `iot_device_log(serial_number, is_monitor, create_time)`
- `iot_alert_log(serial_number)`
- `iot_alert_log(product_id)`
- `iot_device_log(device_id)`
## 规则、场景、桥接和告警
| 表 | 主键 | 说明 | 关键关系 |
| --- | --- | --- | --- |
| `iot_scene` | `scene_id` | 场景联动/LiteFlow 规则链。 | `user_id`,`recover_id` 可指向恢复场景。 |
| `iot_scene_device` | `scene_device_id` | 场景触发设备/产品。 | `scene_id`、`product_id`、`serial_number`、`script_id`。 |
| `iot_scene_script` | `script_id` | 场景动作/条件脚本。 | `scene_id`、`product_id`、`job_id`、`parent_id`。 |
| `iot_script` | `script_id` | 规则引擎脚本组件。 | `scene_id`、`product_id`、`user_id`。 |
| `bridge` | `id` | 数据桥接端点配置。 | HTTP/MQTT/数据库桥接配置主体。 |
| `iot_script_bridge` | `script_id`, `bridge_id` | 脚本与桥接端点关系。 | 多对多关联 `iot_script` 和 `bridge`。 |
| `iot_alert` | `alert_id` | 告警定义。 | 租户维度定义告警。 |
| `iot_alert_scene` | `alert_id`, `scene_id` | 告警与场景关系。 | 多对多关联告警和场景。 |
| `iot_alert_notify_template` | `alert_id`, `notify_template_id` | 告警与通知模板关系。 | 多对多关联告警和通知模板。 |
| `iot_device_job` | `job_id`, `job_name`, `job_group` | 设备定时任务。 | 可关联设备、产品、场景、告警。 |
LiteFlow SQL 源直接读取:
- `iot_scene.chain_name`
- `iot_scene.el_data`
- `iot_scene.enable`
- `iot_script.script_id`
- `iot_script.script_data`
- `iot_script.script_language`
- `iot_script.enable`
## 场景模型、SCADA 和可视化
| 表 | 主键 | 说明 | 关键关系 |
| --- | --- | --- | --- |
| `scene_model` | `scene_model_id` | 业务场景管理。 | 租户维度。 |
| `scene_model_device` | `id` | 场景关联设备/虚拟数据源。 | `scene_model_id`、`cus_device_id`。 |
| `scene_model_data` | `id` | 场景数据源绑定。 | `scene_model_id`、`scene_model_device_id`、`datasource_id`。 |
| `scene_model_tag` | `id` | 场景录入型变量/计算变量。 | `scene_model_id`。 |
| `scene_tag_points` | `id` | 运算型变量点。 | `tag_id` 关联变量,`scene_model_data_id` 关联数据源。 |
| `iot_goview_project` | `id` | GoView 项目。 | 租户维度。 |
| `iot_goview_project_data` | `id` | GoView 项目数据。 | `project_id` 关联项目。 |
| `scada` | `id` | 组态页面。 | 租户维度。 |
| `scada_component` | `id` | 组态组件。 | `tenant_id`、`user_id`。 |
| `scada_device_bind` | `id` | 组态组件设备绑定。 | `serial_number` 关联设备。 |
| `scada_echart` | `id` | 图表管理。 | 租户维度。 |
| `scada_gallery` | `id` | 组态图库。 | 租户维度。 |
| `scada_model` | `id` | 三维模型配置。 | 租户维度。 |
## 固件和 OTA
| 表 | 主键 | 说明 | 关键关系 |
| --- | --- | --- | --- |
| `iot_firmware` | `firmware_id` | 产品固件版本。 | `product_id` 关联产品,`tenant_id` 关联租户。 |
| `iot_firmware_task` | `id` | 固件升级任务。 | `firmware_id` 关联固件。 |
| `iot_firmware_task_detail` | `id` | 任务下设备升级状态。 | `task_id` 关联任务,`serial_number` 关联设备。 |
## 视频监控和媒体
| 表 | 主键 | 说明 | 关键关系 |
| --- | --- | --- | --- |
| `sip_config` | `id` | SIP 系统配置。 | 可关联 `product_id`。 |
| `sip_device` | `device_id` | GB28181 监控设备/NVR。 | `product_id`,`device_sip_id`。 |
| `sip_device_channel` | `id`, `device_sip_id` | 摄像头通道。 | `device_sip_id` 关联 SIP 设备编号,`channel_sip_id` 是通道编号。 |
| `media_server` | `id` | ZLMediaKit 流媒体服务器配置。 | `server_id` 是媒体服务标识。 |
| `iot_sip_relation` | `id` | IoT 设备/场景与 SIP 通道关系。 | `channel_id`、`re_device_id`、`re_scene_model_id`。 |
## 通知和推送
| 表 | 主键 | 说明 | 关键关系 |
| --- | --- | --- | --- |
| `notify_channel` | `id` | 通知渠道账号。 | 租户维度。 |
| `notify_template` | `id` | 通知模板。 | `channel_id` 关联通知渠道。 |
| `notify_log` | `id` | 通知发送日志。 | `channel_id`、`notify_template_id`。 |
| `iot_things_model_push_config` | `id` | 物模型数据推送配置。 | `device_id`、`template_id`、`user_id`。 |
| `iot_push_model_item` | `id` | 推送配置下的物模型项和阈值。 | `config_id` 关联推送配置,`model_id` 关联物模型。 |
| `iot_push_user` | `id` | 推送接收用户。 | `config_id` 关联推送配置,`user_id` 关联系统用户。 |
## 系统 RBAC 和基础表
```mermaid
erDiagram
SYS_DEPT ||--o{ SYS_USER : contains
SYS_USER ||--o{ SYS_USER_ROLE : has
SYS_ROLE ||--o{ SYS_USER_ROLE : assigned
SYS_ROLE ||--o{ SYS_ROLE_MENU : grants
SYS_MENU ||--o{ SYS_ROLE_MENU : included
SYS_ROLE ||--o{ SYS_ROLE_DEPT : scopes
SYS_DEPT ||--o{ SYS_ROLE_DEPT : scoped
SYS_USER ||--o{ SYS_USER_POST : holds
SYS_POST ||--o{ SYS_USER_POST : assigned
```
| 表 | 主键 | 说明 |
| --- | --- | --- |
| `sys_user` | `user_id` | 用户。 |
| `sys_dept` | `dept_id` | 部门/机构,`parent_id` 形成树。 |
| `sys_role` | `role_id` | 角色。 |
| `sys_menu` | `menu_id` | 菜单和权限,`parent_id` 形成树。 |
| `sys_post` | `post_id` | 岗位。 |
| `sys_user_role` | `user_id`, `role_id` | 用户角色关系。 |
| `sys_role_menu` | `role_id`, `menu_id` | 角色菜单权限。 |
| `sys_role_dept` | `role_id`, `dept_id` | 角色数据权限。 |
| `sys_user_post` | `user_id`, `post_id` | 用户岗位关系。 |
| `sys_config` | `config_id` | 系统参数。 |
| `sys_dict_type` | `dict_id` | 字典类型,`dict_type` 唯一。 |
| `sys_dict_data` | `dict_code` | 字典数据,通过 `dict_type` 关联字典类型。 |
| `sys_notice` | `notice_id` | 通知公告。 |
| `sys_oper_log` | `oper_id` | 操作日志。 |
| `sys_logininfor` | `info_id` | 登录日志。 |
| `sys_client` | `id` | 系统授权客户端。 |
| `sys_auth_user` | `auth_id` | 第三方授权用户。 |
| `sys_user_relation` | `root_id` | 用户关系和层级深度缓存。 |
翻译表:
- `sys_menu_translate`
- `sys_dict_type_translate`
- `sys_dict_data_translate`
## OAuth、第三方登录和内容
| 表 | 说明 |
| --- | --- |
| `oauth_client_details` | OAuth 客户端配置。 |
| `oauth_access_token`, `oauth_refresh_token`, `oauth_client_token`, `oauth_code`, `oauth_approvals` | Spring OAuth Token/授权数据。 |
| `iot_social_platform` | 第三方登录平台配置。 |
| `iot_social_user` | 第三方用户和系统用户绑定。 |
| `app_language` | App 语言配置。 |
| `app_preferences` | 用户 App 偏好,`user_id + language` 唯一。 |
| `news`, `news_category` | 新闻资讯和分类。 |
## OSS、代码生成和任务
| 表 | 说明 |
| --- | --- |
| `oss_config` | 对象存储配置。 |
| `oss_detail` | 上传文件记录。 |
| `gen_table`, `gen_table_column` | 代码生成器元数据。 |
| `sys_job`, `sys_job_log` | 若依定时任务配置和日志。 |
## Quartz 强约束关系
这些是 SQL 中真实存在的外键:
```text
qrtz_triggers(sched_name, job_name, job_group)
-> qrtz_job_details(sched_name, job_name, job_group)
qrtz_blob_triggers(sched_name, trigger_name, trigger_group)
-> qrtz_triggers(sched_name, trigger_name, trigger_group)
qrtz_cron_triggers(sched_name, trigger_name, trigger_group)
-> qrtz_triggers(sched_name, trigger_name, trigger_group)
qrtz_simple_triggers(sched_name, trigger_name, trigger_group)
-> qrtz_triggers(sched_name, trigger_name, trigger_group)
qrtz_simprop_triggers(sched_name, trigger_name, trigger_group)
-> qrtz_triggers(sched_name, trigger_name, trigger_group)
```
其他 Quartz 表如 `qrtz_calendars`、`qrtz_fired_triggers`、`qrtz_locks`、`qrtz_scheduler_state` 由 Quartz 框架维护。
## 关系梳理原则
- 优先看 SQL 主键、联合主键、唯一索引和普通索引。
- 再看 Java Domain、Mapper XML、Service 查询条件。
- 对无外键的业务表,文档只标记为“业务约定关联”。
- `serial_number` 是很多运行时链路的核心关联键,但真正的设备主键仍是 `iot_device.device_id`。
- `product_id`、`device_id`、`user_id`、`tenant_id` 等字段在不同表中含义一致,但删除/更新一致性由业务代码维护。