بنقرة واحدة
database-design
数据库设计和优化技能,涵盖 ER 图、规范化、索引、分片、查询优化和数据库最佳实践。使用此技能设计数据库架构、优化查询、规划数据架构,或需要数据库扩展和性能调优指导时使用。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
数据库设计和优化技能,涵盖 ER 图、规范化、索引、分片、查询优化和数据库最佳实践。使用此技能设计数据库架构、优化查询、规划数据架构,或需要数据库扩展和性能调优指导时使用。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Expert Git skills covering interactive rebase, worktree management, reflog recovery, bisect debugging, advanced workflows, commit message best practices, and clean history management. Use this skill when needing advanced Git operations, cleaning commit history, managing multiple worktrees, recovering lost commits, debugging with bisect, or implementing sophisticated Git workflows.
Go language development skill focusing on Fiber web framework, Cobra CLI, GORM ORM, Clean Architecture, and concurrent programming. Use this skill when building Go web applications, developing CLI tools with Cobra, implementing RESTful APIs with Fiber, or need guidance on Go architecture design and performance optimization.
Skill for summarizing the current session's context, including completed tasks, technical decisions, and next steps. Use this skill when you need to create a handover document for a new session, switch contexts without losing critical information, or document what was accomplished before ending a session.
Provides core Swift 6+ language development capabilities, covering concurrency, macros, model design, and business logic. Use this skill when writing ViewModel, Service, or Repository layer code, defining data models, implementing algorithms, writing unit tests, or fixing concurrency warnings and data races.
Specialized in building user interfaces using modern SwiftUI, covering NavigationStack, Observation framework, and SwiftData integration. Use this skill when writing SwiftUI view files, designing app navigation, handling animations and transitions, or binding ViewModel data to the interface.
System architecture design skill covering architecture patterns, distributed systems, technology selection, and enterprise architecture documentation. Use this skill when designing system architectures, evaluating technology stacks, planning distributed systems, or creating architecture decision records and documentation.
| name | database-design |
| description | 数据库设计和优化技能,涵盖 ER 图、规范化、索引、分片、查询优化和数据库最佳实践。使用此技能设计数据库架构、优化查询、规划数据架构,或需要数据库扩展和性能调优指导时使用。 |
你是一位拥有 15 年以上经验的专家级数据库架构师,精通设计高性能、可扩展和可维护的数据库系统。你专注于关系型数据库设计、ER 建模、规范化、索引优化、分片、数据迁移和灾难恢复。
规则: 每列包含原子值,无重复组
❌ 不良设计:
users
| id | name | phones |
|----|------|----------------------|
| 1 | John | 123-456, 789-012 |
✅ 良好设计:
users
| id | name |
|----|------|
| 1 | John |
user_phones
| id | user_id | phone |
|----|---------|----------|
| 1 | 1 | 123-456 |
| 2 | 1 | 789-012 |
规则: 1NF + 无部分依赖(非键属性依赖于整个主键)
❌ 不良设计(部分依赖):
order_items
| order_id | product_id | product_name | quantity | unit_price |
|----------|------------|--------------|----------|------------|
| 1 | 100 | Widget | 5 | 10.00 |
问题: product_name 仅依赖于 product_id,而不是 (order_id, product_id)
✅ 良好设计:
products
| product_id | product_name |
|------------|--------------|
| 100 | Widget |
order_items
| order_id | product_id | quantity | unit_price |
|----------|------------|----------|------------|
| 1 | 100 | 5 | 10.00 |
规则: 2NF + 无传递依赖(非键属性仅依赖于主键)
❌ 不良设计(传递依赖):
employees
| emp_id | name | dept_id | dept_name | dept_location |
|--------|------|---------|--------------|---------------|
| 1 | John | 10 | Engineering | Building A |
问题: dept_name 和 dept_location 依赖于 dept_id,而非直接依赖于 emp_id
✅ 良好设计:
employees
| emp_id | name | dept_id |
|--------|------|---------|
| 1 | John | 10 |
departments
| dept_id | dept_name | dept_location |
|---------|--------------|---------------|
| 10 | Engineering | Building A |
反规范化的场景:
1. 读密集型工作负载,JOIN 成本高
2. 报告/分析数据库
3. 缓存层
4. 避免热路径中的复杂 JOIN
5. 用存储空间换查询性能
技术:
- 物化视图
- 计算列
- 冗余数据以加快读取
- 聚合表
示例:
与其:
SELECT o.*, u.username, u.email
FROM orders o
JOIN users u ON o.user_id = u.id
反规范化:
orders 表包含 username 和 email 列(当用户更改时更新)
-- 适用于:
-- - 精确匹配: WHERE id = 123
-- - 范围查询: WHERE created_at > '2025-01-01'
-- - 排序: ORDER BY created_at DESC
-- - 前缀匹配: WHERE name LIKE 'John%'
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_orders_created ON orders(created_at);
CREATE INDEX idx_products_name ON products(name);
-- 最左前缀规则: 索引可用于:
-- (col1), (col1, col2), (col1, col2, col3)
-- 但不能用于: (col2), (col3), (col2, col3)
CREATE INDEX idx_orders_user_status_created
ON orders(user_id, status, created_at);
-- 此索引可以优化:
✅ WHERE user_id = 123
✅ WHERE user_id = 123 AND status = 1
✅ WHERE user_id = 123 AND status = 1 AND created_at > '2025-01-01'
✅ WHERE user_id = 123 ORDER BY status, created_at
-- 此索引无法优化:
❌ WHERE status = 1 -- 不以 user_id 开头
❌ WHERE created_at > '2025-01-01' -- 不以 user_id 开头
❌ WHERE user_id = 123 AND created_at > '2025-01-01' -- 跳过 status
-- 索引包含查询所需的所有列(无需访问表)
CREATE INDEX idx_users_email_name_status
ON users(email, name, status);
-- 此查询仅使用索引(无需表查找):
SELECT name, status FROM users WHERE email = 'john@example.com';
-- EXPLAIN 显示: Using index(无 "Using where" = 覆盖索引)
-- 1. 索引列上的函数
❌ WHERE DATE(created_at) = '2025-01-01' -- 索引未使用
✅ WHERE created_at >= '2025-01-01 00:00:00'
AND created_at < '2025-01-02 00:00:00'
-- 2. 隐式类型转换
❌ WHERE user_id = '123' -- user_id 是 INT,'123' 是字符串
✅ WHERE user_id = 123
-- 3. 前导通配符
❌ WHERE name LIKE '%john%' -- 索引未使用
✅ WHERE name LIKE 'john%' -- 可以使用索引
-- 4. 不同列上的 OR 条件
❌ WHERE user_id = 123 OR email = 'john@example.com' -- 索引可能未使用
✅ 使用 UNION 代替:
(SELECT * FROM users WHERE user_id = 123)
UNION
(SELECT * FROM users WHERE email = 'john@example.com')
-- 5. NOT 条件
❌ WHERE status != 1 -- 可能不使用索引
✅ WHERE status IN (2, 3, 4, 5) -- 更好
-- ID
✅ BIGINT -- 8 字节,范围: -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
✅ BIGINT UNSIGNED -- 8 字节,范围: 0 到 18,446,744,073,709,551,615
❌ INT -- 仅 4 字节,大数据量可能溢出
-- 金额/小数
✅ DECIMAL(10, 2) -- 精确精度,用于金额
❌ FLOAT, DOUBLE -- 浮点误差,切勿用于金额
-- 字符串
✅ VARCHAR(n) -- 可变长度,节省空间
❌ CHAR(n) -- 固定长度,除非真正固定否则浪费空间
✅ TEXT -- 长文本(最多 65,535 字节)
✅ MEDIUMTEXT -- 最多 16MB
✅ LONGTEXT -- 最多 4GB
-- 日期和时间
✅ TIMESTAMP -- 4 字节,UTC,范围: 1970-2038(Unix 时间戳)
✅ DATETIME -- 8 字节,无时区,范围: 1000-9999
✅ DATE -- 3 字节,仅日期
✅ TIME -- 3 字节,仅时间
-- 枚举(状态码)
✅ TINYINT -- 1 字节,范围: -128 到 127 或 0 到 255(无符号)
配合注释使用: status TINYINT COMMENT '1:active, 2:inactive, 3:deleted'
❌ ENUM('active', 'inactive') -- 难以更改,避免使用
-- 布尔值
✅ TINYINT(1) -- MySQL 的布尔值标准
✅ BOOLEAN -- PostgreSQL 有原生布尔类型
-- JSON
✅ JSON (MySQL 5.7+) -- 原生 JSON 类型,带验证
✅ JSONB (PostgreSQL) -- 二进制 JSON,可索引,快速
❌ TEXT + 手动解析 -- 低效,无验证
-- UUID
✅ BINARY(16) -- UUID 的高效存储
✅ CHAR(36) -- 人类可读的 UUID 字符串
❌ VARCHAR(36) -- 浪费空间(UUID 长度固定)
CREATE TABLE users (
-- 主键
user_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-- 业务列
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
-- 状态/标志
status TINYINT NOT NULL DEFAULT 1 COMMENT '1:active, 2:inactive, 3:deleted',
is_verified TINYINT(1) NOT NULL DEFAULT 0,
-- 时间戳(始终包含)
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-- 软删除(可选)
deleted_at TIMESTAMP NULL DEFAULT NULL,
-- 索引
INDEX idx_username (username),
INDEX idx_email (email),
INDEX idx_status (status),
INDEX idx_created_at (created_at)
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci
COMMENT='用户表';
-- 主键
ALTER TABLE users ADD PRIMARY KEY (user_id);
-- 外键(在大型系统中谨慎使用)
ALTER TABLE orders
ADD CONSTRAINT fk_orders_users
FOREIGN KEY (user_id) REFERENCES users(user_id)
ON DELETE RESTRICT -- 如果被引用则阻止删除
ON UPDATE CASCADE; -- 如果 PK 更改则更新引用
-- 唯一约束
ALTER TABLE users ADD UNIQUE KEY uk_email (email);
-- 检查约束(MySQL 8.0+,PostgreSQL)
ALTER TABLE users ADD CONSTRAINT chk_age CHECK (age >= 0 AND age <= 150);
-- 默认值
ALTER TABLE users ALTER COLUMN status SET DEFAULT 1;
分片策略(基于哈希、基于范围、一致性哈希、地理分片、挑战):参见 references/sharding-strategies.md 查询优化流程(EXPLAIN分析、索引策略、查询重写):参见 references/query-optimization.md 数据迁移策略和备份恢复:参见 references/migration-backup.md
提出这些问题:
示例: 电商系统
实体:
- User(用户)
- Product(产品)
- Order(订单)
- OrderItem(订单项)
- Category(分类)
- Review(评论)
- Payment(支付)
- Address(地址)
属性:
User: user_id, username, email, password_hash, created_at
Product: product_id, name, description, price, stock, category_id
Order: order_id, user_id, total_amount, status, created_at
OrderItem: item_id, order_id, product_id, quantity, unit_price
User 1----N Order(一个用户有多个订单)
Order 1----N OrderItem(一个订单有多个商品)
Product 1----N OrderItem(一个产品在多个订单中)
Product N----1 Category(多个产品在一个分类中)
Product 1----N Review(一个产品有多个评论)
User 1----N Review(一个用户写多个评论)
User 1----N Address(一个用户有多个地址)
Order 1----1 Payment(一个订单有一个支付)
[User] ──1:N── [Order] ──1:N── [OrderItem] ──N:1── [Product]
│ │ │
│ │ │
1 1 N
│ │ │
[Address] [Payment] [Category]
│ │
1 1
│ │
[Review] ──────────────────────────────────────────────┘
应用规范化规则(1NF → 2NF → 3NF),然后评估是否需要反规范化。
在帮助进行数据库设计时:
当用户寻求数据库设计帮助时:
根据答案,提供量身定制的、可用于生产的数据库设计。