数据模型与存储职责
三种标识
| 标识 | 来源与示例 | 使用位置 |
|---|---|---|
| productId / ProductKey | 产品模板ID,如p_relay_4ch、p_env_sensor | Product主键、MQTT第二段、设备Username;不是产品名称 |
| Device.id | 后端逻辑UUID | HTTP devices/:id、共享、配置、OTA、Influx标签deviceId |
| physicalId | 固件稳定物理标识,如无冒号大写MAC | MQTT ClientId与Topic第三段、联合唯一定位 |
手机BLE deviceId可能是系统临时地址/UUID,不是以上逻辑ID。Product.id + Device.physicalId联合唯一;不要把网页设备UUID填入MQTT ClientId。
PostgreSQL
以yunstack-backend/src/database/prisma/schema.prisma为字段权威,SQL迁移还包含Prisma模型不能完整表达的检查/部分唯一索引。
| 表/模型 | 职责与重要约束 |
|---|---|
| user、role、permission及关联 | 当前账号启用状态、角色与权限字典;旧Token不固定保存可永久使用的权限 |
| product、device、device_log | 产品物模型、设备secret/owner/影子/固件版本/在线时间、日志 |
| device_factory_identity、device_setup_identity、device_claim_session | 出厂与设置凭据、认领票据哈希、有效期与消费状态;不通过普通详情返回密钥 |
| device_share、device_share_invite | 单设备分享、拥有者快照、单次24小时邀请;解绑或撤权不复活旧授权 |
| device_runtime | 当前owner快照、epoch、bootId、phase、pendingClear和capabilities |
| device_binding_transition | 归属转换nonce、旧/新epoch、期限和状态;断电后可恢复握手 |
| device_configuration | 每deviceId+scope一行:revision、desired、reported、accepted/appliedRevision、syncStatus、pendingMsgId、规则ID高水位 |
| firmware、ota_task | 哈希、芯片/硬件兼容、任务拥有者快照、进度、重试与期限;每设备最多一个活跃OTA任务 |
| organization、room与家庭成员/邀请 | 保留历史结构;当前家庭入口停用,家庭成员关系不授予设备权限 |
设备解绑保留设备记录与遥测,撤销共享、旧票据和运行归属。删除设备与解绑不是同一个操作。数据库初始化、已有库迁移和seed影响见数据库操作。
Redis与InfluxDB
Redis的auth:session:<sid>提供七天不滑动的会话撤销依据,device:online:<Device.id>用于在线TTL;设备服务记录保留约120秒,35秒占用防止并发短期操作;自动查询观察记录同样有期限。TTL不是持久业务配置备份。Redis丢失会话会要求重新登录,不靠旧JWT自行恢复。
InfluxService使用配置的org/bucket;设备测量写入measurement device_properties,以device_id标签定位逻辑Device.id、property标签区分属性,字段类型保持数值/布尔/字符串,不将缺失传感器伪造为零。历史接口仅允许物模型中的只读数值测量;时间范围最多31天,<=1天使用5分钟均值,<=7天1小时,其余6小时。历史为空还可能是Influx未配置或查询失败,应结合日志判断;不能只看在线状态。
NVS保存在板上,与这三种服务相互独立。断网时规则继续在设备运行;云端删除配置只有设备接收后才影响本地执行。
