Database design, query optimization, migrations, and indexing. Use when designing schemas, writing queries, or managing migrations.
View on GitHubskills/database/SKILL.md
February 2, 2026
Select agents to install to:
npx add-skill https://github.com/xiaobei930/claude-code-best-practices/blob/main/skills/database/SKILL.md -a claude-code --skill databaseInstallation paths:
.claude/skills/database/# 数据库模式技能
本技能提供数据库设计和操作的最佳实践,支持多数据库按需加载。
## 触发条件
- 设计数据库 Schema
- 编写数据库查询
- 优化查询性能
- 管理数据库迁移
- 配置索引
## 数据库专属模式
根据项目技术栈,加载对应的数据库专属文件:
| 数据库 | 加载文件 | 适用场景 |
| ---------- | ------------- | ---------------------- |
| PostgreSQL | `postgres.md` | 企业应用、复杂查询 |
| MySQL | `mysql.md` | Web 应用、读多写少 |
| Oracle | `oracle.md` | 大型企业、高并发 OLTP |
| SQLite | `sqlite.md` | 嵌入式、移动端、本地化 |
**检测方式**: 根据连接字符串、ORM 配置或项目依赖确定数据库类型。
---
## 通用 Schema 设计
### 命名规范
```sql
-- 表名:小写下划线,复数形式
users, order_items, user_preferences
-- 列名:小写下划线
created_at, updated_at, user_id, is_active
-- 索引名:idx_表名_列名
idx_users_email, idx_orders_user_id_created_at
-- 外键名:fk_表名_关联表
fk_orders_users
```
### 必备字段
```sql
CREATE TABLE users (
id BIGINT PRIMARY KEY, -- 主键
-- 业务字段...
created_at TIMESTAMP NOT NULL, -- 创建时间
updated_at TIMESTAMP NOT NULL, -- 更新时间
deleted_at TIMESTAMP -- 软删除
);
```
### 关系设计
| 关系类型 | 设计方式 | 示例 |
| -------- | ----------------- | ---------------------------- |
| 一对多 | 子表添加外键 | orders.user_id → users |
| 多对多 | 中间表 + 联合主键 | user_roles(user_id, role_id) |
| 一对一 | 子表主键 = 外键 | user_settings.user_id |
---
## 通用索引策略
### 何时创建索引
- ✅ WHERE 条件频繁使用的列
- ✅ JOIN 关联的列
- ✅ ORDER BY / GROUP BY 的列
- ❌ 很少查询的列
- ❌ 值重复率高的列(如性别)
- ❌ 频繁更新的列
### 索引类型选择
| 查询模式 | 推荐索引 |
| ------------------- | ------------- |
| `WHERE col = value` | B-tree |
| `WHERE col > value` | B-tree |
| 全文搜索 | 全文索引 |
| JSON 字段查询 | GIN/JSON 索引 |
| 时序数据范围查询 | BRIN(PG) |
### 复合索引原则
```sql
-- 规则:等值列在前,范围列在后
-- 查询:WHERE status = 'active' AND created_at > '2024-01-01'
-- ✅ 正确顺序
CREATE INDEX idx_orders_status_created ON orders(status, created_at);
-- ❌ 错误顺序(范围列在前会导致后续列无法使用索引)
CREATE INDEX idx_orders_created_status ON orders(created_at, status);
```
---
## N+1 问题
### 问题示例
```
获取 100 个用户及其订单:
1 次查询获取用户 + 100 次查询获取每个用户的订单