schema-design
npx machina-cli add skill 686f6c61/alfred-dev/schema-design --openclawDiseño de esquemas de base de datos
Resumen
Este skill guía el proceso de diseñar un esquema de base de datos relacional a partir de requisitos funcionales. El diseño no es solo crear tablas que almacenen datos, sino modelar el dominio del negocio de forma que garantice integridad, rendimiento y evolución sostenible.
El esquema resultante debe estar normalizado hasta la tercera forma normal (3NF) como mínimo, con índices justificados, constraints que protejan la integridad y documentación que permita a cualquier miembro del equipo entender cada tabla y columna sin necesidad de leer el código de la aplicación.
Proceso
-
Analizar los requisitos y extraer entidades. A partir de los requisitos funcionales, identificar las entidades del dominio. Cada sustantivo relevante es un candidato a entidad: usuario, pedido, producto, factura. Documentar qué atributos tiene cada entidad y cuáles son obligatorios.
-
Definir las relaciones entre entidades. Para cada par de entidades relacionadas, determinar la cardinalidad:
- Uno a uno (1:1): poco frecuente, evaluar si realmente son dos entidades o una sola.
- Uno a muchos (1:N): la más habitual. La clave foránea va en el lado "muchos".
- Muchos a muchos (N:M): requiere tabla intermedia con claves foráneas compuestas.
Documentar la dirección de la relación y si es obligatoria u opcional en cada extremo.
-
Normalizar hasta 3NF. Aplicar las formas normales secuencialmente:
- 1NF: cada columna contiene valores atómicos, sin listas ni objetos anidados.
- 2NF: todos los atributos no clave dependen de la clave primaria completa, no de una parte.
- 3NF: ningún atributo no clave depende de otro atributo no clave (eliminar dependencias transitivas).
Si hay motivos de rendimiento para desnormalizar, documentar la justificación explícitamente.
-
Aplicar convenciones de naming. Mantener coherencia en todo el esquema:
- Tablas en plural y snake_case:
users,order_items,payment_methods. - Columnas en singular y snake_case:
email,created_at,total_amount. - Claves primarias:
ido<tabla_singular>_id. - Claves foráneas:
<tabla_referenciada_singular>_id. - Índices:
idx_<tabla>_<columnas>. - Timestamps de auditoría:
created_atyupdated_aten todas las tablas.
- Tablas en plural y snake_case:
-
Definir constraints e integridad referencial. Para cada tabla:
- PRIMARY KEY en todas las tablas, sin excepción.
- FOREIGN KEY con la acción ON DELETE adecuada (CASCADE, SET NULL, RESTRICT).
- NOT NULL en columnas obligatorias.
- UNIQUE donde corresponda (email, slug, códigos).
- CHECK para validaciones a nivel de base de datos (rangos, enumerados, formatos).
-
Diseñar los índices. Los índices se crean para consultas concretas, no de forma preventiva:
- Índice en todas las claves foráneas (muchos motores no lo hacen automáticamente).
- Índice en columnas usadas frecuentemente en WHERE, ORDER BY y JOIN.
- Índices compuestos cuando las consultas filtran por varias columnas (respetar el orden).
- Evaluar índices parciales o funcionales si el motor lo permite.
-
Adaptar al ORM del proyecto. Traducir el diseño a la sintaxis del ORM utilizado (Prisma, Drizzle, SQLAlchemy, Django ORM, TypeORM). Asegurarse de que las relaciones, índices y constraints se expresan correctamente en el modelo del ORM, ya que no todos soportan las mismas funcionalidades.
-
Documentar el esquema. Cada tabla debe tener un comentario que explique su propósito. Las columnas no obvias deben documentar qué representan, sus valores posibles y sus restricciones. Si el motor lo permite, usar comentarios nativos (COMMENT ON); si no, documentar en un fichero adjunto o en el propio código del ORM.
Que NO hacer
- No crear campos JSON "para todo". Los campos JSON son útiles para datos semiestructurados, pero no sustituyen a columnas y relaciones bien diseñadas.
- No usar soft delete (columna
deleted_at) sin evaluar las consecuencias en queries, índices y unicidad. - No omitir las migraciones. Todo cambio en el esquema debe pasar por el sistema de migraciones del proyecto.
- No crear índices en todas las columnas "por si acaso". Cada índice ocupa espacio y ralentiza las escrituras.
- No ignorar los tipos de datos. Usar el tipo más específico posible:
TIMESTAMPpara fechas,DECIMALpara dinero,UUIDpara identificadores distribuidos.
Source
git clone https://github.com/686f6c61/alfred-dev/blob/main/skills/datos/schema-design/SKILL.mdView on GitHub Overview
Este skill guía el diseño de esquemas de base de datos relacional a partir de requisitos funcionales. Busca normalizar hasta 3NF, justificar índices, aplicar constraints y dejar documentación suficiente para que el equipo entienda tablas y columnas sin leer el código.
How This Skill Works
Comienza analizando requisitos para extraer entidades y atributos, luego define relaciones (1:1, 1:N, N:M) y normaliza a 3NF. Aplica convenciones de naming, define constraints y diseña índices enfocados en consultas; finalmente adapta el modelo al ORM usado y documenta cada tabla.
When to Use It
- Cuando comienzas un dominio nuevo y necesitas entidades y relaciones claras.
- Cuando la prioridad es garantizar integridad de datos y consistencia entre tablas.
- Cuando buscas rendimiento: índices para WHERE, JOIN y ORDER BY en consultas frecuentes.
- Cuando trabajas en equipo y necesitas documentación clara del esquema para lectura y mantenimiento.
- Cuando vas a mapear el diseño al ORM del proyecto (Prisma, Drizzle, SQLAlchemy, Django ORM, TypeORM).
Quick Start
- Step 1: Analiza requisitos para extraer entidades y atributos y documenta su significado.
- Step 2: Define relaciones (1:1, 1:N, N:M), normaliza hasta 3NF y aplica naming conventions.
- Step 3: Implementa PRIMARY KEY, FOREIGN KEY con ON DELETE, índices relevantes y comentarios en cada tabla; adapta al ORM usado.
Best Practices
- Mantener tablas en plural y snake_case; columnas en singular y snake_case.
- Definir PRIMARY KEY en todas las tablas y FOREIGN KEY con ON DELETE adecuado (CASCADE, SET NULL, RESTRICT).
- Crear índices para claves foráneas y columnas usadas en WHERE, JOIN y ORDER BY; usar índices compuestos cuando filtren por varias columnas.
- Documentar el esquema con comentarios en cada tabla y, si es posible, en comentarios nativos o archivos adjuntos.
- Adaptar el diseño al ORM del proyecto y registrar limitaciones de soporte para relaciones, índices y constraints.
Example Use Cases
- E-commerce: tablas users, orders, order_items, products y payments con relaciones 1:N y N:M (productos en pedidos).
- Sistema de facturación: clientes, facturas, line_items, productos y métodos_de_pago con constraints y auditoría.
- SaaS: usuarios, subscriptions, plans e invoices diseñados para escalabilidad y trazabilidad.
- Blog: usuarios, posts, comments y tags con relaciones adecuadas y índices en búsquedas por usuario o fecha.
- Inventario: productos, warehouses, stock y proveedores con integridad referencial y búsquedas rápidas por producto y ubicación.