Un error notable es que muchos esquemas de base de datos generados por IA actualmente favorecen el uso de VARCHAR(36) para la columna id.
Un error notable es que muchos esquemas de base de datos generados por IA actualmente favorecen el uso de VARCHAR(36) para la columna id.
Esto está típicamente motivado por el deseo de prevenir acceso no autorizado por actores maliciosos. Para lograr esto, los UUID (Identificadores Universalmente Únicos) se emplean a menudo como medida de seguridad.
Tomemos WordPress como ejemplo — típicamente expone IDs de posts en la URL como ?p=45. Comparado con un formato amigable para SEO como /2025/05/sample-post, este ID numérico permite a los usuarios potencialmente adivinar y acceder a contenido adyacente alterando el número (ej., ?p=44). Los UUID, por otro lado, no son secuenciales y son mucho más difíciles de adivinar.
Los UUID son cadenas de 36 caracteres que siguen un formato estándar con cinco secciones separadas por guiones: 8-4-4-4-12. Cada sección está compuesta de valores hexadecimales:
550e8400-e29b-41d4-a716-446655440000
f47ac10b-58cc-4372-a567-0e02b2c3d479
123e4567-e89b-12d3-a456-426614174000
Una expresión regular simple para validar UUID se ve así:
^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$
Aunque los UUID ofrecen seguridad y portabilidad, vienen con compromisos. Son significativamente más grandes que los enteros, lo que puede ralentizar el rendimiento de la base de datos — especialmente cuando se usan como claves primarias en bases de datos relacionales. La indexación, uso de memoria y velocidad de consultas sufren debido al tamaño y naturaleza no secuencial de los UUID.
Curioso sobre esta decisión de diseño, le pregunté a GitHub Copilot lo siguiente:
Yo:
¿Por qué has elegido definir la columna id como VARCHAR(36) PRIMARY KEY en la estructura de base de datos?
GitHub Copilot:
Elegí
VARCHAR(36)para las columnas ID por algunas razones específicas:
- Almacenamiento UUID: La longitud de 36 caracteres encaja con valores UUID, que siguen un formato estandarizado.
- Sistemas Multi-Inquilino: Los UUID ayudan a aislar inquilinos eliminando filtración de ID secuencial, simplificando migraciones y mejorando seguridad.
- Portabilidad de Datos: Los UUID aseguran que los datos exportados no sufran de colisiones de ID durante la importación a otro sistema.
Compromisos:
- Mayor tamaño de almacenamiento (36 bytes vs. 4 bytes para
INT)- Rendimiento de indexación y consulta más lento
- Mayor uso de memoria
Alternativas a considerar:
AUTO_INCREMENT INT/BIGINTBINARY(16)para almacenar bytes UUID raw más eficientemente- Una estrategia de generación de ID personalizada
Házmelo saber si prefieres un enfoque diferente.
Yo:
Usa BIGINT UNSIGNED para rendimiento, pero mantén un campo guid en cada registro para referencias externas.
GitHub Copilot:
Actualizaré el esquema para usar
BIGINT UNSIGNEDcomo clave primaria mientras agrego una columnaguidpara referencias externas. Este enfoque híbrido combina lo mejor de ambas estrategias:
- Rendimiento: Indexación y joins eficientes vía claves primarias numéricas
- Seguridad y Portabilidad: GUIDs expuestos en APIs, haciendo IDs internos seguros contra enumeración
Resumen:
BIGINT UNSIGNED: Rápido, compacto, secuencialGUID (VARCHAR): Único, portable, externamente seguro
Mientras las bases de datos relacionales ofrecen flexibilidad para elegir entre UUID, enteros o híbridos, los sistemas NoSQL como MongoDB toman un camino diferente.
MongoDB usa un tipo incorporado llamado ObjectId para su campo _id. Este es un valor binario de 12 bytes que codifica:
Ejemplo:
507f1f77bcf86cd799439011
VARCHAR(36). También son más amigables para indexación.| Característica | UUID (VARCHAR) | BIGINT + GUID Híbrido | MongoDB ObjectId |
|---|---|---|---|
| Tamaño de almacenamiento | 36 bytes | 8 + 36 bytes | 12 bytes |
| Rendimiento de indexación | Pobre | Excelente | Excelente |
| Orden secuencial / temporal | No | Sí (solo BIGINT) | Sí (vía timestamp) |
| Formato legible | Sí | Sí (GUID) | No (basado en hex) |
| Adivinable | No | No (solo GUID) | No |
| Aplicación de esquema | Estricta | Estricta | Flexible |
Muchos sistemas generados por IA usan por defecto configuraciones NoSQL similares a MongoDB cuando:
En estos casos, usar ObjectIds o identificadores únicos similares, ordenables por tiempo, es a menudo un defecto sensible.