← Retour à la semaine Aller au Volet 2 (PostgreSQL & Java) →
Volet 1 sur 2 · Vue d'ensemble architecturale

Intégrité des données dans nos systèmes

Tour d'horizon complet : du cœur interne du SGBD (DDL, contraintes, triggers) jusqu'à l'écosystème externe (UTF-8, Git, sauvegardes, ORM)

DOUBLON ✗ ORPHELIN ✗ MOJIBAKE ✗ CRASH / BIT ✗ INTEGRITAS PK · FK · UTF-8 · SHA-256 · ACID
Volet 1 / 2 · Architecture & Vue Système
INTÉGRITÉ
DES DONNÉES DANS NOS SYSTÈMES
par Nadine Giasson St-Amand

Du latin integritas (« entier, intact, inaltéré »). Comprendre tous les mécanismes qui protègent les données à l'intérieur et autour de la base.

I. Cœur du SGBDDDL, Clés, Contraintes, Triggers & Procédures
II. Vérité du TexteEncodage UTF-8, Casse & Collations
III. Survie & PreuveSauvegardes, Versionnement & Checksum
IV. Pont ApplicatifTransactions ACID, Journal WAL & ORM
🧭 Vision d'ensemble 🛡️ I. Périmètre Interne (SGBD) 🌐 II. Périmètre Externe (Système)
Pourquoi l'intégrité ?
FONDEMENT

Pourquoi l'intégrité ?

La première loi de l'architecture logicielle : les applications passent, mais les données restent.

Au fil des décennies, l'interface d'un système sera réécrite en Java, en Web ou en mobile. Mais si la base de données perd sa cohérence, c'est la mémoire même de l'organisation qui s'effondre.

✅ Qu'est-ce qu'une donnée intègre ?

C'est une donnée exacte (sans erreur de domaine), cohérente (aucune référence vers un élément fantôme) et intacte (non altérée sur le disque ou le réseau).

🛡️ Pourquoi le code Java ne suffit-il pas ?

Si vos règles ne sont vérifiées que dans un formulaire applicatif, le premier script d'importation, bogue ou accès direct contournera vos validations. Le SGBD doit être le gardien ultime.

🧭 Vision d'ensemble 🛡️ I. Périmètre Interne (SGBD) 🌐 II. Périmètre Externe (Système)
Architecture en 2 périmètres
ARCHITECTURE

Les deux périmètres de défense

🛡️ I. Le périmètre INTERNE (au cœur du SGBD)

  • 1. La structure (DDL) : typer chaque colonne et chaque table.
  • 2. Les contraintes SQL : interdire doublons, valeurs nulles ou orphelins.
  • 3 & 4. Déclencheurs & Procédures : réagir automatiquement aux écritures.

🌐 II. Le périmètre EXTERNE (le système et le temps)

  • 5. La représentation : encodage UTF-8, casse et expressions régulières.
  • 6, 7 & 8. La continuité : sauvegardes, migrations Git (ALTER TABLE) et Checksum.
  • 9. Le pont applicatif : synchronisation d'objets via ORM.
🌐 PÉRIMÈTRE II EXTERNE : UTF-8 / Regex · pg_dump · Git + ALTER TABLE · SHA-256 · ORM Hibernate 🛡️ PÉRIMÈTRE I INTERNE (Noyau SGBD) : 1. DDL · 2. Contraintes · 3. Triggers · 4. Procédures
🧭 Vision d'ensemble 🛡️ I. Périmètre Interne (SGBD) 🌐 II. Périmètre Externe (Système)
Carte des 9 sujets (cliquez pour accéder)
SOMMAIRE INTERACTIF

Présentation des SUJETS

🛡️ Contraintes d'intégrité internes (SGBD)

  • Data Definition Language (DDL)Sujet 1 →
  • Contraintes d'intégrité (NOT NULL, PK, FK, CHECK)Sujet 2 →
  • Déclencheurs (Triggers & CASCADE)Sujet 3 →
  • Procédures stockées (PL/pgSQL, T-SQL)Sujet 4 →

