# DWS 层 DDL 同步修正 — 变更记录

> 结构性变更：修正 8 项差异（补充 5 个缺失字段、2 张缺失表、1 个缺失视图）

## 溯源

- 日期：2026-02-13（Asia/Shanghai）
- 工具：`scripts/compare_ddl_db.py --schema dws --ddl-path database/schema_dws.sql`
- Direct cause：DDL 对比脚本发现 `database/schema_dws.sql` 与数据库 `dws` schema 实际状态存在 8 项差异，以数据库为准修正 DDL 文件。

## 变更内容

### 缺失字段（5 项）

| Schema | 表名 | 操作 | 字段 | 数据库类型 | 说明 |
|--------|------|------|------|-----------|------|
| `dws` | `dws_assistant_daily_detail` | DDL 补充字段 | `unique_customers` | `INTEGER` | 当日服务独立客户数 |
| `dws` | `dws_assistant_daily_detail` | DDL 补充字段 | `unique_tables` | `INTEGER` | 当日服务独立台桌数 |
| `dws` | `dws_assistant_finance_analysis` | DDL 补充字段 | `unique_customers` | `INTEGER` | 统计周期内独立客户数 |
| `dws` | `dws_assistant_monthly_summary` | DDL 补充字段 | `unique_customers` | `INTEGER` | 当月服务独立客户数 |
| `dws` | `dws_assistant_monthly_summary` | DDL 补充字段 | `unique_tables` | `INTEGER` | 当月服务独立台桌数 |

### 缺失表（2 张）

| Schema | 表名 | 操作 | 说明 |
|--------|------|------|------|
| `dws` | `dws_member_assistant_intimacy` | DDL 补充整表 | 会员-助教亲密度指标表，记录会员与助教的互动频次和亲密度评分 |
| `dws` | `dws_member_recall_index` | DDL 补充整表 | 会员召回指数表，记录会员流失风险和召回优先级评分 |

### 缺失视图（1 个）

| Schema | 视图名 | 操作 | 说明 |
|--------|--------|------|------|
| `dws` | `v_member_recall_priority` | DDL 补充视图 | 会员召回优先级视图，基于 `dws_member_recall_index` 计算召回排序 |

## 变更原因

1. `unique_customers` / `unique_tables` 字段：DWS 汇总任务在运行时动态计算并写入的统计字段，DDL 文件在初始编写时遗漏
2. `dws_member_assistant_intimacy` 表：会员-助教亲密度分析功能上线时创建，DDL 文件未同步更新
3. `dws_member_recall_index` 表和 `v_member_recall_priority` 视图：会员召回分析功能上线时创建，DDL 文件未同步更新

## 影响范围

| 影响对象 | 影响程度 | 说明 |
|----------|----------|------|
| ETL 加载任务 | 无影响 | 本次仅修正 DDL 文档，不涉及数据库结构变更 |
| DWS 汇总任务 | 无影响 | 这些表/字段已在数据库中存在并被正常使用 |
| 后端 API | 无影响 | DDL 文件为文档性质，不影响运行时 |
| 小程序字段映射 | 无影响 | 小程序通过 API 访问，不直接读 DWS 层 |
| DWS 表级文档 | ⚠️ 需同步 | 新增表需补充 BD 手册表级文档；已有表文档需补充 `unique_customers`/`unique_tables` 字段 |
| 指数算法文档 | ⚠️ 需关注 | `dws_member_assistant_intimacy` 和 `dws_member_recall_index` 涉及自定义指数算法 |

**注意**：本次变更仅修正 DDL 文件（文档同步），数据库结构未发生任何变更。

## 回滚策略

本次为 DDL 文件修正（文档同步），无需数据库回滚。若需恢复 DDL 文件，使用 Git 回退即可：

```bash
git checkout HEAD~1 -- database/schema_dws.sql
```

若未来需要将数据库结构回退（不推荐，会丢失业务数据）：

```sql
-- 1) 删除补充的字段
ALTER TABLE dws.dws_assistant_daily_detail DROP COLUMN unique_customers;
ALTER TABLE dws.dws_assistant_daily_detail DROP COLUMN unique_tables;
ALTER TABLE dws.dws_assistant_finance_analysis DROP COLUMN unique_customers;
ALTER TABLE dws.dws_assistant_monthly_summary DROP COLUMN unique_customers;
ALTER TABLE dws.dws_assistant_monthly_summary DROP COLUMN unique_tables;

-- 2) 删除视图（必须先于依赖表）
DROP VIEW IF EXISTS dws.v_member_recall_priority;

-- 3) 删除补充的表
DROP TABLE IF EXISTS dws.dws_member_recall_index;
DROP TABLE IF EXISTS dws.dws_member_assistant_intimacy;
```

## 验证 SQL

```sql
-- 1) 确认 dws_assistant_daily_detail 包含 unique_customers 和 unique_tables
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_schema = 'dws'
  AND table_name = 'dws_assistant_daily_detail'
  AND column_name IN ('unique_customers', 'unique_tables')
ORDER BY column_name;
-- 预期：2 行，均为 integer

-- 2) 确认 dws_assistant_monthly_summary 包含 unique_customers 和 unique_tables
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_schema = 'dws'
  AND table_name = 'dws_assistant_monthly_summary'
  AND column_name IN ('unique_customers', 'unique_tables')
ORDER BY column_name;
-- 预期：2 行，均为 integer

-- 3) 确认 dws_assistant_finance_analysis 包含 unique_customers
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_schema = 'dws'
  AND table_name = 'dws_assistant_finance_analysis'
  AND column_name = 'unique_customers';
-- 预期：1 行，data_type = 'integer'

-- 4) 确认 dws_member_assistant_intimacy 表存在
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'dws'
  AND table_name = 'dws_member_assistant_intimacy';
-- 预期：1 行

-- 5) 确认 dws_member_recall_index 表存在
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'dws'
  AND table_name = 'dws_member_recall_index';
-- 预期：1 行

-- 6) 确认 v_member_recall_priority 视图存在
SELECT table_name, table_type
FROM information_schema.tables
WHERE table_schema = 'dws'
  AND table_name = 'v_member_recall_priority';
-- 预期：1 行，table_type = 'VIEW'

-- 7) 确认修正后 DDL 与数据库零差异（通过对比脚本验证）
-- python scripts/compare_ddl_db.py --schema dws --ddl-path database/schema_dws.sql
-- 预期：0 项差异
```

## 关联变更

- ODS 层同步修正：`docs/database/ODS/changes/2026-02-13_ddl_sync_ods.md`
- DWD 层同步修正：`docs/database/DWD/changes/2026-02-13_ddl_sync_dwd.md`
- DDL 文件：`database/schema_dws.sql`
- 对比结果：`docs/database/ddl_compare_results.md`
