Aller au contenu
medium

Bases de données relationnelles : SQLite, PostgreSQL et MySQL

16 min de lecture

Une base de données relationnelle organise les données en tables reliées entre elles par des clés, et on les interroge avec SQL. C'est le modèle dominant depuis 50 ans pour les applications qui ont besoin de cohérence, d'intégrité et de requêtes structurées. Trois moteurs couvrent l'essentiel des besoins : SQLite (base embarquée dans un fichier), PostgreSQL (moteur objet-relationnel extensible) et MySQL (serveur SQL très répandu sur le web). Ce guide pose les bases du modèle relationnel, puis compare concrètement ces trois moteurs pour vous aider à choisir.

  • Comprendre le modèle relationnel : tables, colonnes, clés primaires et étrangères
  • Écrire des requêtes SQL de base : créer une table, insérer, interroger, joindre
  • Connaître les garanties ACID et ce qu'elles signifient en pratique
  • Différencier SQLite, PostgreSQL et MySQL sur le typage, les transactions, l'administration et les cas d'usage
  • Choisir le bon moteur selon votre contexte (script local, application web, données complexes)

Dès qu'une application a besoin de stocker des données structurées — comptes utilisateurs, commandes, inventaire, logs, configuration — la question du moteur de base de données se pose. Vous rencontrerez ce choix dans des situations très concrètes :

  • Vous écrivez un script d'inventaire ou un outil CLI et vous voulez stocker les résultats localement
  • Vous déployez une application web qui gère des utilisateurs, des produits et des commandes
  • Vous montez un service métier avec des données complexes, des contraintes d'intégrité forte et des besoins d'extensibilité
  • Vous administrez un serveur et vous devez choisir entre SQLite, PostgreSQL et MySQL pour un nouveau projet

Une base de données relationnelle stocke les informations dans des tables. Chaque table représente un type d'objet (un utilisateur, un produit, une commande). Chaque ligne est un enregistrement, chaque colonne est un attribut.

Analogie : une table, c'est un tableur Excel très strict. Chaque colonne a un nom et un type imposé (texte, nombre, date), chaque ligne est un enregistrement, et il est interdit de mettre n'importe quoi dans n'importe quelle case.

Ce modèle a été formalisé en 1970 par Edgar F. Codd (chercheur chez IBM) dans son article fondateur sur le modèle relationnel. Le langage SQL (Structured Query Language) est né dans la foulée pour interroger ces tables. Cinquante ans plus tard, SQL reste le standard universel.

ConceptRôleExemple
TableStructure qui contient les donnéesclients, commandes
ColonneAttribut d'une table (nom + type)nom VARCHAR(100), prix DECIMAL(10,2)
LigneUn enregistrementLe client "Alice", la commande n° 42
Clé primaireIdentifiant unique d'une ligneid INT PRIMARY KEY
Clé étrangèreLien vers la clé primaire d'une autre tableclient_id REFERENCES clients(id)
ContrainteRègle d'intégrité (unicité, non-null, référence)UNIQUE, NOT NULL, FOREIGN KEY

Les tables ne vivent pas isolées. Une clé étrangère relie une table à une autre :

Relation entre deux tables : clients et commandes

Dans cet exemple, chaque commande pointe vers un client via client_id. C'est l'intégrité référentielle : impossible de créer une commande pour un client qui n'existe pas.

Plutôt que des extraits isolés, voici un mini-domaine complet — clients, produits, commandes — pour voir les opérations fondamentales en action.

CREATE TABLE clients (
id INT PRIMARY KEY,
nom VARCHAR(100) NOT NULL,
email VARCHAR(150) UNIQUE
);
CREATE TABLE produits (
id INT PRIMARY KEY,
nom VARCHAR(100) NOT NULL,
prix DECIMAL(10, 2) NOT NULL
);
CREATE TABLE commandes (
id INT PRIMARY KEY,
client_id INT NOT NULL,
produit_id INT NOT NULL,
quantite INT DEFAULT 1,
date_commande DATE NOT NULL,
FOREIGN KEY (client_id) REFERENCES clients(id),
FOREIGN KEY (produit_id) REFERENCES produits(id)
);
INSERT INTO clients (id, nom, email) VALUES
(1, 'Alice Martin', 'alice@example.com'),
(2, 'Bob Dupont', 'bob@example.com');
INSERT INTO produits (id, nom, prix) VALUES
(1, 'Ordinateur portable', 999.99),
(2, 'Clavier mécanique', 89.50);
INSERT INTO commandes (id, client_id, produit_id, quantite, date_commande) VALUES
(1, 1, 1, 1, '2026-04-10'),
(2, 1, 2, 2, '2026-04-11'),
(3, 2, 2, 1, '2026-04-12');