🌐 Encodage, Administration externe & ORM

  • Encodage & casse (UTF-8, ISO-8859-1, Regex)Sujet 5 →
  • Sauvegarde & restauration (pg_dump à chaud)Sujet 6 →
  • Versionnement des bases de données (Git + ALTER)Sujet 7 →
  • Checksum & fingerprint (SHA-256, MD5)Sujet 8 →
  • Object Relational Mapping (ORM : Hibernate, LINQ)Sujet 9 →
🛡️ Périmètre I · Au cœur du moteur SQL

CONTRAINTES D'INTÉGRITÉ

INTERNES DE LA BASE DE DONNÉES

Première partie

🧭 Vision 🛡️ I. Périmètre Interne (SGBD) 🌐 II. Périmètre Externe
1 / 4 · Data Definition Language (DDL)
SUJET 1 / 9

Data Definition Language (DDL)

Le DDL est le langage SQL qui permet de créer/modifier/détruire des tables, des colonnes et des clés.

Opération Table Colonne Clés
Créer CREATE TABLE matable (nomcolonne type, nomcolonne type); ALTER TABLE matable ADD colonne type; ALTER TABLE matable ADD PRIMARY KEY (unetelle);
Modifier ALTER TABLE matable ... ALTER TABLE matable ALTER/MODIFY colonne type;
Détruire DROP TABLE matable; ALTER TABLE matable DROP COLUMN colonne; ALTER TABLE matable DROP PRIMARY KEY;
🧭 Vision 🛡️ I. Périmètre Interne (SGBD) 🌐 II. Périmètre Externe
2 / 4 · Contraintes déclaratives SQL
SUJET 2 / 9

Contraintes d'intégrité

Les contraintes du SQL couvrent la majorité des besoins :

📌 Contraintes de colonnes

  • NOT NULL - Empêche les valeurs d'être nulles dans cette colonne
  • DEFAULT - Spécifie la valeur par défaut
  • CHECK - Condition à respecter pour toutes les valeurs de la colonne

🔑 Contraintes de table

  • UNIQUE - Oblige toutes les valeurs de la colonne à être différentes
  • PRIMARY KEY - Valeur unique qui sert d'identifiant à chaque rangée
  • FOREIGN KEY - Désigne toujours une rangée d'une autre table
  • INDEX - La colonne sera indexée dans la mémoire pour l'accès rapide
🧭 Vision 🛡️ I. Périmètre Interne (SGBD) 🌐 II. Périmètre Externe
2 / 4 · Exemple de table avec contraintes
SUJET 2 / 9 · CODE SQL

Contraintes d'intégrité (Exemple)

Illustration en SQL : voici comment ces contraintes de colonnes et de table s'assemblent lors d'un CREATE TABLE :

CREATE TABLE produit (
    id_produit   SERIAL        PRIMARY KEY,
    code_sku     VARCHAR(20)   NOT NULL UNIQUE,
    prix         NUMERIC(8,2)  NOT NULL CHECK (prix >= 0),
    en_stock     BOOLEAN       DEFAULT TRUE,
    id_categorie INT           NOT NULL REFERENCES categorie(id_categorie)
);
CREATE INDEX idx_produit_categorie ON produit(id_categorie);
Grâce à ces déclarations, le SGBD refuse de lui-même tout prix négatif (CHECK), tout SKU en double (UNIQUE) et toute référence vers une catégorie fantôme (FOREIGN KEY).
🧭 Vision 🛡️ I. Périmètre Interne (SGBD) 🌐 II. Périmètre Externe
3 / 4 · Déclencheurs (Triggers)
SUJET 3 / 9

Déclencheurs (Triggers)

Les déclencheurs s'utilisent pour déclencher des ajustements au reste de la base de données lorsque des données sont modifiées. Le but est de maintenir l'intégrité.

