SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci; USE hyapp_user; -- 后台用户详情设备 tab 需要注册之后的持续设备画像:users.register_device/os_version 只是注册时一次性快照, -- 真实客户端此前从未上报,线上均为空。user_devices 在每次认证成功(登录/注册/refresh)后按 -- (app_code, user_id, device_id) 聚合客户端设备头,字段以“非空覆盖”合并,空值不抹掉历史上报。 -- CREATE TABLE IF NOT EXISTS 使已通过 initdb 建表的环境可以安全重复执行。 CREATE TABLE IF NOT EXISTS user_devices ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离', user_id BIGINT NOT NULL COMMENT '用户 ID', device_id VARCHAR(128) NOT NULL COMMENT '设备 ID,与 auth_sessions.device_id 同源', platform VARCHAR(32) NOT NULL DEFAULT '' COMMENT '平台,android/ios', device_model VARCHAR(128) NOT NULL DEFAULT '' COMMENT '设备型号,例如 Redmi Note 8 Pro', manufacturer VARCHAR(64) NOT NULL DEFAULT '' COMMENT '设备厂商,例如 Xiaomi/Apple', os_version VARCHAR(64) NOT NULL DEFAULT '' COMMENT '系统版本', imei VARCHAR(64) NOT NULL DEFAULT '' COMMENT '设备 IMEI,Android 10+ 无特权权限时为空', app_version VARCHAR(64) NOT NULL DEFAULT '' COMMENT '最近一次认证客户端版本', build_number VARCHAR(64) NOT NULL DEFAULT '' COMMENT '最近一次认证客户端构建号', first_seen_at_ms BIGINT NOT NULL COMMENT '首次认证成功时间,UTC epoch ms', last_seen_at_ms BIGINT NOT NULL COMMENT '最近认证成功时间,UTC epoch ms', created_at_ms BIGINT NOT NULL COMMENT '创建时间,UTC epoch ms', updated_at_ms BIGINT NOT NULL COMMENT '更新时间,UTC epoch ms', PRIMARY KEY (app_code, user_id, device_id), KEY idx_user_devices_user_last_seen (app_code, user_id, last_seen_at_ms) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户设备档案表,认证成功后按设备聚合最新上报资料';