9.8 KiB
9.8 KiB
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等 - 表名和字段名使用小写
- 每个字段定义单独一行,逗号在行末
- 括号格式:左括号后换行,右括号独占一行
CREATE TABLE IF NOT EXISTS dmk.table_name (
column1 type CONSTRAINT,
column2 type DEFAULT value
);
CREATE TABLE语句中的字段缩进使用4个空格COMMENT ON语句单独成行,保持对齐
注释规范
- 使用
COMMENT ON语句为表和字段添加注释,注释内容用单引号包裹 - 表注释说明表的用途、关联API或业务场景
- 字段注释说明字段含义、数据格式、取值范围和用途
- 使用
--进行代码内章节分隔注释
示例:
-- =========================================================
-- 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子句优化查询性能
示例:
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。
目标表设计原则 (Target Table Design)
1. 数据源选择与融合策略 (UNION 模式)
- 主从原则:除
tm_cell_grid_coverage_m以 ODS MR 数据为主外,其余目标表原则上以 ODS OTT 数据为主数。 - 场景化引入 MR:仅在涉及重叠覆盖、过覆盖、MOD 干扰等 MR 专有指标时,才引入 MR 数据源。
- 双源 UNION 模式:
- 室内外明细粒度 (
indoor_flagIN (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)。
重要注意事项
- 本项目仅涉及SQL代码的设计与开发,不包含任何执行、测试或运行操作
- 严禁在项目根目录创建缓存文件或临时文件,所有agent相关文件必须放在
.opencode/目录 - SQL文件包含PostGIS扩展,设计时需考虑
CREATE EXTENSION IF NOT EXISTS postgis; - 表定义统一使用
CREATE TABLE IF NOT EXISTS避免重复创建问题 - 涉及空间数据的表需要正确设置SRID(通常为4326,对应EPSG:4326)
- 字典表
td_dict_item使用复合主键(dict_type, dict_code)设计 - 所有表都应包含
is_valid字段用于逻辑删除,updated_time字段记录更新时间 - 表注释应说明该表支撑的API接口或业务功能
- 关键业务语义引用:在进行数据建模时,必须参考 ods/基础信息语义统一.md。注意 ODS 原始名称到
dmk规范名称的映射。 - 设计指引引用:目标表设计必须遵循 specs/openspec.md 中的总体原则。