games-development-ai/contracts/db-schemas/V4.0.0__create_game_feed.sql
zizi 063ec4edf2 docs(rename): ③ 文档/契约漂移清理——contracts+docs+根文档 yudao 标识同步 com.wanxiang.huijing(follow-up,脚本)
- 范围:全仓除已完成的 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>
2026-06-15 14:32:44 +00:00

66 lines
6.9 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- =============================================================================
-- 契约 #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 = '游戏流互动信号幂等流水';