算法艺术创作
algorithmic-art
通过代码和可调参数创作生成艺术与交互式视觉效果。
database-designer【设计与创意】Use quando o usuário pedir para projetar schemas de banco de dados, planejar migrações de dados, otimizar queries, escolher entre SQL e NoSQL, ou modelar relacionamentos de dados.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
name: "database-designer" description: "Use quando o usuário pedir para projetar schemas de banco de dados, planejar migrações de dados, otimizar queries, escolher entre SQL e NoSQL, ou modelar relacionamentos de dados." agents:
Uma skill abrangente de design de banco de dados que fornece análise em nível de especialista, otimização e capacidades de migração para sistemas de banco de dados modernos. Esta skill combina princípios teóricos com ferramentas práticas para ajudar arquitetos e desenvolvedores a criar schemas de banco de dados escaláveis, performáticos e mantíveis.
→ Veja references/database-design-reference.md para detalhes
-- INNER JOIN: apenas linhas correspondentes
SELECT o.id, c.name, o.total
FROM orders o
INNER JOIN customers c ON c.id = o.customer_id;
-- LEFT JOIN: todas as linhas à esquerda, NULLs para não correspondências
SELECT c.name, COUNT(o.id) AS order_count
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Auto-join: dados hierárquicos (funcionários/gerentes)
SELECT e.name AS employee, m.name AS manager
FROM employees e
LEFT JOIN employees m ON m.id = e.manager_id;
-- CTE recursiva para organograma
WITH RECURSIVE org AS (
SELECT id, name, manager_id, 1 AS depth
FROM employees WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, e.manager_id, o.depth + 1
FROM employees e INNER JOIN org o ON o.id = e.manager_id
)
SELECT * FROM org ORDER BY depth, name;
-- ROW_NUMBER para paginação / dedup
SELECT *, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY created_at DESC) AS rn
FROM orders;
-- RANK com lacunas, DENSE_RANK sem lacunas
SELECT name, score, RANK() OVER (ORDER BY score DESC) AS rank FROM leaderboard;
-- LAG/LEAD para comparar linhas adjacentes
SELECT date, revenue,
revenue - LAG(revenue) OVER (ORDER BY date) AS daily_change
FROM daily_sales;
-- Cláusula FILTER (PostgreSQL) para agregação condicional
SELECT
COUNT(*) AS total,
COUNT(*) FILTER (WHERE status = 'active') AS active,
AVG(amount) FILTER (WHERE amount > 0) AS avg_positive
FROM accounts;
-- GROUPING SETS para rollups em múltiplos níveis
SELECT region, product, SUM(revenue)
FROM sales
GROUP BY GROUPING SETS ((region, product), (region), ());
Cada migração deve ter uma contraparte reversível. Nomeie os arquivos com um prefixo de timestamp para ordenação:
migrations/
├── 20260101_000001_create_users.up.sql
├── 20260101_000001_create_users.down.sql
├── 20260115_000002_add_users_email_index.up.sql
└── 20260115_000002_add_users_email_index.down.sql
Use o padrão expand-contract para evitar bloqueio ou quebra do código em execução:
-- Atualização em lote para evitar bloqueios de longa duração
UPDATE users SET email_normalized = LOWER(email)
WHERE id IN (SELECT id FROM users WHERE email_normalized IS NULL LIMIT 5000);
-- Repita em um loop até que 0 linhas sejam afetadas
down.sql em staging antes de implantar o up.sql em produção| Tipo de Índice | Caso de Uso | Exemplo |
|---|---|---|
| B-tree (padrão) | Igualdade, range, ORDER BY | CREATE INDEX idx_users_email ON users(email); |
| GIN | Busca full-text, JSONB, arrays | CREATE INDEX idx_docs_body ON docs USING gin(to_tsvector('english', body)); |
| GiST | Geometria, tipos de range, vizinho mais próximo | CREATE INDEX idx_locations ON places USING gist(coords); |
| Parcial | Subconjunto de linhas (reduz tamanho) | CREATE INDEX idx_active ON users(email) WHERE active = true; |
| Covering | Varreduras somente de índice | CREATE INDEX idx_cov ON orders(customer_id) INCLUDE (total, created_at); |
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT) SELECT ...;
Sinais principais a observar:
Sintomas: a aplicação emite uma query por linha (ex.: buscando registros relacionados em um loop).
Correções:
JOIN ou subquery para buscar em uma única viagem de ida e voltaselect_related / includes / with)| Ferramenta | Protocolo | Melhor Para |
|---|---|---|
| PgBouncer | PostgreSQL | Pooling de transação/statement, baixa sobrecarga |
| ProxySQL | MySQL | Roteamento de query, separação leitura/escrita |
| Pool integrado (HikariCP, SQLAlchemy pool) | Qualquer | Pooling em nível de aplicação |
Regra geral: Defina o tamanho do pool como (2 * núcleos de CPU) + spindles de disco. Para SSDs na nuvem, comece com 2 * vCPUs e ajuste.
SELECT para réplicas; escritas para o primáriopg_last_wal_replay_lsn() para detectar lag antes de ler dados críticos| Critério | PostgreSQL | MySQL | SQLite | SQL Server |
|---|---|---|---|---|
| Melhor para | Queries complexas, JSONB, extensões | Apps web, cargas de trabalho de leitura intensa | Embarcado, dev/test, edge | Stacks .NET enterprise |
| Suporte a JSON | Excelente (JSONB + GIN) | Bom (tipo JSON) | Mínimo | Bom (OPENJSON) |
| Replicação | Streaming, lógica | Replicação em grupo, cluster InnoDB | N/A | Always On AG |
| Licenciamento | Open source (Licença PostgreSQL) | Open source (GPL) / comercial | Domínio público | Comercial |
| Tamanho máximo prático | Multi-TB | Multi-TB | ~1 TB (single-writer) | Multi-TB |
Quando escolher:
| Banco de Dados | Modelo | Usar Quando |
|---|---|---|
| MongoDB | Documento | Flexibilidade de schema, prototipagem rápida, gerenciamento de conteúdo |
| Redis | Chave-valor / cache | Store de sessão, limitação de taxa, leaderboards, pub/sub |
| DynamoDB | Wide-column | Apps AWS serverless, latência de um dígito em milissegundos em qualquer escala |
Use SQL como padrão. Recorra ao NoSQL apenas quando o padrão de acesso claramente se beneficiar.
| Estratégia | Como Funciona | Prós | Contras |
|---|---|---|---|
| Hash | shard = hash(key) % N | Distribuição uniforme | Resharding é caro |
| Range | Shard por data ou range de ID | Simples, bom para séries temporais | Pontos quentes no shard mais recente |
| Geográfico | Shard por região do usuário | Localidade de dados, conformidade | Queries entre regiões são difíceis |
| Padrão | Consistência | Latência | Caso de Uso |
|---|---|---|---|
| Síncrono | Forte | Maior latência de escrita | Transações financeiras |
| Assíncrono | Eventual | Baixa latência de escrita | Apps web com leitura intensa |
| Semi-síncrono | Pelo menos uma réplica confirmada | Moderada | Equilíbrio de segurança e velocidade |
O design eficaz de banco de dados exige equilibrar múltiplas preocupações concorrentes: performance, escalabilidade, manutenibilidade e requisitos de negócio. Esta skill fornece as ferramentas e o conhecimento para tomar decisões informadas ao longo do ciclo de vida do banco de dados, desde o design inicial do schema até a otimização em produção e evolução.
As ferramentas incluídas automatizam tarefas comuns de análise e otimização, enquanto os guias abrangentes fornecem a base teórica para tomar decisões arquiteturais sólidas. Seja construindo um novo sistema ou otimizando um existente, esses recursos fornecem orientação em nível de especialista para criar soluções de banco de dados robustas e escaláveis.