本文へ移動
cccskills
無料GitHub で公開

database-schema-designer

Projete esquemas de banco de dados robustos e escaláveis para SQL e NoSQL. Fornece diretrizes de normalização, estratégias de indexação, padrões de migração, design de restrições e otimização de desempenho. Garante integridade de dados, desempenho de consultas e modelos de dados mantíveis.

インストール方法を見る

含まれるファイル(4)

  • SKILL.md18.6 KB
  • assets/templates/migration-template.sql1.9 KB
  • README.md7.4 KB
  • references/schema-design-checklist.md3.3 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Designer de Esquema de Banco de Dados

Projete esquemas de banco de dados prontos para produção com boas práticas integradas.


Início Rápido

Apenas descreva seu modelo de dados:

design a schema for an e-commerce platform with users, products, orders

Você receberá um esquema SQL completo como:

CREATE TABLE users (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  email VARCHAR(255) UNIQUE NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE orders (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  user_id BIGINT NOT NULL REFERENCES users(id),
  total DECIMAL(10,2) NOT NULL,
  INDEX idx_orders_user (user_id)
);

O que incluir em sua solicitação:

  • Entidades (usuários, produtos, pedidos)
  • Relacionamentos-chave (usuários têm pedidos, pedidos têm itens)
  • Dicas de escala (alto tráfego, milhões de registros)
  • Preferência de banco de dados (SQL/NoSQL) - padrão é SQL se não especificado

Gatilhos

GatilhoExemplo
design schema"design a schema for user authentication"
database design"database design for multi-tenant SaaS"
create tables"create tables for a blog system"
schema for"schema for inventory management"
model data"model data for real-time analytics"
I need a database"I need a database for tracking orders"
design NoSQL"design NoSQL schema for product catalog"

Termos-Chave

TermoDefinição
NormalizaçãoOrganizar dados para reduzir redundância (1FN → 2FN → 3FN)
3FNTerceira Forma Normal - sem dependências transitivas entre colunas
OLTPOnline Transaction Processing - muitas escritas, precisa normalização
OLAPOnline Analytical Processing - muitas leituras, beneficia-se de desnormalização
Chave Estrangeira (FK)Coluna que referencia a chave primária de outra tabela
ÍndiceEstrutura de dados que acelera consultas (ao custo de escritas mais lentas)
Padrão de AcessoComo sua aplicação lê/escreve dados (consultas, joins, filtros)
DesnormalizaçãoDuplicar dados intencionalmente para acelerar leituras

Referência Rápida

TarefaAbordagemConsideração-Chave
Novo esquemaNormalize para 3FN primeiroModelagem de domínio sobre UI
SQL vs NoSQLPadrões de acesso decidemRazão leitura/escrita importa
Chaves primáriasINT ou UUIDUUID para sistemas distribuídos
Chaves estrangeirasSempre restringirEstratégia ON DELETE crítica
ÍndicesFKs + colunas WHEREOrdem das colunas importa
MigraçõesSempre reversíveisCompatível com versão anterior primeiro

Visão Geral do Processo

Seus Requisitos de Dados
    |
    v
+-----------------------------------------------------+
| Fase 1: ANÁLISE                                     |
| * Identificar entidades e relacionamentos           |
| * Determinar padrões de acesso (leitura vs escrita) |
| * Escolher SQL ou NoSQL baseado em requisitos      |
+-----------------------------------------------------+
    |
    v
+-----------------------------------------------------+
| Fase 2: DESIGN                                      |
| * Normalizar para 3FN (SQL) ou embed/reference      |
| * Definir chaves primárias e estrangeiras           |
| * Escolher tipos de dados apropriados               |
| * Adicionar restrições (UNIQUE, CHECK, NOT NULL)    |
+-----------------------------------------------------+
    |
    v
+-----------------------------------------------------+
| Fase 3: OTIMIZAR                                    |
| * Planejar estratégia de indexação                  |
| * Considerar desnormalização para consultas pesadas |
| * Adicionar timestamps (created_at, updated_at)     |
+-----------------------------------------------------+
    |
    v
+-----------------------------------------------------+
| Fase 4: MIGRAR                                      |
| * Gerar scripts de migração (up + down)             |
| * Garantir compatibilidade com versão anterior      |
| * Planejar deployment sem tempo de inatividade      |
+-----------------------------------------------------+
    |
    v
Esquema Pronto para Produção

Comandos

ComandoQuando UsarAção
design schema for {domain}Começando do zeroGeração completa de esquema
normalize {table}Corrigindo tabela existenteAplicar regras de normalização
add indexes for {table}Problemas de desempenhoGerar estratégia de indexação
migration for {change}Evolução de esquemaCriar migração reversível
review schemaCode reviewAuditar esquema existente

Workflow: Comece com design schema → itere com normalize → otimize com add indexes → evolua com migration


Princípios Centrais

PrincípioPOR QUÊImplementação
Modelar o DomínioUI muda, domínio nãoNomes de entidades refletem conceitos do negócio
Integridade de Dados PrimeiroCorrupção é custosa de corrigirRestrições no nível de banco de dados
Otimizar para Padrão de AcessoNão dá para otimizar para ambosOLTP: normalizado, OLAP: desnormalizado
Planejar para EscalaRetrofit é dolorosoEstratégia de índice + plano de particionamento

Anti-Padrões

EvitarPor QuêInstead
VARCHAR(255) em tudoDesperdiça armazenamento, esconde intençãoDimensionar apropriadamente por campo
FLOAT para dinheiroErros de arredondamentoDECIMAL(10,2)
Sem restrições de FKDados órfãosSempre definir chaves estrangeiras
Sem índices em FKsJOINs lentosIndexar toda chave estrangeira
Armazenar datas como stringsNão consegue comparar/ordenarTipos DATE, TIMESTAMP
SELECT * em consultasBusca dados desnecessáriosListas de coluna explícitas
Migrações não reversíveisNão consegue reverterSempre escrever migração DOWN
Adicionar NOT NULL sem defaultQuebra linhas existentesAdicionar nullable, backfill, depois restringir

Checklist de Verificação

Após projetar um esquema:

  • Toda tabela tem chave primária
  • Todos os relacionamentos têm restrições de chave estrangeira
  • Estratégia ON DELETE definida para cada FK
  • Índices existem em todas as chaves estrangeiras
  • Índices existem em colunas consultadas frequentemente
  • Tipos de dados apropriados (DECIMAL para dinheiro, etc.)
  • NOT NULL em campos obrigatórios
  • Restrições UNIQUE onde necessário
  • Restrições CHECK para validação
  • Timestamps created_at e updated_at
  • Scripts de migração são reversíveis
  • Testado em staging com dados de produção

<details> <summary><strong>Aprofundamento: Normalização (SQL)</strong></summary>

Formas Normais

FormaRegraExemplo de Violação
1FNValores atômicos, sem grupos repetidosproduct_ids = '1,2,3'
2FN1FN + sem dependências parciaiscustomer_name em order_items
3FN2FN + sem dependências transitivascountry derivado de postal_code

Primeira Forma Normal (1FN)

-- RUIM: Múltiplos valores em coluna
CREATE TABLE orders (
  id INT PRIMARY KEY,
  product_ids VARCHAR(255)  -- '101,102,103'
);

-- BOM: Tabela separada para itens
CREATE TABLE orders (
  id INT PRIMARY KEY,
  customer_id INT
);

CREATE TABLE order_items (
  id INT PRIMARY KEY,
  order_id INT REFERENCES orders(id),
  product_id INT
);

Segunda Forma Normal (2FN)

-- RUIM: customer_name depende apenas de customer_id
CREATE TABLE order_items (
  order_id INT,
  product_id INT,
  customer_name VARCHAR(100),  -- Dependência parcial!
  PRIMARY KEY (order_id, product_id)
);

-- BOM: Dados do cliente em tabela separada
CREATE TABLE customers (
  id INT PRIMARY KEY,
  name VARCHAR(100)
);

Terceira Forma Normal (3FN)

-- RUIM: country depende de postal_code
CREATE TABLE customers (
  id INT PRIMARY KEY,
  postal_code VARCHAR(10),
  country VARCHAR(50)  -- Dependência transitiva!
);

-- BOM: Tabela separada de postal_codes
CREATE TABLE postal_codes (
  code VARCHAR(10) PRIMARY KEY,
  country VARCHAR(50)
);

Quando Desnormalizar

CenárioEstratégia de Desnormalização
Relatórios com muitas leiturasAgregados pré-calculados
JOINs carosColunas derivadas em cache
Dashboards de analyticsVisualizações materializadas
-- Desnormalizado para desempenho
CREATE TABLE orders (
  id INT PRIMARY KEY,
  customer_id INT,
  total_amount DECIMAL(10,2),  -- Calculado
  item_count INT               -- Calculado
);
</details> <details> <summary><strong>Aprofundamento: Tipos de Dados</strong></summary>

Tipos String

TipoCaso de UsoExemplo
CHAR(n)Comprimento fixoCódigos de estado, datas ISO
VARCHAR(n)Comprimento variávelNomes, emails
TEXTConteúdo longoArtigos, descrições
-- Bom dimensionamento
email VARCHAR(255)
phone VARCHAR(20)
country_code CHAR(2)

Tipos Numéricos

TipoIntervaloCaso de Uso
TINYINT-128 a 127Idade, códigos de status
SMALLINT-32K a 32KQuantidades
INT-2.1B a 2.1BIDs, contagens
BIGINTMuito grandeIDs grandes, timestamps
DECIMAL(p,s)Precisão exataDinheiro
FLOAT/DOUBLEAproximadoDados científicos
-- SEMPRE usar DECIMAL para dinheiro
price DECIMAL(10, 2)  -- R$99.999.999,99

-- NUNCA usar FLOAT para dinheiro
price FLOAT  -- Erros de arredondamento!

Tipos Data/Hora

DATE        -- 2025-10-31
TIME        -- 14:30:00
DATETIME    -- 2025-10-31 14:30:00
TIMESTAMP   -- Conversão automática de timezone

-- Sempre armazenar em UTC
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

Booleano

-- PostgreSQL
is_active BOOLEAN DEFAULT TRUE

-- MySQL
is_active TINYINT(1) DEFAULT 1
</details> <details> <summary><strong>Aprofundamento: Estratégia de Indexação</strong></summary>

Quando Criar Índices

Sempre IndexarRazão
Chaves estrangeirasAcelera JOINs
Colunas em cláusula WHEREAcelera filtragem
Colunas em ORDER BYAcelera ordenação
Restrições únicasForça unicidade
-- Índice de chave estrangeira
CREATE INDEX idx_orders_customer ON orders(customer_id);

-- Índice de padrão de consulta
CREATE INDEX idx_orders_status_date ON orders(status, created_at);

Tipos de Índice

TipoMelhor ParaExemplo
B-TreeIntervalos, igualdadeprice > 100
HashApenas correspondência exataemail = 'x@y.com'
Full-textBusca de textoMATCH AGAINST
ParcialSubconjunto de linhasWHERE is_active = true

Ordem de Índice Composto

CREATE INDEX idx_customer_status ON orders(customer_id, status);

-- Usa índice (customer_id primeiro)
SELECT * FROM orders WHERE customer_id = 123;
SELECT * FROM orders WHERE customer_id = 123 AND status = 'pending';

-- NÃO usa índice (status sozinho)
SELECT * FROM orders WHERE status = 'pending';

Regra: Coluna mais seletiva primeiro, ou coluna consultada sozinha com mais frequência.

Armadilhas de Índice

ArmadilhaProblemaSolução
Sobre-indexaçãoEscritas lentasIndexar apenas o que é consultado
Ordem de coluna erradaÍndice não utilizadoCorresponder padrões de consulta
Índices FK faltantesJOINs lentosSempre indexar FKs
</details> <details> <summary><strong>Aprofundamento: Restrições</strong></summary>

Chaves Primárias

-- Auto-increment (simples)
id INT AUTO_INCREMENT PRIMARY KEY

-- UUID (sistemas distribuídos)
id CHAR(36) PRIMARY KEY DEFAULT (UUID())

-- Composta (tabelas de junção)
PRIMARY KEY (student_id, course_id)

Chaves Estrangeiras

FOREIGN KEY (customer_id) REFERENCES customers(id)
  ON DELETE CASCADE     -- Deletar filhos com pai
  ON DELETE RESTRICT    -- Prevenir deleção se referenciado
  ON DELETE SET NULL    -- Definir como NULL quando pai deletado
  ON UPDATE CASCADE     -- Atualizar filhos quando pai muda
EstratégiaUsar Quando
CASCADEDados dependentes (order_items)
RESTRICTReferências importantes (prevenir acidentes)
SET NULLRelacionamentos opcionais

Outras Restrições

-- Único
email VARCHAR(255) UNIQUE NOT NULL

-- Único composto
UNIQUE (student_id, course_id)

-- Check
price DECIMAL(10,2) CHECK (price >= 0)
discount INT CHECK (discount BETWEEN 0 AND 100)

-- Not null
name VARCHAR(100) NOT NULL
</details> <details> <summary><strong>Aprofundamento: Padrões de Relacionamento</strong></summary>

Um para Muitos

CREATE TABLE orders (
  id INT PRIMARY KEY,
  customer_id INT NOT NULL REFERENCES customers(id)
);

CREATE TABLE order_items (
  id INT PRIMARY KEY,
  order_id INT NOT NULL REFERENCES orders(id) ON DELETE CASCADE,
  product_id INT NOT NULL,
  quantity INT NOT NULL
);

Muitos para Muitos

-- Tabela de junção
CREATE TABLE enrollments (
  student_id INT REFERENCES students(id) ON DELETE CASCADE,
  course_id INT REFERENCES courses(id) ON DELETE CASCADE,
  enrolled_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (student_id, course_id)
);

Auto-Referenciado

CREATE TABLE employees (
  id INT PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  manager_id INT REFERENCES employees(id)
);

Polimórfico

-- Abordagem 1: FKs separadas (integridade mais forte)
CREATE TABLE comments (
  id INT PRIMARY KEY,
  content TEXT NOT NULL,
  post_id INT REFERENCES posts(id),
  photo_id INT REFERENCES photos(id),
  CHECK (
    (post_id IS NOT NULL AND photo_id IS NULL) OR
    (post_id IS NULL AND photo_id IS NOT NULL)
  )
);

-- Abordagem 2: Tipo + ID (flexível, integridade mais fraca)
CREATE TABLE comments (
  id INT PRIMARY KEY,
  content TEXT NOT NULL,
  commentable_type VARCHAR(50) NOT NULL,
  commentable_id INT NOT NULL
);
</details> <details> <summary><strong>Aprofundamento: Design NoSQL (MongoDB)</strong></summary>

Embedding vs Referencing

FatorEmbedReference
Padrão de acessoLer juntoLer separadamente
Relacionamento1:poucos1:muitos
Tamanho do documentoPequenoPróximo de 16MB
Frequência de atualizaçãoRaramenteFrequentemente

Documento Embedido

{
  "_id": "order_123",
  "customer": {
    "id": "cust_456",
    "name": "Jane Smith",
    "email": "jane@example.com"
  },
  "items": [
    { "product_id": "prod_789", "quantity": 2, "price": 29.99 }
  ],
  "total": 109.97
}

Documento Referenciado

{
  "_id": "order_123",
  "customer_id": "cust_456",
  "item_ids": ["item_1", "item_2"],
  "total": 109.97
}

Índices MongoDB

// Campo único
db.users.createIndex({ email: 1 }, { unique: true });

// Composto
db.orders.createIndex({ customer_id: 1, created_at: -1 });

// Busca de texto
db.articles.createIndex({ title: "text", content: "text" });

// Geoespacial
db.stores.createIndex({ location: "2dsphere" });
</details> <details> <summary><strong>Aprofundamento: Migrações</strong></summary>

Boas Práticas de Migração

PráticaPOR QUÊ
Sempre reversívelPrecisa reverter
Compatível com versão anteriorZero-downtime deploys
Schema antes dos dadosSeparar responsabilidades
Testar em stagingPegar problemas cedo

Adicionar Coluna (Zero-Downtime)

-- Passo 1: Adicionar coluna nullable
ALTER TABLE users ADD COLUMN phone VARCHAR(20);

-- Passo 2: Deploy de código que escreve na nova coluna

-- Passo 3: Backfill de linhas existentes
UPDATE users SET phone = '' WHERE phone IS NULL;

-- Passo 4: Fazer obrigatório (se necessário)
ALTER TABLE users MODIFY phone VARCHAR(20) NOT NULL;

Renomear Coluna (Zero-Downtime)

-- Passo 1: Adicionar nova coluna
ALTER TABLE users ADD COLUMN email_address VARCHAR(255);

-- Passo 2: Copiar dados
UPDATE users SET email_address = email;

-- Passo 3: Deploy de código lendo da nova coluna
-- Passo 4: Deploy de código escrevendo na nova coluna

-- Passo 5: Dropar coluna antiga
ALTER TABLE users DROP COLUMN email;

Template de Migração

-- Migration: YYYYMMDDHHMMSS_description.sql

-- UP
BEGIN;
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
CREATE INDEX idx_users_phone ON users(phone);
COMMIT;

-- DOWN
BEGIN;
DROP INDEX idx_users_phone ON users;
ALTER TABLE users DROP COLUMN phone;
COMMIT;
</details> <details> <summary><strong>Aprofundamento: Otimização de Desempenho</strong></summary>

Análise de Consulta

EXPLAIN SELECT * FROM orders
WHERE customer_id = 123 AND status = 'pending';
Procure PorSignificado
type: ALLFull table scan (ruim)
type: refÍndice usado (bom)
key: NULLNenhum índice usado
rows: altoMuitas linhas escaneadas

Problema N+1 Queries

# RUIM: N+1 queries
orders = db.query("SELECT * FROM orders")
for order in orders:
    customer = db.query(f"SELECT * FROM customers WHERE id = {order.customer_id}")

# BOM: Single JOIN
results = db.query("""
    SELECT orders.*, customers.name
    FROM orders
    JOIN customers ON orders.customer_id = customers.id
""")

Técnicas de Otimização

TécnicaQuando Usar
Adicionar índicesWHERE/ORDER BY lentos
DesnormalizarJOINs caros
PaginaçãoGrandes conjuntos de resultados
CachingConsultas repetidas
Read replicasCarga de leitura pesada
ParticionamentoTabelas muito grandes
</details>

Pontos de Extensão

  1. Padrões Específicos de Banco de Dados: Adicionar variações MySQL vs PostgreSQL vs SQLite
  2. Padrões Avançados: Time-series, event sourcing, CQRS, multi-tenancy
  3. Integração com ORM: Padrões TypeORM, Prisma, SQLAlchemy
  4. Monitoramento: Rastreamento de desempenho de consultas, alertas de consulta lenta

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

Especialista em construir experiências 3D para a web - Three.js, React Three Fiber, Spline, WebGL e cenas 3D interativas. Cobre configuradores de produtos, portfólios 3D, websites imersivos e adição de profundidade às experiências web. Use quando: website 3D, three.js, WebGL, react three fiber, experiência 3D.

日本語の概要は準備中です。原文の説明を表示しています。

artubss/SKILLS-CLAUDE-CODE112026年5月17日 更新

Quando o usuário quer planejar, projetar ou implementar um teste A/B ou experimento. Também use quando o usuário menciona "teste A/B", "split test", "experimento", "testar essa mudança", "copy variante", "teste multivariado" ou "hipótese". Para implementação de rastreamento, veja analytics-tracking.

日本語の概要は準備中です。原文の説明を表示しています。

artubss/SKILLS-CLAUDE-CODE112026年5月17日 更新

Auditar e melhorar a acessibilidade web seguindo as diretrizes WCAG 2.1. Use quando solicitado para "melhorar acessibilidade", "auditoria a11y", "conformidade WCAG", "suporte a leitor de tela", "navegação por teclado" ou "tornar acessível".

日本語の概要は準備中です。原文の説明を表示しています。

artubss/SKILLS-CLAUDE-CODE112026年5月17日 更新

Testes e benchmarking de agentes LLM incluindo testes comportamentais, avaliação de capacidades, métricas de confiabilidade e monitoramento em produção—onde até os melhores agentes alcançam menos de 50% em benchmarks do mundo real. Use quando: testes de agentes, avaliação de agentes, benchmark de agentes, confiabilidade de agentes, teste de agentes.

日本語の概要は準備中です。原文の説明を表示しています。

artubss/SKILLS-CLAUDE-CODE112026年5月17日 更新

Criar, gerenciar e orquestrar agentes de IA usando o CLI AI Maestro. Use quando o usuário pedir para "criar agente", "listar agentes", "deletar agente", "hibernar agente", "despertar agente", "instalar plugin", "mostrar agente", "reiniciar agente" ou qualquer tarefa de gerenciamento do ciclo de vida do agente.

日本語の概要は準備中です。原文の説明を表示しています。

artubss/SKILLS-CLAUDE-CODE112026年5月17日 更新

Gerencie múltiplos agentes CLI locais via sessões tmux (iniciar/parar/monitorar/atribuir) com agendamento compatível com cron.

日本語の概要は準備中です。原文の説明を表示しています。

artubss/SKILLS-CLAUDE-CODE112026年5月17日 更新

artubss のスキルをすべて見る

このスキルの問題を報告する