La jointure (JOIN) est la requête qui tire parti des relations entre tables. Elle permet de combiner les données de plusieurs tables en une seule réponse :

SELECT
c.nom AS client,
p.nom AS produit,
cmd.quantite,
p.prix * cmd.quantite AS total
FROM commandes cmd
JOIN clients c ON cmd.client_id = c.id
JOIN produits p ON cmd.produit_id = p.id
ORDER BY cmd.date_commande;

Résultat :

client | produit | quantite | total
-----------------+---------------------+----------+--------
Alice Martin | Ordinateur portable | 1 | 999.99
Alice Martin | Clavier mécanique | 2 | 179.00
Bob Dupont | Clavier mécanique | 1 | 89.50
-- Mettre à jour un prix
UPDATE produits SET prix = 849.99 WHERE id = 1;
-- Supprimer une commande
DELETE FROM commandes WHERE id = 3;

Un système de gestion de bases de données relationnelles (SGBDR) ne se contente pas de stocker des lignes. Il offre des garanties qui le distinguent d'un simple fichier CSV ou JSON.

Une transaction regroupe plusieurs opérations en un bloc atomique :

BEGIN;
UPDATE comptes SET solde = solde - 100 WHERE id = 1;
UPDATE comptes SET solde = solde + 100 WHERE id = 2;
COMMIT;

Si l'une des opérations échoue, aucune n'est appliquée (ROLLBACK). C'est le principe fondamental des propriétés ACID :

PropriétéSignificationEn pratique
AtomicitéTout ou rienUn virement ne peut pas débiter sans créditer
CohérenceLa base passe d'un état valide à un autreLes contraintes sont toujours respectées
IsolationLes transactions concurrentes ne se perturbent pasDeux virements simultanés donnent le bon résultat
DurabilitéUn COMMIT est permanentMême après un crash, les données sont là

Un index accélère les recherches. Sans index, le moteur parcourt toute la table (scan séquentiel). Avec un index, il va directement à la bonne ligne — comme un index dans un livre :

CREATE INDEX idx_clients_email ON clients(email);

Le type d'index le plus courant est le B-Tree, efficace pour les recherches d'égalité (WHERE email = '...') et par plage (WHERE prix > 50). PostgreSQL propose aussi GiST, GIN, BRIN et des index sur expressions. MySQL utilise principalement B-Tree et hash (avec InnoDB). SQLite ne supporte que B-Tree.

La gestion des utilisateurs et des permissions diffère fondamentalement d'un moteur à l'autre :

PostgreSQL raisonne en rôles. Un rôle peut être un utilisateur (avec LOGIN) ou un groupe (sans LOGIN). Les permissions se gèrent avec GRANT et REVOKE :

CREATE ROLE lecteur;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO lecteur;
CREATE ROLE alice LOGIN PASSWORD 'motdepasse';
GRANT lecteur TO alice;

C'est la question centrale. Ces trois moteurs sont tous relationnels et parlent SQL, mais ils n'ont pas la même nature ni les mêmes cas d'usage.

CritèreSQLitePostgreSQLMySQL
NatureBibliothèque embarquée (fichier local)Serveur objet-relationnel extensibleServeur SQL multi-utilisateur
DéploiementAucun — un fichier suffitService à installer et configurerService à installer et configurer
Multi-utilisateursUn seul écrivain à la foisOui, conçu pourOui, conçu pour
TypageDynamique (par valeur), mode STRICT optionnelStatique, strict, types riches (JSON, array, range, hstore)Statique, strict, types classiques
ExtensibilitéLimitéeTrès riche (extensions, types custom, PL/pgSQL, PL/Python)Plugins, UDF
RéplicationNon intégréeStreaming, logique, synchrone/asynchroneSource/replica, Group Replication
LicenceDomaine publicPostgreSQL License (libre)GPL v2 (Community) / Commercial (Enterprise)
Taille typiqueKo → quelques GoGo → ToGo → To

