164 lines
9.8 KiB
Markdown
Raw Normal View History

# 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) 中的总体原则。