164 lines
9.8 KiB
Markdown
Raw Permalink 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.

# AGENTS.md - 电信集团PG+HiveSQL项目指南
## 项目概述
本项目是以PostgreSQL + HiveSQL为主的数据计算项目专注于SQL设计和开发工作包括DDL定义、表结构设计、数据模型设计。**本项目不涉及任何SQL执行、脚本运行或命令操作仅进行SQL代码的设计与维护。**
## SQL编码规范
### 命名约定
- **模式名**: 使用`dmk`作为主模式data mart kit
- **表名**:
- 使用`td_`前缀表示维度表dimension table`td_account_period``td_region`
- 使用`tm_`前缀表示事实表或中间表fact/middle table
- 表名使用小写字母和下划线分隔snake_case
- **字段名**: 使用小写字母和下划线分隔snake_case`region_code``updated_time``data_type`
- **索引名**: 使用`idx_`前缀,后跟表名和字段名,如`idx_td_region_geom``idx_td_region_parent`
- **约束名**: 主键使用`PRIMARY KEY`关键字,外键使用`fk_`前缀
### 格式化规则
- **关键字使用大写**`CREATE TABLE``SELECT``INSERT INTO``WHERE``AND`
- **表名和字段名使用小写**
- 每个字段定义单独一行,逗号在行末
- 括号格式:左括号后换行,右括号独占一行
```sql
CREATE TABLE IF NOT EXISTS dmk.table_name (
column1 type CONSTRAINT,
column2 type DEFAULT value
);
```
- `CREATE TABLE`语句中的字段缩进使用4个空格
- `COMMENT ON`语句单独成行,保持对齐
### 注释规范
- 使用`COMMENT ON`语句为表和字段添加注释,注释内容用单引号包裹
- 表注释说明表的用途、关联API或业务场景
- 字段注释说明字段含义、数据格式、取值范围和用途
- 使用`--`进行代码内章节分隔注释
示例:
```sql
-- =========================================================
-- 1. 通用维度与配置表
-- =========================================================
CREATE TABLE IF NOT EXISTS dmk.td_region (
region_code integer PRIMARY KEY,
region_name varchar(64) NOT NULL
);
COMMENT ON TABLE dmk.td_region IS '行政区域维表,保留区域树、区域 WKT 和区域空间索引字段。';
COMMENT ON COLUMN dmk.td_region.region_code IS '区域编码,全国/省/市/区县统一主键';
COMMENT ON COLUMN dmk.td_region.region_name IS '区域名称';
```
### 数据类型选择
- 整数使用`integer`,避免使用`int`
- 变长字符串使用`varchar(n)`并指定长度,避免使用`text`(除非确实需要存储任意长度文本)
- 时间字段使用`timestamp without time zone``timestamptz`
- 布尔值使用`boolean`,默认值为`true`/`false`
- 枚举值使用`varchar`配合`CHECK`约束,如:`CHECK (region_level IN ('nation', 'province', 'city', 'district'))`
- 空间数据使用PostGIS类型`geometry(Point, 4326)``geometry(MultiPolygon, 4326)`
- 数值类型使用`numeric(precision, scale)`,如`numeric(10, 6)`
### 约束与索引设计
- 主键在字段定义处使用`PRIMARY KEY`,或在表定义末尾统一指定
- 复合主键使用`PRIMARY KEY (col1, col2)`格式
- 所有业务字段明确指定`NOT NULL`约束(除非允许为空)
- 逻辑删除字段使用`is_valid smallint NOT NULL DEFAULT 1`1=有效0=无效)
- 时间字段默认使用`DEFAULT now()`
- 排序字段使用`DEFAULT 0`
- 创建索引时使用`IF NOT EXISTS`避免重复
- 空间索引使用`USING gist(geom_column)`语法
- 部分索引使用`WHERE`子句优化查询性能
示例:
```sql
CREATE INDEX IF NOT EXISTS idx_td_region_geom ON dmk.td_region USING gist(region_geom) WHERE region_geom IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_td_region_parent ON dmk.td_region(parent_region_code, region_level, sort_no);
```
### 表设计模式
- **维度表设计**:包含编码、名称、层级、父级编码、排序号、有效性标志、更新时间
- **字典表设计**:使用复合主键`(dict_type, dict_code)`,包含字典项名称、描述、排序号
- **账期表设计**:区分数据来源类型,包含年月、是否当前账期等字段
- **空间表设计**包含WKT文本字段和生成的几何字段支持空间索引
### CHECK约束规范
- 枚举值约束使用`CHECK (column IN ('value1', 'value2', ...))`
- 范围约束使用`CHECK (column >= 0 AND column <= 100)`
- CHECK约束紧跟在字段定义之后或表定义末尾
## 项目结构
```
.opencode/ # Agent配置和缓存目录严禁在项目根目录创建任何文件
docs/ # 文档目录包含生成的表定义CSV文件
*.sql # SQL DDL/DML脚本文件
parse_ddl*.js # DDL解析脚本仅用于文档生成不涉及执行
parse_ddl.py # DDL解析脚本仅用于文档生成不涉及执行
fix_epsg.js # EPSG坐标系处理工具仅用于文档生成
```
## 应用层表模型规范 (Application Layer Table Models)
### 1. 表分类标识说明
在查阅项目文档或进行表设计时,必须关注表名后缀的特殊标识:
- **`#` (依赖维表)**:本项目计算过程中重点依赖的外部维度表(由第三方提供)。它们是计算的基础,智能体需重点关注其字段语义。
- **`*` (目标计算表)**:本项目需要通过 SQL 计算生成的最终目标表。这是智能体开发工作的核心产出。
- **辅助表**:未带有 `#``*` 标识的表为辅助表,通常用于前端展示或配置,除非特别说明,否则不需要在计算逻辑中重点关注。
### 2. 文档维护与读写禁忌
- **文档权威性**`docs/tables/` 目录下的 `.md` 文件是应用层设计的唯一权威定义。
- **修改限制****未经明确授权,严禁**修改 `docs/tables/` 目录下的任何 `.md` 文件(包括索引文件 `index.md`)。
- **数据访问限制****未经明确授权,严禁**对 `docs/tables/*_archive` 目录下的 `.csv` 文件进行读写操作。
- **详细索引参考**:完整的表清单及其业务功能说明请参考 [docs/tables/index.md](/docs/tables/index.md)。
## 目标表设计原则 (Target Table Design)
### 1. 数据源选择与融合策略 (UNION 模式)
- **主从原则**:除 `tm_cell_grid_coverage_m`**ODS MR** 数据为主外,其余目标表原则上以 **ODS OTT** 数据为主数。
- **场景化引入 MR**仅在涉及重叠覆盖、过覆盖、MOD 干扰等 MR 专有指标时,才引入 MR 数据源。
- **双源 UNION 模式**
- **室内外明细粒度 (`indoor_flag` IN (0, 1))**:数据源锁定为 **ODS MR**,代表电信本网深度覆盖。
- **全量聚合粒度 (`indoor_flag = -1`)**:数据源锁定为 **ODS OTT**,代表全网大盘覆盖。
- **集成方式**:两类数据执行 `UNION ALL` 后存入目标表。**严禁**在同一行中混合两个数据源的原始指标。
- **维度缺省填充**:若数据源缺失目标维度,必须使用默认值(如 `indoor_flag = -1`, `freq = 'all'`)。
### 2. 指标计算与聚合规范
- **加权平均原则**:严禁对 `avg_xxx` 字段直接执行 `AVG()`。必须使用公式:`SUM(total_xxx) / SUM(xxx_count)`
- **用户数去重**:跨栅格聚合(如区域、楼宇)的用户数统计必须基于 `device_id_list` 去重。推荐使用近似计算函数(如 `approx_count_distinct`)。
- **字段过滤**涉及“市场份额”、“驻留比”、“高价值”、“VIP”等字样的字段直接置空NULL处理。
### 3. 专项表设计规则
- **tm_cluster_area_m (融合聚类)**遵循“OTT 锚点聚类 + MR 空间回填”策略。基于 OTT 弱覆盖栅格确立簇边界,通过空间关联回填 MR 侧质差指标。最终表不含 `indoor_flag` 字段。
- **tm_region_coverage_m**:行政区域聚合时,必须确保 `indoor_flag` 的维度完整性(涵盖 0, 1, -1
- **楼宇分类判别**:仅在 OTT 分支(`indoor_flag = -1`)下执行判定逻辑,严格遵循 `specs/build_type_specs.md`
## 开发工作流规范
### 1. 计算逻辑 Skill 化
- 每个目标表的梳理结论必须沉淀为独立的 Skill 文档。
- 存储路径:`target_table_skills/{table_name}.md`
- Skill 文档是智能体生成 SQL 的唯一基准。
### 2. 产物归档与结构
- 所有开发产物SQL、Shell必须按表归档。
- 存储路径:`src/{table_name}/`
- 要求SQL 与 Shell 脚本分离,且必须包含一个 `README.md` 说明执行顺序与依赖。
## 运行环境与持久化
- **双侧冗余**:核心维表(如 `td_grid`, `td_building_cell_m`)需在 PG支撑应用和 Hive支撑大规模聚合两侧同步备份。
- **全量持久化**:所有核心维表和目标计算表最终必须持久化存储于 PostgreSQL (PG) 中。
- **计算侧重**:默认以 HiveSQL 侧计算为主,仅在涉及空间计算(如 `tm_cluster_area_m`)时使用 PostGIS (PG)。
## 重要注意事项
1. **本项目仅涉及SQL代码的设计与开发不包含任何执行、测试或运行操作**
2. **严禁在项目根目录创建缓存文件或临时文件**所有agent相关文件必须放在`.opencode/`目录
3. SQL文件包含PostGIS扩展设计时需考虑`CREATE EXTENSION IF NOT EXISTS postgis;`
4. 表定义统一使用`CREATE TABLE IF NOT EXISTS`避免重复创建问题
5. 涉及空间数据的表需要正确设置SRID通常为4326对应EPSG:4326
6. 字典表`td_dict_item`使用复合主键`(dict_type, dict_code)`设计
7. 所有表都应包含`is_valid`字段用于逻辑删除,`updated_time`字段记录更新时间
8. 表注释应说明该表支撑的API接口或业务功能
9. **关键业务语义引用**:在进行数据建模时,必须参考 [ods/基础信息语义统一.md](/ods/基础信息语义统一.md)。注意 ODS 原始名称到 `dmk` 规范名称的映射。
10. **设计指引引用**:目标表设计必须遵循 [specs/openspec.md](/specs/openspec.md) 中的总体原则。