🗄️ Bases de données

database-database-design-advisor

Conception et modélisation de schémas de bases de données.

⚡ Installation & lancement en 1 commande

Copiez-collez dans votre terminal : le skill s'installe dans ~/.claude/skills et Claude Code se lance directement dessus.

macOS / Linux
curl -fsSL https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.sh | sh -s -- database-database-design-advisor --launch
Windows (PowerShell)
iex "& { $(iwr -useb https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.ps1) } database-database-design-advisor -Launch"

🚀 Déjà installé ?

claude "/database-database-design-advisor"

Ou tapez /database-database-design-advisor dans une session Claude Code, ou décrivez simplement votre besoin — le skill se déclenche automatiquement via le skill-router.

🔑 Déclencheurs automatiques

Le skill s'active automatiquement quand votre demande contient :

schéma base de donnéesnormalisation3NFdatabase designmodélisation relationnelle

📦 Installation manuelle

git clone https://github.com/khalilbenaz/claude-skills-collection.git cp -r claude-skills-collection/skills/database-database-design-advisor ~/.claude/skills/

Payload du plugin : skills/database-database-design-advisor · source éditable : database-skills/database-design-advisor

📖 Manuel

Database Design Advisor

Workflow

1. Recueillir les exigences

Questions à poser systématiquement :

2. Construire le modèle conceptuel (ERD)

Notation Crow's Foot recommandée. Identifier :

Client (1) ──────< (N) Commande (N) >──────< (N) Produit
                            |
                     LigneCommande (entité d'association)
                       quantite, prix_unitaire

3. Normalisation — critères de décision

Forme NormaleCe qu'elle élimineS'arrêter ici si…
1NFGroupes répétés, attributs multivaluésJamais en dessous
2NFDépendances partielles (clés composites)Table sans clé composite
3NFDépendances transitives (A→B→C)Cible par défaut
BCNFDéterminants non-clésDonnées très structurées
4NF/5NFDépendances multi-valuéesRarement nécessaire

Règle pratique : viser 3NF par défaut ; BCNF si les anomalies persistent avec des clés candidates multiples.

4. DDL — squelette opérationnel

-- Convention : snake_case, PK surrogate, timestamps audit
CREATE TABLE client (
    id          BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    code_client VARCHAR(20)  NOT NULL UNIQUE,
    nom         VARCHAR(100) NOT NULL,
    email       VARCHAR(255) NOT NULL UNIQUE,
    actif       BOOLEAN      NOT NULL DEFAULT TRUE,
    created_at  TIMESTAMPTZ  NOT NULL DEFAULT now(),
    updated_at  TIMESTAMPTZ  NOT NULL DEFAULT now()
);

CREATE TABLE commande (
    id          BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    client_id   BIGINT       NOT NULL REFERENCES client(id),
    statut      VARCHAR(20)  NOT NULL CHECK (statut IN ('BROUILLON','VALIDEE','LIVREE','ANNULEE')),
    total_ht    NUMERIC(14,4) NOT NULL CHECK (total_ht >= 0),
    created_at  TIMESTAMPTZ  NOT NULL DEFAULT now()
);
CREATE INDEX idx_commande_client ON commande(client_id);
CREATE INDEX idx_commande_statut ON commande(statut) WHERE statut NOT IN ('LIVREE','ANNULEE');

5. Patterns courants — quand les appliquer

Héritage (entité Personne → Employe / Client) :

PatternAvantageInconvénientChoisir si
TPH (Table Per Hierarchy)1 seule tableNombreuses colonnes NULLPeu de sous-types
TPT (Table Per Type)Pas de NULLJointures obligatoiresAttributs très différents
TPC (Table Per Concrete)Requêtes simplesDuplication de colonnesPas de requête polymorphe

Historisation SCD :

Soft delete :

-- Ajouter à chaque table concernée
deleted_at TIMESTAMPTZ,
deleted_by BIGINT REFERENCES utilisateur(id)
-- Index partiel pour exclure les supprimés des requêtes courantes
CREATE INDEX idx_client_actif ON client(code_client) WHERE deleted_at IS NULL;

Multi-tenant :

-- Approche shared schema (recommandée pour < 1000 tenants)
tenant_id BIGINT NOT NULL REFERENCES tenant(id)
-- Index composite : (tenant_id, clé_métier)
CREATE INDEX idx_commande_tenant ON commande(tenant_id, id);
-- RLS PostgreSQL
ALTER TABLE commande ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenant_isolation ON commande
    USING (tenant_id = current_setting('app.tenant_id')::BIGINT);

6. Indexation — règles de décision

Créer un index si :
  - Colonne dans WHERE fréquent ET cardinalité > 10 valeurs distinctes
  - Clé étrangère non couverte (jointure sans index = seq scan)
  - ORDER BY / GROUP BY sur grande table

Éviter si :
  - Table < 10 000 lignes (seq scan souvent plus rapide)
  - Colonne avec < 5 valeurs distinctes (booléen, statut à 2 états)
  - Table à insert massif (chaque index ralentit les writes)

Index partiel pour tables à soft delete ou statuts actifs :
  CREATE INDEX idx_cmd_en_cours ON commande(client_id)
      WHERE statut IN ('BROUILLON','VALIDEE');

7. Dénormalisation contrôlée

Toujours documenter via un commentaire ou ADR :

-- DÉNORM: total_commande stocké en cache dans client.total_commandes_ytd
-- Raison: requête tableau de bord T+500ms → T+5ms
-- Cohérence: trigger AFTER INSERT/UPDATE/DELETE sur commande
-- Revu le: 2026-01-15 — acceptable jusqu'à 5M commandes
ALTER TABLE client ADD COLUMN total_commandes_ytd NUMERIC(16,4) NOT NULL DEFAULT 0;

8. Validation finale — checklist


Anti-patterns / Pièges

Anti-patternSymptômeCorrection
EAV (Entity-Attribute-Value)Table (id, attribut, valeur) génériqueJSONB ou colonnes typées selon cas
Clé naturelle compositePRIMARY KEY (pays, code_postal, rue)Surrogate key + contrainte UNIQUE
NULL ambigusNULL = "inconnu" ET NULL = "non applicable"Colonnes séparées ou CHECK explicite
Table fourre-tout>50 colonnes, beaucoup de NULLDécomposer en sous-entités 3NF
Index sur tout>5 index par table sur OLTPProfiler d'abord, indexer ensuite
ON DELETE CASCADE en cascade profondeSuppression accidentelle en chaîneON DELETE RESTRICT + soft delete
UUID v4 comme PK sur MySQL/InnoDBFragmentation du B-tree → perf writeUUID v7 (monotone) ou ULID
Pas de partitionnement sur tables > 100M lignesVacuum/index rebuild trop longsPARTITION BY RANGE(created_at)

Bonnes pratiques 2026