🔗 Pour les contraintes d'intégrité

(la contrainte)
ON INSERT / UPDATE / DELETE
CASCADE / SET NULL / RESTRICT

⚡ Pour les procédures stockées

CREATE TRIGGER untel
BEFORE / AFTER
INSERT / UPDATE / DELETE
Distinction clé : ON DELETE CASCADE répercute automatiquement une suppression sur les clés étrangères enfants, tandis que CREATE TRIGGER permet de lancer un traitement personnalisé (comme un journal d'audit).
🧭 Vision 🛡️ I. Périmètre Interne (SGBD) 🌐 II. Périmètre Externe
4 / 4 · Procédures stockées
SUJET 4 / 9

Procédures stockées

Les procédures stockées sont de petits bouts de code qui sont programmés directement dans la base de données.

Certaines procédures non-nommées sont directement attachées à leur événement déclencheur (trigger) et ne peuvent être appelées d'un autre point d'exécution. Par exemple :

CREATE TRIGGER apres_ajout_jouet AFTER INSERT ON jouet
BEGIN ... END;

Les procédures stockées nommées sont des fonctions nommées programmées à l'intérieur de la base de données. Leur syntaxe n'est pas standard, elle diffère d'un SGBD à l'autre. Leur utilisation était importante dans le passé mais de nos jours elle est réservée au maintien de l'intégrité.

🧭 Vision 🛡️ I. Périmètre Interne (SGBD) 🌐 II. Périmètre Externe
4 / 4 · Références SGBD & Passage au Volet 2
SUJET 4 / 9 · DIALECTES

Trigger & procédures stockées par SGBD

Chaque SGBD possède son propre dialecte procédural pour écrire ses déclencheurs et fonctions :

  • POSTGRESQL (PL/pgSQL) : docs.postgresql.fr/current/sql-createtrigger.html · docs.postgresql.fr/current/plpgsql-trigger.html
  • MYSQL : dev.mysql.com/doc/refman/en/triggers.html (sauf la partie sur la logique métier / business logic)
  • SQL SERVER (T-SQL) : learn.microsoft.com/sql/t-sql/statements/create-trigger-transact-sql
👉 Suite directe dans le Volet 2 (Intégrité dans la base de données) :
Nous y programmerons pas à pas en PostgreSQL / PL/pgSQL et dans pgAdmin 4 les séquences, les clés étrangères et la fonction déclencheur journaliser() avec les variables NEW et OLD.
🌐 Périmètre II · Autour de la base et dans le temps

INTÉGRITÉ EXTERNE

ENCODAGE, ADMINISTRATION, GIT & ORM

Deuxième partie

🧭 Vision 🛡️ I. Périmètre Interne 🌐 II. Périmètre Externe (Système)
5 / 9 · Encodage, casse et Regex
SUJET 5 / 9

Encodage et casse

  • ISO 8859-1 (alphabet occidental 1 octet) versus UTF-8 (universel 1 à 4 octets) : lire de l'UTF-8 en ISO-8859-1 corrompt Montréal en Montréal.
  • little-endian vs big-endian (ordre des octets en mémoire) · case-sensitive vs case-insensitive (LIKE vs ILIKE) · REGEX (expressions régulières).
Lettre « é » encodée en UTF-8 2 octets : [0xC3] [0xA9] ❌ Lu à tort en ISO-8859-1 (1 octet/car.) 0xC3 = « à » | 0xA9 = « © » → Montréal ✅ Lu en UTF-8 de bout en bout Point Unicode U+00E9 → Montréal
-- Exemple PostgreSQL combinant UTF-8, insensibilité à la casse (~*) et Regex :
ALTER TABLE client ADD CONSTRAINT format_code_postal CHECK (code_postal ~* '^[A-Z][0-9][A-Z] ?[0-9][A-Z][0-9]$');
🧭 Vision 🛡️ I. Périmètre Interne 🌐 II. Périmètre Externe (Système)
6 / 9 · Sauvegarde et restauration
SUJET 6 / 9

Sauvegarde et restauration

📄 Exports SQL et imports SQL (à chaud)

Permet de sauvegarder sans interrompre le serveur (instantané cohérent) et de transférer des données entre serveurs ou versions.

💾 Fichiers binaires natifs sur disque (à froid)

Rapide mais limité au même SGBD et à la même version exacte (parfois des soucis d'index surviennent : solution de secours uniquement).

# Exporter à chaud en SQL (sauvegarde) et réimporter (restauration) :
pg_dump -U postgres -d fermedelest -f sauvegarde_ferme.sql
psql -U postgres -d fermedelest -f sauvegarde_ferme.sql
🧭 Vision 🛡️ I. Périmètre Interne 🌐 II. Périmètre Externe (Système)
7 / 9 · Versionnement Git & Migrations SQL
SUJET 7 / 9

Versionnement de base de données

Chaque révision du logiciel dans Git doit inclure sa migration SQL correspondante DANS LE MÊME COMMIT. En production, on n'écrase jamais les tables avec DROP TABLE : on applique un différentiel ALTER TABLE.

1. Code Applicatif (DAO Java) src/dao/ClientDAO.java + 2. Script Différentiel (ALTER TABLE) sql/2026_10_ajout_telephone.sql 🔒 MÊME COMMIT GIT ATOMIQUE Code et Schéma 100 % synchronisés
ALTER TABLE client ADD COLUMN telephone VARCHAR(20) NOT NULL DEFAULT '';
git add src/dao/ClientDAO.java sql/migrations/2026_10_ajout_telephone.sql && git commit -m "Ajout téléphone (DAO + ALTER)"
🧭 Vision 🛡️ I. Périmètre Interne 🌐 II. Périmètre Externe (Système)
8 / 9 · Checksum et Fingerprint
SUJET 8 / 9

Checksum et Fingerprint

  • CHECKSUM : calcul mathématique sur les bits d'un fichier (somme, XOR, MD5, SHA-256) qui change radicalement si un seul bit est altéré lors d'un transfert ou sur disque.
  • FINGERPRINT : généralisation de l'usage de checksums sur la partie constante d'un système (ex. fichiers de configuration du serveur qui ne doivent pas bouger entre deux interventions admin).
✅ Fichier intact : prix = 100.00 $ SHA-256 : e574ff4fd1a5c5f4...afe2e2dc30 (OK) 🚨 1 seul bit altéré : prix = 900.00 $ SHA-256 : 9a18bc0277f1d904...3109c8aa71 (ALERTE !)
sha256sum sauvegarde_ferme.sql > sauvegarde_ferme.sql.sha256
sha256sum --check sauvegarde_ferme.sql.sha256   # Affiche : sauvegarde_ferme.sql: OK
🧭 Vision 🛡️ I. Périmètre Interne 🌐 II. Périmètre Externe (Système)
9 / 9 · Object Relational Mapping (ORM)
SUJET 9 / 9

Object Relational Mapping (ORM)

L'ORM semi-automatise la sauvegarde et la mise à jour des rangées de tables correspondant à des objets en mémoire vive (chaque rangée = un objet métier). Frameworks célèbres : Hibernate (Java), LINQ / Entity Framework (.NET) et Doctrine (PHP).

☕ Objet Métier en RAM (Java) produit.setPrix(24.99); 🔄 PONT ORM (Hibernate / JPA) Synchronisation Objet ↔ Rangée 🐘 Table Relationnelle (PostgreSQL) UPDATE produit SET prix=24.99...
Prochaine étape → Volet 2 (Intégrité dans la base de données) : Ouvrez le second diaporama pour plonger dans PostgreSQL et pgAdmin 4 et câbler concrètement clés primaires, clés étrangères, déclencheurs et procédures stockées.

Navigation : flèches ← → du clavier, ou glisser sur écran tactile · Texte et commandes 100 % sélectionnables