# ODS 层删除 option_name / able_site_transfer 冗余列 — 变更记录

> 结构性变更：删除 2 张表各 1 个冗余列（API JSON 中不存在，ODS 全 NULL）

## 溯源

- 日期：2026-02-14（Asia/Shanghai）
- Prompt：P20260214-070000 — 删除 ODS 层 store_goods_sales_records.option_name 和 member_stored_value_cards.able_site_transfer
- Direct cause：API vs ODS 比对报告（v3-fixed）中这两列被标注为"ODS 独有"，经查证 API JSON 响应中从未返回这两个字段，ODS 中全部为 NULL（0 条非空数据），属于冗余列，应清理。

## 变更内容

| Schema | 表名 | 操作 | 列名 | 原类型 | 说明 |
|--------|------|------|------|--------|------|
| `ods` | `store_goods_sales_records` | DROP COLUMN | `option_name` | `text` | API 后续版本新增字段，实际从未返回数据，全 NULL |
| `ods` | `member_stored_value_cards` | DROP COLUMN | `able_site_transfer` | `integer` | API 后续版本新增字段，实际从未返回数据，全 NULL |

### Before / After

**store_goods_sales_records**：
- Before：52 个业务列 + 5 个 meta 列（含 `option_name text`）
- After：51 个业务列 + 5 个 meta 列（`option_name` 已移除）

**member_stored_value_cards**：
- Before：76 个业务列 + 5 个 meta 列（含 `able_site_transfer integer`）
- After：75 个业务列 + 5 个 meta 列（`able_site_transfer` 已移除）

## 变更原因

1. v3-fixed 比对报告显示 `option_name` 和 `able_site_transfer` 为"ODS 独有"字段
2. 全量 JSON 刷新审计（100 条/接口）确认 API 响应中从未包含这两个字段
3. 数据库查询确认两列全部为 NULL，无实际业务数据
4. 保留全 NULL 的冗余列会误导后续开发和数据分析

## 影响范围

| 影响对象 | 影响程度 | 说明 |
|----------|----------|------|
| ODS 抓取任务 | ⚠️ 需确认 | ODS 入库 INSERT/UPSERT 语句中若包含这两列需移除 |
| DWD 加载任务 | 无影响 | DWD 层未映射这两个字段（全 NULL 无法产生有意义的 DWD 数据） |
| API 契约 | 无影响 | API 响应结构不变，这两个字段本就不在 API 返回中 |
| 小程序 | 无影响 | 小程序不直接读 ODS 层 |
| 比对报告 | 需更新 | `docs/reports/api_ods_comparison_v3_fixed.md` 中两表的 ODS 独有字段需移除 |

## 回滚策略

```sql
-- 恢复列结构（数据不可恢复，因原始数据全为 NULL）
ALTER TABLE ods.store_goods_sales_records ADD COLUMN option_name TEXT;
ALTER TABLE ods.member_stored_value_cards ADD COLUMN able_site_transfer INTEGER;
```

**注意事项**：
- 回滚后两列数据均为 NULL（与删除前一致），无数据丢失风险
- 若未来 API 版本开始返回这两个字段，需重新 ADD COLUMN 并更新 ODS 入库逻辑

## 验证 SQL

```sql
-- 1) 确认 option_name 列已不存在
SELECT column_name
FROM information_schema.columns
WHERE table_schema = 'ods'
  AND table_name = 'store_goods_sales_records'
  AND column_name = 'option_name';
-- 预期：0 行

-- 2) 确认 able_site_transfer 列已不存在
SELECT column_name
FROM information_schema.columns
WHERE table_schema = 'ods'
  AND table_name = 'member_stored_value_cards'
  AND column_name = 'able_site_transfer';
-- 预期：0 行

-- 3) 确认两表当前列数
SELECT table_name, count(*) AS total_columns
FROM information_schema.columns
WHERE table_schema = 'ods'
  AND table_name IN ('store_goods_sales_records', 'member_stored_value_cards')
GROUP BY table_name;
-- 预期：store_goods_sales_records = 56（51 业务 + 5 meta），member_stored_value_cards = 80（75 业务 + 5 meta）

-- 4) 确认删除前数据确实全 NULL（回溯验证，迁移执行前运行）
-- SELECT count(*) FROM ods.store_goods_sales_records WHERE option_name IS NOT NULL;
-- SELECT count(*) FROM ods.member_stored_value_cards WHERE able_site_transfer IS NOT NULL;
-- 预期：均为 0
```

## 迁移文件

`database/migrations/20260214_drop_ods_option_name_able_site_transfer.sql`


---

## 补充记录：schema_ODS_doc.sql AI_CHANGELOG 标注

- 日期：2026-02-14（Asia/Shanghai）
- Prompt：P20260214-070000（同上）
- 变更内容：在 `database/schema_ODS_doc.sql` 末尾追加 AI_CHANGELOG 注释块，记录 option_name / able_site_transfer 两列在 DDL 文档中的注释化处理
- 结论：**无结构性变更**（仅追加 SQL 注释，不涉及 DDL 操作）

<!--
AI_CHANGELOG:
- 日期: 2026-02-14
- Prompt: P20260214-070000 — ODS 清理与文档标注（5 项任务）
- 直接原因: DB schema 变更（删除 2 列）必须同步 BD Manual
- 变更摘要: 新建 ODS 层变更记录文档，记录 option_name 和 able_site_transfer 的删除原因、影响、回滚策略和验证 SQL
- 风险与验证: 纯文档；验证：验证 SQL 执行结果与预期一致
-->
