- All SKILL.md files now <500 lines (avg reduction 69%) - Detailed content extracted to references/ subdirectories - Frontmatter standardised: only name + description (Anthropic standard) - New skills: brand-guidelines, spec-coauthor, report-templates, skill-creator - Design skills: anti-slop guidelines, premium-proposals reference - Removed non-standard frontmatter fields (triggers, version, author, category) Plugins affected: infraestrutura, marketing, dev-tools, crm-ops, gestao, core-tools, negocio, perfex-dev, wordpress, design-media Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
6.1 KiB
6.1 KiB
name, description
| name | description |
|---|---|
| db-design | Design e optimização de schemas de base de dados — normalização, índices, planos de migração e particionamento. |
Database Design Specialist
Skill para design e optimização de bases de dados seguindo padrões Descomplicar®.
Quando Usar
- Desenhar schema para novo sistema
- Optimizar queries lentas
- Criar migrations (Laravel, Doctrine, Raw SQL)
- Auditar e optimizar índices
- Planear partitioning/sharding
Protocolo Obrigatório
1. Pesquisa Inicial
mcp__memory-supabase__search_memories "database [projecto]"
mcp__wikijs__search_pages "database schema [sistema]"
2. Verificar Schema Existente
Antes de propor alterações, SEMPRE verificar estrutura actual.
Princípios de Design
Normalização
- OLTP: Mínimo 3NF (Third Normal Form)
- OLAP/Reporting: Desnormalização justificada
- Híbrido: Tabelas normalizadas + views materializadas
Naming Conventions
-- Tabelas: snake_case, plural
users, order_items, product_categories
-- Colunas: snake_case, singular
created_at, user_id, is_active
-- Primary keys
id (auto-increment ou UUID)
-- Foreign keys: {tabela_singular}_id
user_id, order_id, category_id
-- Índices: idx_{tabela}_{coluna(s)}
idx_orders_customer_id
idx_orders_created_at_status
Performance
Índices Estratégicos
-- WHERE frequente
CREATE INDEX idx_users_email ON users(email);
-- JOIN
CREATE INDEX idx_orders_customer_id ON orders(customer_id);
-- ORDER BY
CREATE INDEX idx_products_created_at ON products(created_at DESC);
-- Composto para queries específicas
CREATE INDEX idx_orders_status_date ON orders(status, created_at);
Análise de Queries
-- SEMPRE usar EXPLAIN antes de optimizar
EXPLAIN ANALYZE
SELECT c.name, COUNT(o.id) as total
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.created_at >= '2025-01-01'
GROUP BY c.id
ORDER BY total DESC
LIMIT 100;
Evitar Anti-patterns
-- ❌ EVITAR
SELECT * FROM orders; -- Usar colunas específicas
SELECT ... WHERE YEAR(created_at) = 2025; -- Função impede uso de índice
-- ✅ PREFERIR
SELECT id, customer_id, total FROM orders;
SELECT ... WHERE created_at >= '2025-01-01' AND created_at < '2026-01-01';
Template Migration Laravel
<?php
/**
* Migration: Create subscriptions table
*
* @author Descomplicar® Crescimento Digital
* @link https://descomplicar.pt
* @copyright 2025 Descomplicar®
*/
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('subscriptions', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
$table->foreignId('plan_id')->constrained();
$table->enum('status', ['active', 'cancelled', 'expired', 'trial']);
$table->timestamp('trial_ends_at')->nullable();
$table->timestamp('current_period_start');
$table->timestamp('current_period_end');
$table->timestamp('cancelled_at')->nullable();
$table->timestamps();
// Índices
$table->index(['user_id', 'status']);
$table->index('current_period_end');
});
}
public function down(): void
{
Schema::dropIfExists('subscriptions');
}
};
Segurança
- Prepared statements: SEMPRE para queries com input
- Least privilege: Utilizadores DB com permissões mínimas
- Audit logging: Para tabelas com dados sensíveis
- Encriptação: Colunas com PII devem ser encriptadas
Checklist Schema
Design
- Normalização adequada (sem redundância desnecessária)
- Foreign keys definidas
- Tipos de dados apropriados
- Constraints (NOT NULL, UNIQUE, CHECK)
- Soft deletes onde apropriado (deleted_at)
Performance
- Índices em colunas de WHERE
- Índices em colunas de JOIN
- Índices compostos onde necessário
- Evitados índices redundantes
- EXPLAIN em queries críticas
Segurança
- Dados sensíveis identificados
- Audit trail se necessário
- Prepared statements em todo código
Entregáveis Standard
- DDL completo (CREATE TABLE, INDEX)
- Diagrama ER se schema complexo
- Migrations se framework especificado
- Queries exemplo para operações comuns
- EXPLAIN de queries críticas
Datasets Dify (Consulta Obrigatória)
Em caso de dúvidas ou para aprofundar conhecimento, consultar os seguintes datasets via MCP:
| Dataset | ID | Prioridade |
|---|---|---|
| TI (Tecnologia da Informação) | 7f63ec0c-6321-488c-b107-980140199850 |
1 |
| Desenvolvimento de Software | e7c7decc-0ded-4351-ab14-b110b3c38ec9 |
1 |
| AWS (Amazon Web Services) | cc7f000a-ad86-49b6-b59b-179e65f8a229 |
2 |
Como Consultar
// Pesquisar optimização MySQL
mcp__notebooklm__notebook_query, mcp__dify-kb__dify_kb_retrieve_segments({
dataset_id: "7f63ec0c-6321-488c-b107-980140199850",
query: "mysql index optimization slow query"
})
// Padrões de design de bases de dados
mcp__dify-kb__dify_kb_retrieve_segments({
dataset_id: "e7c7decc-0ded-4351-ab14-b110b3c38ec9",
query: "database schema design patterns"
})
// RDS e bases de dados AWS
mcp__dify-kb__dify_kb_retrieve_segments({
dataset_id: "cc7f000a-ad86-49b6-b59b-179e65f8a229",
query: "RDS aurora postgresql"
})
Quando Consultar
- Antes de desenhar novo schema
- Ao optimizar queries lentas
- Para escolher tipo de índice adequado
- Decidir entre MySQL/PostgreSQL
- Configurar bases de dados em cloud
Versão: 1.0.0 | Autor: Descomplicar®
Quando NÃO Usar
- Para tarefas fora do domínio de especialização desta skill
- Quando outra skill mais específica está disponível
- Para operações que requerem confirmação manual do utilizador
Exemplos
Exemplo 1: Uso Básico
Input: [descrição da tarefa]
Output: [resultado esperado]
Exemplo 2: Uso Avançado
Input: [caso complexo]
Output: [resultado detalhado]