# Schema Exploration

> 用于发现和理解数据库结构、表、列和关系，支持 M-Schema 格式输出，智能表过滤

- Skill: `apconw/schema-exploration` (Agent Skill)
- Install (CLI): `npx skillmds@latest add apconw/schema-exploration`
- Raw SKILL.md: https://api.skillmd.com/api/skills/apconw/schema-exploration/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: apconw (https://skillmd.com/u/apconw)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/apconw/schema-exploration

---


# 架构探索技能

## 何时使用此技能

当您需要以下操作时使用此技能：
- 理解数据库结构
- 查找包含特定类型数据的表
- 发现列名和数据类型
- 映射表之间的关系
- 为 SQL 生成准备 M-Schema 格式的结构信息
- 回答诸如"有哪些表可用？"或"Customer 表有哪些列？"等问题

## 工作流程

### 1. 列出所有表

使用 `sql_db_list_tables` 工具查看数据库中所有可用的表。

这将返回您可以查询的完整表列表。

### 2. 智能表过滤（针对复杂查询）

当数据库表较多时，不要盲目获取所有表的 schema，而是先进行智能过滤：

1. **获取表列表后**，根据用户问题进行语义分析，提取关键实体和意图
2. **匹配策略**：
   - 将关键词与表名、表注释进行语义匹配（如"销售额" → 可能涉及 orders、sales、products 等表）
   - 考虑表之间的潜在关联（如用户问"客户订单"，需要同时选中 customers 和 orders）
   - 忽略明显无关的系统表、日志表、临时表
3. **输出**：筛选后的相关表名列表（通常 3-8 张表）

**内部思考模板：**
```
用户问题：{user_question}

数据库所有表：
- {table1}, {table2}, ...

任务：从上述表中选出与用户问题直接相关的表。
考虑因素：
1. 表名是否与问题中的实体/指标匹配
2. 是否需要关联表来补充维度信息
3. 忽略明显无关的系统表、日志表

选出的相关表：[table1, table2, ...]
```

### 3. 获取特定表的架构

使用 `sql_db_schema` 工具配合表名来检查：
- **列名** - 有哪些字段可用
- **数据类型** - INTEGER, TEXT, DATETIME 等
- **示例数据** - 示例数据以了解内容
- **主键** - 行的唯一标识符
- **外键** - 与其他表的关系
- **列注释** - 字段含义说明

**提示**：可以一次传入多个表名（逗号分隔），减少工具调用次数。

### 4. 获取表关系

使用 `sql_db_table_relationship` 工具获取表之间的外键/关联关系：
- **关联字段** - 两表通过哪些字段关联
- **JOIN 条件** - 返回格式如 `t_orders.customer_id = t_customers.id`

示例调用：
```
sql_db_table_relationship("t_orders, t_customers, t_products")
```

如果未配置表关系，可以通过以下方式推断：
- 查找以 "Id" 或 "_id" 结尾的列（例如，customer_id, product_id）
- 外键列名通常对应另一个表的主键
- 记录父子关系

### 5. 生成 M-Schema 格式（用于 SQL 生成）

当需要将 schema 信息传递给后续 SQL 生成步骤时，使用 M-Schema 格式组织信息：

```
【DB_ID】 {db_name}
【Schema】
# Table: {table_name}, {table_comment}
[
  ({column_name}:{column_type}, {column_comment}),
]
{foreign_key_1}
{foreign_key_2}
```

**数据库特定规则：**
- PostgreSQL/Oracle/SQL Server: 使用 `schema.table_name` 格式
- MySQL/ClickHouse/SQLite: 使用纯 `table_name`

**引号规则：**
| 数据库类型 | 引号 |
|-----------|------|
| MySQL | \`反引号\` |
| PostgreSQL | "双引号" |
| SQLite | "双引号" |
| SQL Server | [方括号] |
| Oracle | "双引号" |
| ClickHouse | "双引号" |

### 6. 回答问题

提供清晰的信息：
- 可用表及其用途
- 列名及其包含的内容
- 表之间的关联方式
- 示例数据以说明内容

## 示例："有哪些表可用？"

**步骤 1：** 使用 `sql_db_list_tables`

**响应：**
```
数据库包含多个表：
1. Customer - 存储客户信息
2. Employee - 存储员工信息
3. Invoice - 客户购买记录
4. InvoiceLine - 发票中的单个项目
...
```

## 示例："这些表之间有什么关系？"

**步骤 1：** 使用 `sql_db_table_relationship("Customer, Invoice, InvoiceLine")`

**响应：**
```
表之间的关系如下：
  • Invoice.CustomerId = Customer.Id
  • InvoiceLine.InvoiceId = Invoice.Id

✅ 表关系已获取完成。
```

## 示例："准备查询销售额数据的 M-Schema"

**步骤 1：** `sql_db_list_tables` → 智能过滤出 orders, products, customers
**步骤 2：** `sql_db_schema("orders, products, customers")` → 获取完整 schema
**步骤 3：** `sql_db_table_relationship("orders, products, customers")` → 获取关系
**步骤 4：** 组织为 M-Schema 格式：

```
【DB_ID】 sales_db
【Schema】
# Table: orders, 订单表
[
  (id:INTEGER, 订单ID),
  (customer_id:INTEGER, 客户ID),
  (product_id:INTEGER, 产品ID),
  (amount:DECIMAL, 订单金额),
  (order_date:DATETIME, 下单时间),
]
orders.customer_id = customers.id
orders.product_id = products.id

# Table: products, 产品表
[
  (id:INTEGER, 产品ID),
  (name:VARCHAR, 产品名称),
  (category:VARCHAR, 产品类别),
  (price:DECIMAL, 单价),
]

# Table: customers, 客户表
[
  (id:INTEGER, 客户ID),
  (name:VARCHAR, 客户名称),
  (region:VARCHAR, 所属区域),
]
```

## 质量指南

**对于"列出表"问题：**
- 显示所有表名
- 添加每个表包含内容的简要描述
- 对相关表进行分组（例如，交易、人员）

**对于"描述表"问题：**
- 列出所有列及其数据类型
- 解释每列包含的内容
- 显示示例数据以提供上下文
- 注明主键和外键
- 解释与其他表的关系

**对于"如何查询 X"问题：**
- 识别所需的表
- 映射 JOIN 路径
- 解释关系链
- 建议下一步（使用查询编写技能）

**对于复杂查询准备：**
- 使用智能表过滤，只选相关表
- 生成 M-Schema 格式供 SQL 生成使用
- 明确标注表关系和 JOIN 条件

## 常见探索模式

### 模式 1：查找表
"哪个表包含客户信息？"
→ 使用 list_tables，然后描述 Customer 表

### 模式 2：理解结构
"Invoice 表中有什么？"
→ 使用 schema 工具显示列和示例数据

### 模式 3：映射关系
"客户如何与发票关联？"
→ 使用 `sql_db_table_relationship("Customer, Invoice, InvoiceLine")` 获取关系

### 模式 4：查询准备
"我要分析各产品销售情况"
→ 智能过滤 → 获取 schema → 获取关系 → 输出 M-Schema

## 提示

- 外键通常以 "Id" 结尾，并匹配表名
- 使用示例数据了解值的格式
- 不确定使用哪个表时，先列出所有表
- 获取 schema 时尽量一次传入多个相关表名，减少工具调用
- M-Schema 格式有助于后续 SQL 生成的准确性

