name: database-designer description: 设计和优化数据库模式,支持PostgreSQL、MySQL、SQLite和MongoDB。包括ER建模、规范化、索引优化和迁移脚本生成。 metadata: short-description: 设计数据库模式和迁移脚本
数据库设计师技能
描述
通过实体关系建模、规范化和迁移脚本,设计和优化数据库模式。
触发条件
/db-design命令- 用户请求数据库模式设计
- 用户需要迁移脚本
提示
你是一名数据库架构师,负责设计高效、可扩展的数据库模式。
PostgreSQL 模式示例
-- 用户表
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email VARCHAR(255) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
name VARCHAR(100) NOT NULL,
avatar_url TEXT,
email_verified BOOLEAN DEFAULT FALSE,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- 为邮箱查询创建索引
CREATE INDEX idx_users_email ON users(email);
-- 带外键的帖子表
CREATE TABLE posts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
title VARCHAR(255) NOT NULL,
content TEXT,
status VARCHAR(20) DEFAULT 'draft' CHECK (status IN ('draft', 'published', 'archived')),
published_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- 用户帖子的复合索引
CREATE INDEX idx_posts_user_status ON posts(user_id, status);
-- 全文搜索索引
CREATE INDEX idx_posts_search ON posts USING GIN(to_tsvector('english', title || ' ' || content));
-- updated_at 触发器
CREATE OR REPLACE FUNCTION update_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER users_updated_at
BEFORE UPDATE ON users
FOR EACH ROW EXECUTE FUNCTION update_updated_at();
Entity Framework Core 迁移示例
public class CreateUsersTable : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Users",
columns: table => new
{
Id = table.Column<Guid>(nullable: false, defaultValueSql: "gen_random_uuid()"),
Email = table.Column<string>(maxLength: 255, nullable: false),
PasswordHash = table.Column<string>(maxLength: 255, nullable: false),
Name = table.Column<string>(maxLength: 100, nullable: false),
CreatedAt = table.Column<DateTime>(nullable: false, defaultValueSql: "NOW()")
},
constraints: table =>
{
table.PrimaryKey("PK_Users", x => x.Id);
});
migrationBuilder.CreateIndex(
name: "IX_Users_Email",
table: "Users",
column: "Email",
unique: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(name: "Users");
}
}
索引优化指南
-- 良好:在频繁查询的列上创建选择性索引
CREATE INDEX idx_orders_status ON orders(status) WHERE status = 'pending';
-- 良好:为常见查询创建覆盖索引
CREATE INDEX idx_orders_user_date ON orders(user_id, created_at DESC) INCLUDE (total, status);
-- 避免:在低基数列上创建索引
-- CREATE INDEX idx_users_active ON users(is_active); -- 只有2个值!
标签
数据库, sql, 模式, 设计, 优化, 迁移
兼容性
- Codex: ✅
- Claude Code: ✅