# 数据库与表关系 ## 数据库来源 主初始化脚本:`sql/yack-20260316.sql`。 补充脚本: - `sql/iot_device_deferred_command.sql` - `sql/iot_things_model_push.sql` - `sql/yack.sql` `yack-20260316.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` 等字段在不同表中含义一致,但删除/更新一致性由业务代码维护。