Une erreur notable est que de nombreux schémas de base de données générés par IA favorisent actuellement l'utilisation de VARCHAR(36) pour la colonne id.
Une erreur notable est que de nombreux schémas de base de données générés par IA favorisent actuellement l'utilisation de VARCHAR(36) pour la colonne id.
Ceci est généralement motivé par un désir de prévenir l'accès non autorisé par des acteurs malveillants. Pour y parvenir, les UUID (Identifiants Universellement Uniques) sont souvent employés comme mesure de sécurité.
Prenons WordPress comme exemple — il expose généralement les ID de posts dans l'URL comme ?p=45. Comparé à un format SEO-friendly tel que /2025/05/sample-post, cet ID numérique permet aux utilisateurs de potentiellement deviner et accéder au contenu adjacent en modifiant le nombre (par exemple, ?p=44). Les UUID, d'autre part, ne sont pas séquentiels et sont beaucoup plus difficiles à deviner.
Les UUID sont des chaînes de 36 caractères qui suivent un format standard avec cinq sections séparées par des tirets: 8-4-4-4-12. Chaque section est composée de valeurs hexadécimales:
550e8400-e29b-41d4-a716-446655440000
f47ac10b-58cc-4372-a567-0e02b2c3d479
123e4567-e89b-12d3-a456-426614174000
Une expression régulière simple pour valider les UUID ressemble à ceci:
^[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}$
Bien que les UUID offrent sécurité et portabilité, ils viennent avec des compromis. Ils sont significativement plus grands que les entiers, ce qui peut ralentir les performances de la base de données — surtout quand utilisés comme clés primaires dans les bases de données relationnelles. L'indexation, l'utilisation de la mémoire et la vitesse des requêtes souffrent toutes à cause de la taille et de la nature non-séquentielle des UUID.
Curieux de ce choix de conception, j'ai posé la question suivante à GitHub Copilot:
Moi:
Pourquoi avez-vous choisi de définir la colonne id comme VARCHAR(36) PRIMARY KEY dans la structure de base de données?
GitHub Copilot:
J'ai choisi
VARCHAR(36)pour les colonnes ID pour quelques raisons spécifiques:
- Stockage UUID: La longueur de 36 caractères correspond aux valeurs UUID, qui suivent un format standardisé.
- Systèmes multi-locataires: Les UUID aident à isoler les locataires en éliminant les fuites d'ID séquentiels, simplifiant les migrations et améliorant la sécurité.
- Portabilité des données: Les UUID garantissent que les données exportées ne souffrent pas de collisions d'ID lors de l'importation dans un autre système.
Compromis:
- Taille de stockage plus grande (36 octets vs 4 octets pour
INT)- Performance d'indexation et de requête plus lente
- Utilisation mémoire accrue
Alternatives à considérer:
AUTO_INCREMENT INT/BIGINTBINARY(16)pour stocker les octets UUID bruts plus efficacement- Une stratégie de génération d'ID personnalisée
Faites-moi savoir si vous préférez une approche différente.
Moi:
Utilisez BIGINT UNSIGNED pour les performances, mais gardez un champ guid dans chaque enregistrement pour les références externes.
GitHub Copilot:
Je vais mettre à jour le schéma pour utiliser
BIGINT UNSIGNEDcomme clé primaire tout en ajoutant une colonneguidpour les références externes. Cette approche hybride combine le meilleur des deux stratégies:
- Performance: Indexation et jointures efficaces via des clés primaires numériques
- Sécurité et Portabilité: GUID exposés dans les API, rendant les ID internes sûrs contre l'énumération
Résumé:
BIGINT UNSIGNED: Rapide, compact, séquentielGUID (VARCHAR): Unique, portable, externellement sûr
Tandis que les bases de données relationnelles offrent la flexibilité de choisir entre UUID, entiers ou hybrides, les systèmes NoSQL comme MongoDB prennent un chemin différent.
MongoDB utilise un type intégré appelé ObjectId pour son champ _id. C'est une valeur binaire de 12 octets qui encode:
Exemple:
507f1f77bcf86cd799439011
VARCHAR(36). Ils sont aussi plus favorables à l'indexation.| Fonctionnalité | UUID (VARCHAR) | BIGINT + GUID Hybride | MongoDB ObjectId |
|---|---|---|---|
| Taille de stockage | 36 octets | 8 + 36 octets | 12 octets |
| Performance d'indexation | Pauvre | Excellente | Excellente |
| Ordre séquentiel / temporel | Non | Oui (BIGINT seulement) | Oui (via horodatage) |
| Format lisible | Oui | Oui (GUID) | Non (basé hex) |
| Devinable | Non | Non (GUID seulement) | Non |
| Application de schéma | Stricte | Stricte | Flexible |
Beaucoup de systèmes générés par IA utilisent par défaut des configurations NoSQL similaires à MongoDB quand:
Dans ces cas, utiliser des ObjectId ou des identifiants uniques similaires, triables dans le temps, est souvent un défaut sensé.