SQLite est une bibliothèque C qui lit et écrit directement dans un fichier. Il n'y a pas de serveur, pas de configuration réseau, pas de gestion d'utilisateurs.

Cas d'usage typiques :

  • Scripts et outils CLI qui stockent des résultats ou de la configuration
  • Applications mobiles et embarquées
  • Prototypage rapide et tests
  • Fichiers de données locales (inventaire, cache, historique)

Limites :

  • Un seul processus peut écrire à la fois (sérialisé, même en mode WAL)
  • Pas de gestion d'accès réseau ni d'authentification
  • Le typage est dynamique par défaut — une colonne INT peut contenir du texte si STRICT n'est pas activé

PostgreSQL est un moteur objet-relationnel avec une philosophie d'extensibilité et de conformité aux standards SQL. C'est le choix le plus riche fonctionnellement.

Cas d'usage typiques :

  • Applications métier avec des données complexes (géospatiales, JSON, arrays)
  • Systèmes nécessitant une intégrité forte et des contraintes avancées
  • Projets avec des besoins d'extensibilité (types custom, extensions comme PostGIS, pgvector)
  • Environnements DevOps / infrastructure (Terraform state, Vault, AWX, Gitea)

Points forts différenciants :

  • Types avancés natifs : JSONB, ARRAY, RANGE, UUID, INET
  • Index spécialisés : GiST, GIN, BRIN
  • Réplication streaming et logique intégrée
  • EXPLAIN ANALYZE très détaillé pour l'optimisation

MySQL est un serveur SQL très répandu, historiquement dominant dans l'écosystème web (LAMP, WordPress, Drupal, Magento). Il est simple à démarrer et dispose d'un large écosystème d'hébergement.

Cas d'usage typiques :

  • Applications web classiques (CMS, e-commerce, blogs)
  • Projets nécessitant un hébergement mutualisé (MySQL est quasi universel chez les hébergeurs)
  • Stacks applicatives existantes qui s'appuient sur MySQL/MariaDB
  • Réplication source/replica pour la lecture distribuée

Points à connaître :

  • La terminologie a évolué : on parle désormais de source et replica (et non plus maître/esclave)
  • La commande CHANGE REPLICATION SOURCE TO remplace CHANGE MASTER TO (déprécié depuis MySQL 8.0.23)
  • MariaDB est un fork de MySQL avec des divergences croissantes
Votre contexteMoteur recommandé
Script local, outil CLI, prototypageSQLite
Application web simple, hébergement mutualiséMySQL
Application métier, données complexes, DevOpsPostgreSQL
Mobile, embarqué, IoTSQLite
Intégrité forte, extensions, standards SQLPostgreSQL
Stack existante MySQL/MariaDBMySQL
Besoin de réplication avancéePostgreSQL ou MySQL
  1. Une base relationnelle organise les données en tables reliées par des clés, interrogées en SQL
  2. Les opérations SQL de base — CREATE TABLE, INSERT, SELECT JOIN, UPDATE, DELETE — sont portables entre moteurs
  3. Les propriétés ACID garantissent la fiabilité des transactions, mais le comportement exact de l'isolation varie selon le moteur
  4. SQLite est une bibliothèque embarquée (fichier local, zéro configuration, un seul écrivain) — idéale pour scripts et outils
  5. PostgreSQL est un moteur objet-relationnel extensible (types riches, index spécialisés, réplication intégrée) — le plus complet fonctionnellement
  6. MySQL est un serveur SQL très répandu (écosystème web, hébergement facile, réplication source/replica) — le plus courant en hébergement
  7. Le typage diffère : dynamique par défaut sur SQLite, strict sur PostgreSQL et MySQL
  8. Le contrôle d'accès diffère radicalement : rôles (PostgreSQL), user@host (MySQL), permissions fichier (SQLite)

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn