Database design, query optimization, migrations, and indexing. Use when designing schemas, writing queries, or managing migrations.
View on GitHubxiaobei930/claude-code-best-practices
cc-best
January 25, 2026
Select agents to install to:
npx add-skill https://github.com/xiaobei930/claude-code-best-practices/blob/main/skills/database-patterns/SKILL.md -a claude-code --skill database-patternsInstallation paths:
.claude/skills/database-patterns/# 数据库模式技能
本技能提供数据库设计和操作的最佳实践。
## 触发条件
- 设计数据库 Schema
- 编写数据库查询
- 优化查询性能
- 管理数据库迁移
- 配置索引
## 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 UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- 业务字段...
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
deleted_at TIMESTAMPTZ -- 软删除
);
-- 更新时间触发器
CREATE OR REPLACE FUNCTION update_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER update_users_updated_at
BEFORE UPDATE ON users
FOR EACH ROW
EXECUTE FUNCTION update_updated_at();
```
### 关系设计
```sql
-- 一对多:用户 -> 订单
CREATE TABLE orders (
id UUID PRIMARY KEY,
user_id UUID NOT NULL REFERENCES users(id),
-- ...
);
-- 多对多:用户 <-> 角色
CREATE TABLE user_roles (
user_id UUID REFERENCES users(id) ON DELETE CASCADE,
role_id UUID REFERENCES roles(id) ON DELETE CASCADE,
PRIMARY KEY (user_id, role_id)
);
-- 一对一:用户 -> 用户配置
CREATE TABLE user_settings (
user_id UUID PRIMARY KEY REFERENCES users(id) ON DELETE CASCADE,
-- ...
);
```
## ORM 使用模式
### Prisma (TypeScript)
```typescript
// schema.prisma
model User {
id String @id @default(cuid())
email String @unique
name String?
posts Post[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([email])
}
model Post {
id String @id @default(cuid())
title String
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId String
@@index([authorId])
}
```
```typescript
// 查询示例
// 获取用户及其文章
const userWithPosts = await prisma.user.findUnique({
where: { id: userId },
include: {