Retour à la Knowledge Base
Référence

database-choice-criteria

Mars 2026·Version : 1.0 — Mars 2026·Tout projet Gentle Designs nécessitant une base de données

Version : 1.0 — Mars 2026 Scope : Tout projet Gentle Designs nécessitant une base de données Objectif : Choisir le bon moteur de BDD selon le profil de requêtes, le volume de données, et le contexte de déploiement


Trois profils, trois moteurs

Profil de requêtes Moteur Exemples
Single-user, CRUD simple, peu de données (<100K lignes) SQLite App de notes, config locale, site vitrine avec données
Single-user, analytique lourd, millions de lignes, requêtes ad hoc PostgreSQL embarqué ou DuckDB EVQuest (destination), H2N, PokerTracker, HM3, outils data desktop
Multi-user, web, concurrence d'écriture PostgreSQL hébergé (Supabase, Neon, Railway) SaaS, apps client Gentle Designs, dashboards

Critères détaillés

Volume de données

  • <100K lignes avec requêtes simples → SQLite suffit largement
  • Millions de lignes avec agrégations complexes → PostgreSQL. Son optimiseur de requêtes parallélise, choisit entre différents types de scans, utilise des index partiels ou composites de manière bien plus intelligente que SQLite.

Nature des requêtes

  • CRUD prévisible (le développeur écrit toutes les requêtes) → SQLite acceptable
  • Requêtes ad hoc construites par l'utilisateur (filtres, agrégations custom) → PostgreSQL. On ne peut pas anticiper chaque combinaison, et le planificateur de PostgreSQL encaisse ces requêtes imprévisibles bien mieux.
  • Analytique pure (colonnes, agrégations massives, peu d'écritures) → DuckDB — moteur analytique embarqué comme SQLite (fichier unique, zéro serveur) mais optimisé pour les agrégations sur des millions de lignes.

Contexte de déploiement

  • App desktop distribuée via installeur → SQLite ou PostgreSQL embarqué (qui démarre/s'arrête avec l'app, invisible pour l'utilisateur — pattern H2N/Pokstats)
  • App web → PostgreSQL hébergé (Supabase, Neon)
  • Prototype/POC → SQLite pour la vitesse de setup, puis migrer

Concurrence

  • Un seul utilisateur → SQLite ou PostgreSQL embarqué
  • Plusieurs utilisateurs simultanés en écriture → PostgreSQL hébergé obligatoire (SQLite = un seul writer à la fois)

Pattern recommandé : couche d'abstraction dès le départ

Utiliser un ORM ou une couche d'abstraction (SQLAlchemy en Python, Prisma/Drizzle en TypeScript) dès le premier jour. La migration de moteur se réduit alors à changer la chaîne de connexion + ajouter des index spécialisés. 95% du code reste identique.

# SQLAlchemy — changer de moteur = changer une ligne
# SQLite
engine = create_engine("sqlite:///app.db")
# PostgreSQL embarqué
engine = create_engine("postgresql://localhost:5432/app")

Leçon EVQuest

SQLite était le bon choix pour le MVP — avancer vite, zéro dépendance. Mais la destination finale est PostgreSQL embarqué pour deux raisons :

  1. Volume de plusieurs millions de mains avec agrégations croisées (position × stack × type de tournoi × période)
  2. Stats custom créées par l'utilisateur (requêtes ad hoc non anticipables)

Tous les concurrents sérieux (Hand2Note, PokerTracker 4, HM3) utilisent PostgreSQL — ce n'est pas un hasard.

Rappel vibe coding

Dans un workflow où Claude Code produit 99,9% du code, la complexité d'implémentation d'une migration de BDD n'est plus un facteur de décision. Seule la justesse de l'architecture compte. Si PostgreSQL est la bonne cible, y aller directement — ne pas "commencer petit" par paresse technique quand le vrai coût est nul.

Dernière mise à jour : mars 2026