com um clique
database-design
数据库设计技能包,提供完整的数据库设计指导。适用于新建数据库、设计规范查询、数据库优化咨询等场景。
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Menu
数据库设计技能包,提供完整的数据库设计指导。适用于新建数据库、设计规范查询、数据库优化咨询等场景。
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Baseado na classificação ocupacional SOC
专精于 HTML5 Canvas 网页与动画交互开发。创建高性能、视觉丰富的 Canvas 应用,包括粒子系统、数据可视化、交互式动画、游戏渲染等。当用户需要创建、修改或优化 Canvas 网页时调用此技能。
分析 Git 提交记录并生成面向非技术用户的友好变更日志。当用户需要将技术性提交日志转换为易读的更新摘要、创建发布说明或向客户/利益相关者沟通产品变更时调用此技能。
强制执行'先想清楚、再动手'工作流程。当任务涉及设计/架构决策、新功能实现、重构或任何需要规划的代码变更时调用此技能。
| name | database-design |
| description | 数据库设计技能包,提供完整的数据库设计指导。适用于新建数据库、设计规范查询、数据库优化咨询等场景。 |
本技能提供全面的数据库设计指导,涵盖从需求分析到物理设计的完整流程,帮助你构建高效、可靠、可扩展的数据库系统。
实体(Entity)
关系(Relationship)
主键(Primary Key)
外键(Foreign Key)
第一范式(1NF)
地址 字段应拆分为 省、市、区、详细地址第二范式(2NF)
第三范式(3NF)
BC范式(BCNF)
规范化程度选择
| 场景 | 推荐范式 | 原因 |
|---|---|---|
| OLTP系统 | 3NF/B CNF | 写操作频繁,需减少更新异常 |
| OLAP系统 | 2NF/1NF | 读操作频繁,允许适当冗余提升查询性能 |
| 简单表结构 | 保持3NF | 平衡性能与维护性 |
索引类型
索引设计原则
索引失效场景
%abc)收集信息
产出物
任务
ER图要素
┌─────────┐ ┌─────────┐
│ 实体A │ 1 ── N │ 实体B │
└─────────┘ └─────────┘
│
│ N
▼
┌─────────┐
│ 实体C │
└─────────┘
任务
转换规则
| ER元素 | 转换为 |
|---|---|
| 实体 | 表 |
| 属性 | 字段 |
| 多值属性 | 独立表 |
| 关系(1:1) | 外键或合并表 |
| 关系(1:N) | 外键在N端 |
| 关系(M:N) | 关联表 |
任务
字段类型选择原则
表结构设计模板
CREATE TABLE 表名 (
-- 主键
id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
-- 业务字段
字段1 VARCHAR(50) NOT NULL COMMENT '字段说明',
字段2 DECIMAL(10,2) DEFAULT 0 COMMENT '金额',
-- 审计字段
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted_at DATETIME DEFAULT NULL COMMENT '删除时间',
-- 索引
INDEX idx_字段1 (字段1),
UNIQUE INDEX uk_字段2 (字段2)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='表注释';
命名规范
t_user_info、t_order_detailuser_name、order_ididx_ + 字段名,如idx_user_nameid字段设计
表设计检查清单
索引创建原则
复合索引设计
WHERE a=1 AND b=2 AND c=3,索引顺序(a,b,c)索引维护
INSERT语句
INSERT INTO t_user (name, email, status) VALUES ('张三', 'zhangsan@example.com', 1);
INSERT INTO t_user VALUES (1, '张三', 'zhangsan@example.com', 1);
INSERT INTO t_order (user_id, amount) SELECT user_id, SUM(amount) FROM t_order_temp GROUP BY user_id;
UPDATE语句
UPDATE t_user SET status = 2, updated_at = NOW() WHERE id = 1;
UPDATE t_user SET balance = balance - 100 WHERE id = 1 AND balance >= 100;
SELECT语句
SELECT id, name, email FROM t_user WHERE status = 1 ORDER BY created_at DESC LIMIT 10;
SELECT a.id, a.name, b.order_count FROM t_user a LEFT JOIN (SELECT user_id, COUNT(*) as order_count FROM t_order GROUP BY user_id) b ON a.id = b.user_id;
避免的写法
SELECT * FROM t_user;
SELECT name, email FROM t_user WHERE id = '1';
SELECT * FROM t_order WHERE created_at LIKE '2024-01%';
查询优化
写入优化
架构优化
问题:表中存在重复数据如何处理?
解决方案
方案一:保留一条,删除其余
DELETE FROM t_user WHERE id NOT IN (
SELECT MIN(id) FROM t_user GROUP BY name, email
);
方案二:创建无重复表
CREATE TABLE t_user_new AS
SELECT * FROM t_user GROUP BY name, email;
RENAME TABLE t_user TO t_user_old, t_user_new TO t_user;
预防措施
问题:在线表添加字段、添加索引影响业务
解决方案
添加字段
ALTER TABLE t_order ADD COLUMN shipping_address VARCHAR(500) DEFAULT NULL COMMENT '收货地址',
ALGORITHM=INPLACE, LOCK=NONE;
添加索引
CREATE INDEX idx_user_id ON t_order(user_id), ALGORITHM=INPLACE, LOCK=NONE;
使用pt-online-schema-change
pt-online-schema-change --alter "ADD COLUMN new_col VARCHAR(100)" D=t_order,t=t_order
问题:深度分页查询越来越慢
问题SQL
SELECT * FROM t_order ORDER BY id LIMIT 1000000, 10;
解决方案
方案一:使用ID分页
SELECT * FROM t_order WHERE id > 1000000 ORDER BY id LIMIT 10;
方案二:使用延迟关联
SELECT a.* FROM t_order a
INNER JOIN (SELECT id FROM t_order ORDER BY id LIMIT 1000000, 10) b
ON a.id = b.id;
方案三:使用游标
SELECT * FROM t_order WHERE id > ? ORDER BY id LIMIT 10;
问题:多表JOIN查询性能差
解决方案
分析问题
EXPLAIN SELECT a.*, b.name FROM t_order a
JOIN t_user b ON a.user_id = b.id
WHERE b.status = 1;
优化策略
问题:如何安全迁移数据到新表?
解决方案
完整迁移流程
-- 1. 创建新表结构
CREATE TABLE t_user_new LIKE t_user;
-- 2. 迁移数据
INSERT INTO t_user_new SELECT * FROM t_user;
-- 3. 验证数据一致性
SELECT COUNT(*) FROM t_user;
SELECT COUNT(*) FROM t_user_new;
-- 4. 原子切换
RENAME TABLE t_user TO t_user_old, t_user_new TO t_user;
-- 5. 观察一段时间后删除旧表
DROP TABLE t_user_old;
问题:如何评估数据库存储容量?
评估方法
表容量估算
单表预估容量 = 预估行数 × (字段总长度 + 索引长度 + 开销)
考虑因素
容量规划检查清单
| 数据库 | 适用场景 | 特点 |
|---|---|---|
| MySQL | Web应用、中小型系统 | 轻量、开源生态好 |
| PostgreSQL | 复杂查询、企业级应用 | 功能丰富、扩展性强 |
| Oracle | 大型企业核心系统 | 稳定性高、功能全面 |
| SQL Server | Windows环境企业应用 | 微软生态、图形化管理 |
| 类型 | 代表产品 | 适用场景 |
|---|---|---|
| Key-Value | Redis、Memcached | 缓存、Session存储 |
| Document | MongoDB | 非结构化数据、内容管理 |
| Column | Cassandra、HBase | 时序数据、大数据存储 |
| Graph | Neo4j | 社交关系、知识图谱 |
OLTP系统
OLAP系统
混合场景
本技能的参考资料目录包含:
design-checklist.md - 设计检查清单sql-templates.md - SQL模板库naming-conventions.md - 命名规范文档performance-tuning.md - 性能调优指南case-studies/ - 案例分析目录本技能持续更新,如有疑问或建议请联系维护者。