veza/docs/UUID_DB_CARTOGRAPHY.md

5.4 KiB

🗺️ UUID_DB_CARTOGRAPHY.md

Date: 04/12/2025 Statut: 🔴 ALERTE CRITIQUE (Schisme de Données) Contexte: Analyse post-mortem de la migration INT vers UUID et du conflit de propriété des données entre Backend (Go) et Chat (Rust).


1. État des Lieux : La Guerre des Schémas

Il existe trois sources de vérité concurrentes pour la définition de la base de données, créant un état incohérent.

Entité Source de Vérité Type ID Utilisateur Méthode de Génération Colonnes Clés
Backend API (Go) veza-backend-api/migrations/ UUID (Migré) uuid_generate_v5 (Déterministe depuis INT) username, email, password_hash
Chat Server (Rust) veza-chat-server/migrations/ UUID (Natif) gen_random_uuid() (v4 Aléatoire) display_name, last_seen, avatar_url
Root Scripts migrations/ UUID (Mixte) uuid_generate_v4 (v4 Aléatoire) N/A (Tables secondaires)

🚨 Le Conflit "Users"

La table users est définie différemment par les deux services majeurs.

  • Backend (Go) migre les anciens IDs : 123 -> UUID-v5-du-123.
  • Chat (Rust) crée de nouveaux users : UUID-v4-Random.

Conséquence : Si le Backend et le Chat partagent la même DB (ce qui est le cas en prod), le Chat Server va échouer car il attend des colonnes (display_name) qui n'existent pas dans la version Backend (first_name/last_name), ou vice-versa.


2. Cartographie des Tables & IDs

Tables Principales (Gérées par veza-backend-api)

Ces tables ont subi la migration 047 (Destructive).

Table Type ID PK Type FK User État Migration Observation
users UUID N/A Terminée PK renommée de id_uuid à id.
tracks SERIAL UUID Terminée FK user_id est UUID. PK reste SERIAL ? (À vérifier)
playlists SERIAL UUID Terminée FK user_id est UUID.
messages (Legacy) SERIAL UUID Terminée Table messages du backend (pas celle du Chat Server).

Tables "Chat" (Gérées par veza-chat-server)

Ces tables sont définies dans 001_create_clean_database.sql (Rust).

Table Type ID PK Type FK User État Conflit ?
conversations UUID UUID Natif OK
messages (New) UUID UUID Natif ⚠️ Conflit de nom avec messages du Backend
conversation_members Composite UUID Natif OK

Tables Secondaires (Gérées par migrations/ root)

Tables touchées par 001_migrate_ids_to_uuid_up.sql.

Table Type ID PK État Observation
contests UUID (new_id) ⚠️ Partiel Colonne new_id ajoutée mais PK pas encore switchée ?
equipment UUID (new_id) ⚠️ Partiel Idem.
user_profiles UUID (new_id) ⚠️ Partiel Doublon potentiel avec users ?

3. Analyse des Migrations Exécutées

Migration Critique : veza-backend-api/.../047_migrate_users_id_to_uuid.sql

C'est la migration de référence. Elle est destructrice (DROP COLUMN id).

  • Points Forts : Utilise uuid_generate_v5(namespace, old_id). Cela garantit que l'ID 42 devient toujours le même UUID. C'est excellent pour la consistance.
  • Points Faibles : Elle suppose qu'elle est la seule à toucher à la DB.

Migration "Root" : migrations/001_migrate_ids_to_uuid_up.sql

Semble être une tentative de rattrapage pour les tables oubliées par la migration 047.

  • Problème : Elle ajoute new_id mais ne semble pas (dans l'extrait lu) faire le DROP et RENAME final. Elle laisse la DB dans un état intermédiaire (id INT + new_id UUID).

Scripts Shell de "Fix"

  • scripts/fix-remaining-uuid-errors.sh : Un script "Find & Replace" brutal (sed) sur le code Go.
    • Preuve que le code Go n'a pas été refactoré proprement mais "patché" pour accepter les UUIDs (remplacement de 0 par uuid.Nil).

4. Source of Truth (Proposition de Résolution)

Pour résoudre le schisme, nous devons établir une hiérarchie stricte.

👑 Maître du Schéma Global : veza-backend-api

Le Backend Go contient l'historique et la complexité métier (Auth, Roles, Profils). Il DOIT posséder la table users.

🚫 Interdit au Chat Server

Le veza-chat-server NE DOIT PAS :

  1. Créer la table users.
  2. Gérer ses propres migrations pour users.
  3. Avoir une table messages qui porte le même nom que celle du Backend (si elles sont dans le même schema).

Actions Requises (pour la phase de correction)

  1. Aligner le schéma User : Le Chat Server (Rust) doit adapter son modèle struct User pour correspondre aux colonnes réelles du Backend (first_name vs display_name).
  2. Renommage Tables : La table messages du Chat Server doit être renommée chat_messages pour éviter la collision avec les messages legacy du Backend.
  3. Nettoyage Root : Finir ou reverter la migration migrations/001_migrate_ids_to_uuid_up.sql (état new_id hybride dangereux).

5. Conclusion

Le chaos des IDs est en réalité un Chaos de Gouvernance. Deux équipes (ou deux esprits) ont travaillé en parallèle : l'une migrant l'existant (Go), l'autre construisant le futur (Rust), sans se synchroniser sur la couche de données partagée.