编写"数据库筑基课"文章的专用 Skill,面向数据库架构师、DBA 和业务开发者。输入一个筑基课文章标题及相关参考资料(技术文档、产品手册、开源项目地址、deepwiki、论文等),输出图文并茂、结构完整的 Markdown 筑基课文章,保存至项目 markdown/ 目录。适用主题覆盖:表存储结构(heap/parquet/arrow/zedstore/LSM-Tree/HStore等)、索引结构(btree/gin/brin/hnsw/ivfflat/bloom等)、数据类型与操作符(vector/jsonb/tsvector/range/array等)、优化器扫描算法(seq scan/index scan/bitmap scan/join/agg/并行等)、场景化实践(时序/GIS/RAG/全文检索/图数据/数据湖等)以及事务/锁/并发/安全等周边主题。只要用户提及"筑基课"、"数据库原理"、"数据库内核"写作,或给出了数据库存储/索引/扫描相关的技术文档让你写成教程,都应使用此 Skill。
69
85%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
核心目标:让数据库架构师、DBA、业务开发者学完每篇筑基课后,能将知识直接用于工作实践,打下坚实基础。
输入: 文章标题 + 参考资料(URL / 文档 / 论文 / 代码仓库)
│
├─ Step 1: 读取参考资料
├─ Step 2: 按"标准文章结构"起草提纲
├─ Step 3: 逐节撰写内容(含图表、代码、示例)
├─ Step 4: 自检(逻辑 / 代码 / 事实)
└─ Step 5: 输出 Markdown 文件 → markdown/<slug>.md每篇筑基课文章必须包含以下 12 个章节,可根据主题适当增减子节:
# 数据库筑基课 - <标题>
> 所属系列: [数据库筑基课大纲](链接)
> 难度: ★☆☆ / ★★☆ / ★★★
> 适合角色: 架构师 / DBA / 业务开发者
---
## 0. 导读(Why Read This)
## 1. 背景与痛点(Background & Pain Points)
## 2. 核心原理(Core Principles)
## 3. 数据结构 / 存储格式 / 算法详解(Deep Dive)
## 4. 优势与适合场景(Strengths & Use Cases)
## 5. 劣势与不适合场景(Weaknesses & Anti-Patterns)
## 6. 竞品 / 横向技术对比(Comparison)
## 7. 实操与最佳实践(Hands-on & Best Practices)
## 8. 性能调优(Performance Tuning)
## 9. 思考与边界(Thinking & Boundaries)
## 10. 常见问题(FAQ)
## 11. 扩展阅读(Further Reading)根据主题选择合适的子节,参考如下分类:
存储结构类(heap/parquet/arrow/zedstore/LSM等)
索引结构类(btree/gin/brin/hnsw/bloom等)
扫描与计算类(seq scan/index scan/join/agg/并行等)
数据类型类(vector/jsonb/tsvector等)
graph TD
A[Client] --> B[Buffer Pool]
B --> C{命中?}
C -- Yes --> D[直接返回]
C -- No --> E[从磁盘读取 Block]File Layout:
┌─────────────────────────────────┐
│ Block 0 │ Block 1 │ ... │
│ (8KB) │ (8KB) │ │
└─────────────────────────────────┘
Block Layout:
┌──────────────┬────────────────────────┐
│ Page Header │ Line Pointers (lp[]) │
├──────────────┴────────────────────────┤
│ Free Space │
├───────────────────────────────────────┤
│ Tuple N │ ... │ Tuple 2 │ Tuple 1 │
└───────────────────────────────────────┘| 特性 | heap(行存) | parquet(列存) | zedstore(行列混存) |
|---|---|---|---|
| OLTP 写入 | ★★★★★ | ★★☆☆☆ | ★★★★☆ |
| OLAP 扫描 | ★★☆☆☆ | ★★★★★ | ★★★★☆ |
| ... | ... | ... | ... |
在确实需要 SVG 时,使用简洁的 <svg> 内联图,宽度限制在 700px 以内。
-- 【示例】创建 heap 表并观察存储结构
CREATE TABLE tbl_demo (
id BIGSERIAL PRIMARY KEY,
name TEXT,
score FLOAT
) WITH (fillfactor = 80);
-- 插入测试数据
INSERT INTO tbl_demo (name, score)
SELECT 'user_' || g, random() * 100
FROM generate_series(1, 100000) g;
-- 查看物理文件路径
SELECT pg_relation_filepath('tbl_demo');
-- 查看 block 内容(需要 pageinspect 插件)
SELECT * FROM heap_page_items(get_raw_page('tbl_demo', 0)) LIMIT 5;sql / bash / python / json)在生成最终文件前,逐项检查:
□ 文章结构是否覆盖了 12 个标准章节(允许合并,不允许缺失关键章节)
□ 每个技术概念是否有对应的图示(layout/流程图/对比表)
□ 所有 SQL / 代码示例是否语法正确(逐行检查关键字、括号、引号)
□ 核心原理是否有"类比"帮助理解
□ 对比章节是否客观(不只夸自己,要说出竞品优势)
□ 边界/不适合场景是否明确
□ 扩展阅读的链接格式是否正确
□ 文件名格式是否符合 <YYYYMMDD>_<slug>.md
□ 文章开头是否有"所属系列"链接 和 "难度/角色"标注# 目录: markdown/
# 命名: YYYYMMDD_<topic-slug>.md
# 示例:
markdown/20240919_heap-storage.md
markdown/20241015_parquet-columnar.md
markdown/20250624_hnsw-vector-index.md保存完毕后,输出:
| 主题类别 | 典型技术点 | 关联大纲章节 |
|---|---|---|
| 行存 | heap, HOT-update, vacuum, FSM, VM | 一、表组织结构 |
| 列存(磁盘) | parquet, orc, lance, vortex | 一、表组织结构 |
| 列存(内存) | arrow, monetdb in-memory, DuckDB | 一、表组织结构 |
| 行列混存 | zedstore, vops | 一、表组织结构 |
| 追加写优化 | LSM-Tree, HStore/HBase | 一、表组织结构 |
| 有序存储 | cluster table, 索引组织表 | 一、表组织结构 |
| 冷热分层 | Iceberg, Delta Lake, Hudi | 一、表组织结构 |
| 传统索引 | btree, hash, bitmap, brin, bloom, gin | 二、索引组织结构 |
| 全文索引 | gin+tsvector, BM25, zombodb | 二、索引组织结构 |
| 向量索引 | hnsw, ivfflat, pgvectorscale, vectorchord | 二、索引组织结构 |
| 特殊索引 | partial/expression/include/global index | 二、索引组织结构 |
| 数据类型 | vector, jsonb, tsvector, range, array | 三、数据类型和操作符 |
| 扫描算法 | seq/index/bitmap/index-only scan | 四、扫描&计算 |
| Join 算法 | nested loop, hash join, merge join | 四、扫描&计算 |
| 并行计算 | parallel scan, EPQ, JIT, 向量化 | 四、扫描&计算 |
| 场景实践 | 时序/GIS/RAG/全文/图/数据湖 | 五、应用实践 |
| 周边能力 | 事务/锁/连接池/安全/存储过程 | 六、其他 |
当用户提供的参考资料为 URL 时:
web_fetch 获取完整内容## 1. 背景与痛点
数据库最基础的问题:**一条记录写到哪里?怎么找回来?**
在 heap 之前,如果要自己实现存储,可能会想到顺序存文件——但这样读一条记录需要扫全表。
heap 的设计解决了三个核心问题:
| 问题 | heap 的解法 |
|--------------|----------------------|
| 写到哪里? | FSM 快速找空闲 block |
| 怎么定位一行? | ctid = (blockNum, lp) |
| 怎么回收空间? | vacuum + autovacuum |
## 2. 核心原理
### 整体架构
```
Table Files:
main: tbl.1, tbl.2, ... ← 数据文件(每个最大 1GB)
fsm: tbl_fsm ← 空闲空间图(Free Space Map)
vm: tbl_vm ← 可见性图(Visibility Map)
```
### Block 内部结构
```
┌─────────────────────────────────────────┐ ← Block(默认 8KB)
│ PageHeaderData (24B) │
│ lp[1] lp[2] lp[3] ... lp[N] │ ← Line Pointers(4B each)
│ │
│ ← Free Space → │
│ │
│ Tuple 3 Tuple 2 Tuple 1 │ ← 从尾部向前增长
└─────────────────────────────────────────┘
ctid = (BlockNum, lp_index)
例:ctid=(0,1) 表示第0块,第1条记录
```以上即为"数据库筑基课"Skill 的完整指南。 每次生成文章后,务必运行自检清单,确认内容逻辑正确、代码可运行,再保存文件。
3b9c83d
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.