- 范围:全仓除已完成的 game-cloud/game-admin(及排除区);91 文件 - cn.iocoder.yudao→com.wanxiang.huijing / cn.wanxiang.game→com.wanxiang.huijing.game / cn.iocoder.cloud→com.wanxiang / Yudao*→Huijing* / bare yudao→huijing - 含 contracts/api-schemas(apiInterface FQCN)、docs/architecture+agent-specs(含中文名,git ls-files -z 修复)、AGENTS.md/CLAUDE.md 等根文档 - 保留不动:上游归属 URL(gitee/github yudaocode·YunaiV,改则断链+违反署名)、game-cloud Flyway 迁移注释(保 checksum)、lockfile(装包重生) - 纯文档/字符串,零构建影响(game-cloud/game-admin 字节码未动) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
66 lines
6.9 KiB
SQL
66 lines
6.9 KiB
SQL
-- =============================================================================
|
||
-- 契约 #2 DB 迁移 | 模块:feed(游戏流/双轨专区浏览/推荐)| owner:WS(feed)
|
||
-- 文件:V4.0.0__create_game_feed.sql(Flyway,只新增;已合入禁止修改,回滚写新补偿迁移)
|
||
-- 内容:feed 模块核心表 —— 推荐排序缓存/精选覆盖层(game_feed_rank) + 互动信号幂等流水(game_feed_interact_log)
|
||
-- 约定:InnoDB + utf8mb4;显式列;含 Huijing 审计列 + tenant_id;状态/枚举用 tinyint 并注释;关键查询建索引
|
||
-- 错误码段:feed = 1-103-***-***
|
||
-- 脊柱对接:游戏本体/Zone 实体读 project 契约 #1(game_project status=4 / game_zone / game_project_zone);
|
||
-- quality_score 由 telemetry 契约 #5 回灌,本模块不自算,仅缓存其参与的排序结果。
|
||
-- 边界 OUT:不存游戏本体/Zone 实体(读 project)|不算 quality_score(消费 telemetry)|不裁决举报(转 compliance)。
|
||
-- =============================================================================
|
||
|
||
-- -----------------------------------------------------------------------------
|
||
-- 表:game_feed_rank —— 推荐排序缓存 / 精选运营覆盖层(FeedRank)
|
||
-- 设计意图:游戏流默认按 quality_score 降序;本表持久化"可缓存的排序快照 + 运营加权/置顶"覆盖层,
|
||
-- 避免每次请求重算且承载 T-FED-14 精选池。命中本表则按 sort_score 出流,未命中回退直接读 project。
|
||
-- 数据来源:quality_score 由 telemetry 回灌写入(本模块只读取并入排序,不负责计算)。
|
||
-- zone_id 语义:0=默认混合流;>0=指定专区分区流(与 game_project_zone 对应,T-FED-15)。
|
||
-- -----------------------------------------------------------------------------
|
||
CREATE TABLE `game_feed_rank` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '排序记录 ID',
|
||
`game_id` BIGINT NOT NULL COMMENT '游戏 ID(= game_project.id,须 status=4 已发布)',
|
||
`version_id` BIGINT NOT NULL DEFAULT 0 COMMENT '参与出流的版本 ID(= game_project.current_version_id,供 runtime 即玩加载)',
|
||
`zone_id` BIGINT NOT NULL DEFAULT 0 COMMENT '分区维度:0默认混合流 / >0 指定专区(对应 game_project_zone.zone_id,T-FED-15)',
|
||
`quality_score` DECIMAL(10,4) NOT NULL DEFAULT 0 COMMENT '质量分(telemetry 回灌,排序主因子,本模块只读不算)',
|
||
`boost` DECIMAL(10,4) NOT NULL DEFAULT 0 COMMENT '运营加权因子(精选/活动叠加,T-FED-14)',
|
||
`sort_score` DECIMAL(10,4) NOT NULL DEFAULT 0 COMMENT '最终排序分(= quality_score + boost + 保底/降权修正,降序出流)',
|
||
`pinned` TINYINT NOT NULL DEFAULT 0 COMMENT '是否精选置顶:0否 1是(P-OPN-03 精选池)',
|
||
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '出流状态:0屏蔽(举报降权/下架联动) 1可出流',
|
||
`creator` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建者(Huijing 审计列)',
|
||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updater` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '更新者',
|
||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '逻辑删除:0未删 1已删',
|
||
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户 ID(Huijing 多租户兼容,MVP 单租户=0)',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_game_zone` (`game_id`, `zone_id`) COMMENT '同一游戏在同一分区维度仅一条排序记录',
|
||
KEY `idx_zone_status_sort` (`zone_id`, `status`, `sort_score`) COMMENT 'feed 主查询:按分区取可出流游戏并按排序分降序(cursor 翻页)',
|
||
KEY `idx_pinned` (`pinned`, `zone_id`, `sort_score`) COMMENT '精选池/置顶项查询(P-OPN-03)'
|
||
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '游戏流推荐排序缓存/精选覆盖层';
|
||
|
||
-- -----------------------------------------------------------------------------
|
||
-- 表:game_feed_interact_log —— 互动信号幂等流水(FeedInteractLog,T-FED-08)
|
||
-- 设计意图:承载点赞/收藏/分享/举报的"信号"写入(→排序权重),用唯一键保证幂等(取消=反激活,不删行)。
|
||
-- 边界:累计计数最终态归 project/community;举报(action=4)由服务层同步转 compliance 受理(T-CMP-10),本表只留信号痕迹。
|
||
-- 与 telemetry 契约 #5 的事件上报互不替代——本表是同步权重信号源,telemetry 是异步分析埋点。
|
||
-- -----------------------------------------------------------------------------
|
||
CREATE TABLE `game_feed_interact_log` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '互动信号 ID',
|
||
`game_id` BIGINT NOT NULL COMMENT '游戏 ID(= game_project.id)',
|
||
`user_id` BIGINT NOT NULL DEFAULT 0 COMMENT '用户 ID(登录态;匿名分享/举报可为 0,配合 anon_id 去重)',
|
||
`anon_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '匿名标识(未登录互动的稳定去重键,对齐 telemetry anon_id)',
|
||
`action` TINYINT NOT NULL COMMENT '互动动作:1点赞 2收藏 3分享 4举报',
|
||
`active` TINYINT NOT NULL DEFAULT 1 COMMENT '激活态:1激活(赞/藏/享/举报) 0已取消(赞/藏可反激活,享/举报恒1)',
|
||
`channel` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '渠道标识(action=3 分享时记录 utm/channel,渠道归因 T-FED-10)',
|
||
`reason` VARCHAR(200) NOT NULL DEFAULT '' COMMENT '举报理由(action=4 必填,随信号转 compliance)',
|
||
`creator` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建者',
|
||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updater` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '更新者',
|
||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '逻辑删除',
|
||
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户 ID',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_user_game_action` (`user_id`, `anon_id`, `game_id`, `action`) COMMENT '同一用户对同一游戏同一动作幂等(取消改 active,不重复插行)',
|
||
KEY `idx_game_action` (`game_id`, `action`, `active`) COMMENT '按游戏聚合某动作激活计数(产排序权重信号)'
|
||
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '游戏流互动信号幂等流水';
|