Explorer
KNOW-ANT-012

Anti-Pattern : Schéma tracker avec text NOT NULL, pas de FK, charset latin1

Domaine
cybersecu
Type
anti-pattern
Priorité
P2

Parent : [[INDEX-CYBERSECU]]

Anti-Pattern : Schéma tracker avec text NOT NULL, pas de FK, charset latin1

Description

Utiliser text NOT NULL pour des champs optionnels (profile_desc, ban_reason), varchar(255) pour un pays, varchar(11) pour un âge, int(11) comme PK avec 13.7M+ utilisateurs (risque d'overflow), latin1 comme charset (pas UTF-8), et aucune foreign key. Cela crée des données incohérentes, des limitations de croissance, et des problèmes d'internationalisation.

Exemple réel - Archive Ygg

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,  -- ❌ 13.7M users, overflow imminent
  `age` varchar(11) NOT NULL,             -- ❌ varchar(11) pour un âge
  `country` varchar(255) NOT NULL,        -- ❌ trop large
  `profile_desc` text NOT NULL,           -- ❌ devrait être NULL
  `ban_reason` text NOT NULL,             -- ❌ devrait être NULL
  `settings` text DEFAULT NULL,           -- ✅ correct mais pas JSON type
  PRIMARY KEY (`id`),
  -- ❌ Aucune FOREIGN KEY
) ENGINE=InnoDB AUTO_INCREMENT=13720815 
  DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci;  -- ❌ latin1

Conséquences

  • Overflow d'ID : int(11) max = 2.1M, déjà à 13.7M (comment?? - probablement unsigned int mais toujours limité)
  • Données incohérentes : Pas de FK = orphans, références cassées
  • Problèmes d'encodage : latin1 = pas de support international
  • Espace gaspillé : text NOT NULL = stockage obligatoire
  • Mauvaise validation : pas de type DATE pour birth_date

Quand c'est acceptable

JAMAIS pour un nouveau projet. Legacy code uniquement avec migration planifiée.

Solution

Utiliser KNOW-PAT-064 — Schéma de base de données tracker hardening :

  • bigint UNSIGNED pour l'ID
  • utf8mb4 pour le charset
  • JSON natif pour les structures
  • Foreign keys
  • Types appropriés (DATE, char(2), etc.)

Références

  • Archive Ygg : 03_DATABASES/ygg_tracker_redacted/users_schema.sql
  • OWASP : Database Security