公寓宽带账号-设备-微码绑定模型设计草案
1. 目标
当前公寓运维页已经能看到账号、在线、绑码、最近绑定记录,但平台核心绑定关系仍不够稳定。下一阶段目标不是继续堆页面,而是把下面三类对象的主关系定型:
- 宽带账号:
sys_net_user - TR-069 设备:
tr069_device - 微码:
sys_device_microcode
目标结果:
- 同一个账号当前绑定什么设备、什么微码,必须有唯一且权威的答案。
- 页面统计只基于“当前态”查询,避免不同页面口径不一致。
- 历史换绑、解绑、迁移记录可追溯,不再通过覆盖字段硬猜历史。
2. 现状结论
2.1 已经比较清晰的部分
- TR-069 设备当前绑定关系已经采用显式表:
tr069_device_binding - 该表以
device_id + net_user_id表达当前设备归属,并且现有逻辑已经把它当成“显式绑定优先”来源 sys_net_user已经开始通过tr069_device_binding判断“是否已绑定 TR-069 设备”
2.2 仍然混乱的部分
- 微码当前把
net_user_name、device_sn、tr069_device_id、bind_time直接写回sys_device_microcode - 这意味着“码主数据”和“当前绑定态”混在同一行
- 一旦发生换绑、解绑、换设备,只能覆盖字段,历史语义不稳定
- 微码现在通过
net_user_name字符串关联账号,而 TR-069 绑定使用net_user_id,主键口径不统一
2.3 直接暴露出来的问题
- 页面统计很容易出现“概况页”和“列表页”口径不一致
- 账号换房、设备更换、微码重绑时,很难判断谁是当前态、谁只是历史残留
- 未来要做自动下发、装维工单、异常修复时,缺少统一的绑定主链路
3. 建议的权威关系
建议以“宽带账号”作为业务主锚点。
原因:
- 续费、到期、开停机、套餐、区域,业务都天然围绕账号发生
- 设备和微码都是服务账号的接入资源,不应反过来成为主对象
- TR-069 当前也已经倾向以
net_user_id作为显式绑定目标
目标主链路:
sys_net_user -> tr069_device_binding -> tr069_device
sys_net_user -> microcode_binding -> sys_device_microcode
必要时再通过 microcode_binding.tr069_device_id 与设备侧对齐。
4. 推荐的数据模型
4.1 保留的主数据表
sys_net_user
- 继续作为账号主表
- 权威主键:
id username继续保留为业务账号名,但不再作为跨表主关联键
tr069_device
- 继续作为设备主表
- 权威主键:
id - 设备唯一识别优先用
serial_number
sys_device_microcode
- 改为“微码主数据 + 库存属性”主表
- 建议长期只保留下列主属性:
idcodetypeprint_statusprint_timebatch_noremark
- 当前行里的这些字段不应再作为权威绑定来源:
net_user_namedevice_sntr069_device_idbind_timeunbind_timeregion_idmember_id
这些字段短期可保留兼容,长期应降级为冗余快照或迁移掉。
4.2 新增显式绑定表
建议新增:sys_device_microcode_binding
用途:表达“微码当前绑定到哪个账号/设备”。
建议字段:
idmicrocode_idnet_user_idtr069_device_iddevice_sn_snapshotregion_id_snapshotbinding_sourceremarkcreated_atupdated_atdeleted_at
建议约束:
microcode_id在deleted_at IS NULL时唯一net_user_id在deleted_at IS NULL时最多一条 active 记录
如果业务允许“一账号换码但只能有一个当前码”,这个约束是必须的。
4.3 新增绑定事件表
建议新增:sys_device_microcode_binding_event
用途:记录所有绑定行为,不把历史压回主表。
建议字段:
idmicrocode_idnet_user_idtr069_device_idevent_typebindunbindreplace_devicereplace_coderepair
sourceoperator_idremarkcreated_at
这张表只负责审计与追溯,不参与“当前态”判定。
5. 当前态与历史态的规则
必须明确分层:
当前态
- 当前账号绑定哪台设备:看
tr069_device_binding - 当前账号绑定哪个微码:看
sys_device_microcode_binding - 当前微码是否已使用:看是否存在 active binding
历史态
- 历史换绑、解绑、修复:看
sys_device_microcode_binding_event - 历史设备归属变更:可继续由
tr069_device_binding的软删历史或单独事件表承载
原则:
- 页面概况只查当前态
- 操作记录、审计、异常排查才查历史态
6. 核心业务约束
建议先按下面规则收敛:
- 一个账号同一时刻只能绑定一台当前设备
- 一个账号同一时刻只能绑定一个当前微码
- 一个微码同一时刻只能绑定一个账号
- 一个设备同一时刻只能归属一个账号
- 换绑不是覆盖旧关系,而是“结束旧 current + 新增新 current + 写事件”
7. 推荐操作流
7.1 扫码绑定
输入:微码、设备 SN、账号
处理:
- 校验账号存在
- 校验微码未被其他 active 关系占用
- 如果设备不存在则注册/发现设备
- 写
tr069_device_binding当前态 - 写
sys_device_microcode_binding当前态 - 写
sys_device_microcode_binding_event(bind)
7.2 设备更换
输入:账号、新设备 SN
处理:
- 结束该账号旧设备 current binding
- 建立新设备 current binding
- 微码 current binding 不变,只更新其
tr069_device_id - 写事件
replace_device
7.3 微码更换
输入:账号、新微码
处理:
- 结束旧微码 current binding
- 建立新微码 current binding
- 设备 current binding 不变
- 写事件
replace_code
7.4 退租/解绑
输入:账号
处理:
- 结束
tr069_device_binding当前态 - 结束
sys_device_microcode_binding当前态 - 写
unbind事件
8. 对现有页面和接口的影响
8.1 公寓运维页
当前页继续只做概况页即可,不建议继续加复杂操作。
页面查询口径应切到:
- 绑码用户数:基于
sys_device_microcode_bindingactive 记录 - TR-069 已绑设备数:基于
tr069_device_bindingactive 记录 - 最近绑码记录:基于
sys_device_microcode_binding_event
8.2 用户列表
HasMicrocodeBind 不再通过 sys_device_microcode.net_user_name exists 判断,改为通过显式绑定表判断。
8.3 微码列表
主列表展示主数据和当前绑定摘要;历史变更单独走事件记录页。
9. 推荐实施顺序
必须先做
- 新增
sys_device_microcode_binding - 新增
sys_device_microcode_binding_event - 扫码绑定逻辑切到显式绑定表写 current/event
第二批再做
- 概况页、用户页、微码页查询全部切到新 current 表
- 补换绑、解绑、修复接口
最后收口
- 将
sys_device_microcode中旧绑定字段降级为兼容字段 - 清理旧统计口径和旧 exists 查询
10. 最小迁移策略
不建议一次性清掉旧字段,建议分三步:
- 建新表,不删旧字段
- 新绑定操作双写:
- 新表写 current/event
- 旧字段仅做兼容回填
- 页面全部切换到新表后,再逐步废弃旧字段口径
11. 结论
下一阶段最该做的不是继续堆运维页功能,而是把:
- 账号当前绑定设备
- 账号当前绑定微码
- 换绑/解绑历史
三件事拆开并定型。
TR-069 侧已经提供了正确方向:显式 current binding 表优先。微码侧应尽快对齐到同一模式。
最后编辑:wuge 更新时间:2026-04-05 12:10