Base de Datos Relacional (Neutral al Motor)
Resumen
Prácticas recomendadas neutrales al motor para bases de datos relacionales. Los principios y patrones se escriben una vez; solo los puntos donde los dialectos SQL divergen (MSSQL vs MySQL/MariaDB) se marcan en línea o se recogen en la hoja de trucos de dialectos. Optimizar por corrección y el cambio más pequeño respaldado por evidencia medida.
Cuándo usar
- Diseñar o revisar un esquema (tablas, claves, normalización, tipos de datos).
- Agregar o corregir índices; diagnosticar consultas lentas o escaneos completos de tablas.
- Leer un plan de ejecución para encontrar el cuello de botella.
- Elegir o solucionar problemas de aislamiento de transacciones, bloqueo o interbloqueos.
- Paginar grandes conjuntos de resultados; eliminar el acceso N+1.
- Planificar una migración de esquema segura para producción.
No para: análisis profundos internos del motor (internos del motor de almacenamiento como el grupo de búfer de InnoDB, características exclusivas del proveedor, construcciones solo T-SQL, topología de replicación/fragmentación). Utilice la documentación del propio motor o un skill dedicado a un solo motor.
Flujo de trabajo
- Establecer el contexto primero. ¿Qué motor + versión principal? Mezcla de lectura/escritura, volumen de filas, objetivo de latencia, OLTP vs analítica. Los consejos cambian con estos.
- Leer solo la referencia relevante enlazada en cada sección a continuación.
- Proponer el cambio más pequeño que resuelva el problema, con compensaciones.
- Validar con evidencia — capturar un plan de ejecución y métricas de filas/tiempo
antes y después (ver
references/execution-plans.md), no reglas generales. - Para producción, incluir un plan de reversión y verificación posterior al despliegue.
Diseño de Esquemas
- Modelar relaciones explícitamente; comenzar normalizado (3NF/BCNF) y desnormalizar solo con una razón medida. Cada tabla necesita una clave primaria estable.
- Elegir el tipo de dato más estrecho correcto; restringir estados no válidos a nivel de esquema (NOT NULL, UNIQUE, CHECK, FK) en lugar de solo en código de aplicación.
Referencias: normalización · claves-y-restricciones · tipos-de-datos
Indexación
- Indexar columnas utilizadas en
WHERE,JOINyORDER BY— por selectividad, no por suposición. Orden de índice compuesto: columnas de igualdad primero, luego rango/orden (regla de prefijo más a la izquierda). Un predicado de rango detiene el uso del índice para columnas posteriores. - Los índices de cobertura evitan búsquedas en tabla. Auditar y eliminar índices no utilizados/duplicados; cada índice afecta las escrituras.
Referencias: indexación · índices-compuestos
Optimización de Consultas
- Mantener los predicados SARGables — sin funciones/casteos implícitos en columnas indexadas en
WHERE. Seleccionar solo las columnas necesarias. PreferirEXISTSsobreIN (subquery),UNION ALLsobreUNIONcuando la deduplicación no es necesaria, y agrupar escrituras grandes. - Usar paginación por conjunto de claves (cursor) en lugar de
OFFSETgrande. Eliminar N+1 mediante agrupación o JOIN.
Referencias: optimización-de-consultas · planes-de-ejecución · paginación
Transacciones y Bloqueo
- Mantener las transacciones cortas; realizar E/S y trabajo lento fuera de ellas. Acceder a las filas en un orden consistente para evitar interbloqueos; esperar interbloqueos y reintentar con retroceso.
- Conocer el nivel de aislamiento predeterminado de su motor (es diferente) y las anomalías
que cada nivel permite. Usar lecturas con bloqueo (
FOR UPDATE) deliberadamente, no por hábito.
Referencias: transacciones-y-aislamiento · bloqueo-e-interbloqueos
Migraciones y DDL
- Hacer cambios de esquema primero aditivos y compatibles hacia atrás; expandir → rellenar → contraer. El DDL grande/con bloqueo necesita una estrategia en línea y una ruta de reversión.
Referencia: migraciones-y-ddl
Diferencias de Dialectos del Motor
Auto-incremento, uso de comillas para identificadores, paginación, upsert, funciones de cadena, hora actual, EXPLAIN y valores predeterminados de aislamiento divergen entre motores. Confirmar la sintaxis para el motor objetivo antes de escribir SQL portable.
Referencia: hoja-de-trucos-de-dialectos-del-motor
Barreras de Protección
- Preferir evidencia medida (planes de ejecución, métricas) sobre reglas generales.
- Indicar el motor y la versión principal cuando el comportamiento dependa de él.
- Obtener aprobación humana explícita antes de operaciones destructivas (DROP/DELETE/TRUNCATE o cualquier migración no reversible). Siempre confirmar que existe una copia de seguridad primero.