Journal MCDView : un schéma SQL en diagramme entité-association interactif, en un fichier HTML statique

Posté par  . Licence CC By‑SA.
24
1
sept.
2026

Je partage un petit outil libre que j'ai écrit, sous licence MIT : mcdview. On lui donne un schéma (SQL, dump PostgreSQL/MySQL/SQLite, modèle pgModeler .dbm, DBML ou Prisma) et il produit un diagramme entité-association interactif, dans une seule page HTML autonome.

Le schéma Chinook rendu en une page

Libre et auto-hébergeable

Le générateur est un script Python en ligne de commande, sous licence MIT :

mcdview schema.sql -o sortie.html
mcdview.dev n'est que l'instance publique ; rien n'oblige à l'utiliser, tout se fait en local. Code : https://github.com/Gheop/mcdview

Zéro traçage, zéro runtime

La page produite est un fichier statique : rien ne s'exécute à l'ouverture, aucune connexion à une base, aucun script tiers, aucune inscription. Seule la structure est lue, une fois, à la génération. Elle est donc sûre à héberger, à archiver, à rouvrir hors ligne dans dix ans.

Interactif quand même

Cliquer une table pour l'isoler avec ses relations, repérer les tables centrales et les cycles, basculer clair/sombre. Export en SVG, en Mermaid erDiagram, ou en dictionnaire de données Markdown.

Isoler une table et ses relations

Intégration CI

Une action GitHub et un composant GitLab régénèrent le diagramme à chaque push, derrière un lien stable, avec un badge README (identité par OIDC, sans clé à stocker). Chaque push devient une version : on peut comparer deux états (diff) ou dérouler un time-lapse du schéma.

Diff entre deux versions du schéma

Ce que ça ne fait pas

Ce n'est pas un éditeur visuel de schéma (on visualise un schéma existant, on ne le dessine pas), et ça ne se connecte pas à une base vivante (on lui fournit le fichier).

Instance publique : https://mcdview.dev . Notes techniques : https://blog.mcdview.dev/fr/ .

Retours et critiques bienvenus, notamment sur le parsing des dialectes SQL et l'intégration CI.

  • # Bonus méta : le schéma de LinuxFr.org lui-même, en time-lapse

    Posté par  . Évalué à 2 (+2/-0).

    Petit bonus méta pour ce journal : j'ai passé le schéma de LinuxFr.org lui-même dans mcdview.

    Le dépôt linuxfrorg/linuxfr.org versionne db/schema.rb. Je l'ai converti en SQL (tables, colonnes, clés étrangères) et donné à mcdview :

    Un truc qui surprend dans la time-lapse : pendant des années, les tables flottent sans aucune relation. C'est fidèle au dépôt : jusqu'en 2018, LinuxFr ne déclarait aucune clé étrangère au niveau de la base (les associations vivaient côté modèles Rails). Elles arrivent d'un coup le 24 mars 2018, 29 FK dans le même commit.

    Le diff que je préfère : le passage à Doorkeeper pour OAuth2 en septembre 2014. Deux tables maison retirées (client_applications, access_grants), trois tables Doorkeeper (oauth_*) ajoutées : https://mcdview.dev/d/iLZLe1NA40nAHy6Wdk7x8A/41

    Historique des versions du schéma LinuxFr dans mcdview, de 2010 à 2026

    C'est reconstruit depuis le schema.rb public : la structure (tables, colonnes, FK), pas les index ni les types exacts, et rien n'est branché sur la base de prod. schema.rb étant du Ruby, mcdview ne le parse pas encore nativement, je suis passé par une petite moulinette schema.rb vers SQL.

  • # cool

    Posté par  (site web personnel) . Évalué à 4 (+2/-0). Dernière modification le 01 septembre 2026 à 23:26.

    je l'ai aussi appliqué à la base de LinuxFr.org ;-)

    ça donne :

    https://mcdview.dev/v/NJKyP0vScbH9OXt5vqkisg

    le bouton réorganiser est pas mal mais éloigne un peu les tables et les liens (clés étrangères) peuvent se croiser… ce serait pas mal de pouvoir annuler l'action (j'avais tout bien rangé avant :/)
    J'ai gardé un export SVG, mais tu ne vas pas repartir de là ?

    j'ai la case à cocher FK (pour Foreign Keys) qu'il n'y a pas pour ton diagramme

    • [^] # Re: cool

      Posté par  . Évalué à 2 (+2/-0).

      Good job ! Merci de me confirmer que ça marche bien :D

      Annuler la/les dernières actions seraient top en effet … faut que j'y réfléchisse, les positions déplacées sont déjà mémorisées en localStorage par visiteur, c'est devrait être assez facilement faisable sans alourdir le single file html. Je me le todolist.

      Pour la case à cocher, je suppose que tu parles de "FK d'audit" ? C'est la possibilité de cacher/afficher les FK de traçabilité (créateur, modificateur… qui servent pour l'historisation et qui relient toutes les tables à une table "utilisateur modificateur") qui brouillent le diagramme. Ca se configure dans la page de gestion juste après l'import du fichier sur le site (on peut cocher/décocher les fk) et les plus reconnaissables sont normalement détectées par défaut. Ou configurable par regex par l'API aussi.

      • [^] # Re: cool

        Posté par  (site web personnel) . Évalué à 2 (+0/-0). Dernière modification le 02 septembre 2026 à 00:03.

        les positions déplacées sont déjà mémorisées en localStorage par visiteur

        ah c'est pour ça que je les retrouve dans Firefox, mais pas dans epiphany ouvert sur la même page :/

        mais bon, après on va te demander de pouvoir mettre à disposition le rangement effectué, pouvoir caler au milieu / gauche / droite les tables quand les unes au-dessus des autres ou milieu / haut / bas quand côte à côte ;-) puis ensuite d'avoir des groupes d'entités pour zoomer sur le schéma avec un ensemble cohérent de tables…

        Pour la case à cocher, je suppose que tu parles de "FK d'audit" ?

        oui, sans la cocher, les relations entre tables via clé étrangère n'apparaissaient pas sur le schéma général (peut-être parce que j'ai intégré le fichier .rb directement, sans me poser de question… ni faire quelque conversion que ce soit).

        Je vais essayer avec le schéma de VHFFS — cf. https://vhffs.org — qui utilise du postgreSQL, dès que je remets la main sur mon arbo git, vu que notre cgit est en rade…

        • [^] # Re: cool

          Posté par  . Évalué à 2 (+2/-0).

          Ctrl+Z fait !

          J'ai regénéré tous les diagrammes du site, donc sur ton modèle aussi ça fonctionne maintenant.

          Par contre, le stockage des emplacements des tables, c'est pas faisable dans le fichier html en lui même… ou alors faudrait produire un autre html avec les nouvelles positions en dur. Mais ça complique beaucoup l'outil et on perd l'attrait d'un fichier html unique. Je pense qu'il faudra se contenter de l'export SVG pour ça :D

          • [^] # Re: cool

            Posté par  . Évalué à 3 (+3/-0).

            Bon … Ne jamais dire jamais… Surtout quand on a la nuit devant soit…

            Le bouton "Export" a vu apparaître un export html qui reprend les emplacements des tables…

  • # Editeur visuel de schéma

    Posté par  (site web personnel) . Évalué à 1 (+0/-0).

    Pour l'édition, j'avais trouvé ça (il y a quelques années) et ça marchait plutôt correctement : https://github.com/drawdb-io/drawdb

  • # schéma technique

    Posté par  . Évalué à 2 (+2/-2). Dernière modification le 03 septembre 2026 à 09:42.

    attention, un schéma technique tel que le visualise ton outil n'est pas un schéma entité association. C'est pas pour cracher dans la soupe, mais c'est que ce sont deux représentations de natures vraiment différentes.

    Le schéma EA est un schéma fonctionnel. (entre autres, il n'y a pas d'attribut technique comme les _id, et toutes les relations sont représentées individuellement, même si elles se traduisent dans le schéma technique par des simples contraintes de clef étrangère pour les relations de cardinalité 1-*, les associations sont représentées par des verbes, et on visualise bien sur le plan graphique qu'on représente deux types de trucs, les entités et les associations)

    La page wikipedia anglaise a un exemple plus riche que la page française

    https://en.wikipedia.org/wiki/Entity%E2%80%93relationship_model

    Il y a des règles assez simple pour générer un schéma technique à partir d'un schéma EA, mais je suis pas sûr qu'on peut toujours faire l'inverse.

    edit; j'ai raté mon lien wikipedia, je le met en direct

    • [^] # Re: schéma technique

      Posté par  (site web personnel, Mastodon) . Évalué à 3 (+1/-0).

      En même temps, le truc ne s’appelle pas « ER view » (et n’en utilise pas l’iconographie) mais « MCD view » (qui serait plutôt « CDM/CDS view » ou « vue MCD/SCD »)
      En tout cas il s’agit d’une représentation courante de modélisation de données relationnelle qu’on aurait pu appeler « LDM/LDS view » ou « vue MLD/SLD » ? Au fait, l’article wikipedia en anglais fait bien comprendre qu’il ne traite qu’une représentation (le MCD) de l’analyse en 3 niveau qui découle de MERISE.

      “It is seldom that liberty of any kind is lost all at once.” ― David Hume

      • [^] # Re: schéma technique

        Posté par  (site web personnel) . Évalué à 2 (+0/-0).

        qui découle de MERISE

        je doute que les anglais ou les américains utilisent MERISE (qui est franco-français) :D

        • [^] # Re: schéma technique

          Posté par  (site web personnel, Mastodon) . Évalué à 2 (+0/-0).

          J’en ai rencontré beaucoup qui font de la prose sans le savoir :) et les premiers logiciels que j’ai croisé pour informatiser la chose venaient du monde anglophone va comprendre. (je crois que même SDP et son AMC*Designor n’est pas francophone…)

          “It is seldom that liberty of any kind is lost all at once.” ― David Hume

          • [^] # Re: schéma technique

            Posté par  (site web personnel) . Évalué à 2 (+0/-0).

            1ère version de AMC*Designer (ok, c'est la 2.0) :

            1989 - La première version de AMC*Designor (version 2.0) en France

            ceci expliquant cela.
            tous les autres sont plutôt sur UML (logique du « qui peut le plus, peut le moins » :/ en réalité, pas vraiment, mais au final ça ne fait pas tant que ça de différence)

            • [^] # Re: schéma technique

              Posté par  (site web personnel, Mastodon) . Évalué à 2 (+0/-0). Dernière modification le 04 septembre 2026 à 00:23.

              Tiens, pour en revenir à mon commentaire initial, UML s’intéresse plus au MCT… non ? (normal, bien que se disant universel, c’est « orienté objet » où les données ne sont vues que par le prisme des propriétés d’objets et où on développe à base d’ORM…)

              Toujours pour en revenir à mon commentaire initial, et le précédant, la convention de schématisation actuelle correspond au MLD (bien que MERISE n’ai pas poussé du côté de la schématisation, comme pour le MCD) et est présente chez la plupart des éditeurs nord-américains (telles que Oracle's Designer ou theKompany's DataArchitect ou IBM Rational Rose, côté proprio, DBDesigner puis plus récemment phpMyAdmin et Adminer côté libre)

              “It is seldom that liberty of any kind is lost all at once.” ― David Hume

    • [^] # Re: schéma technique

      Posté par  (site web personnel) . Évalué à 3 (+1/-0).

      mais je suis pas sûr qu'on peut toujours faire l'inverse.

      moi je suis certain qu'on ne peut pas dans le cas général ;-)

      • si le modèle est dénormalisé, les associations ne seront pas traduites en clés-étrangères (foreign keys)
      • parfois tu rajoutes des index pour l'optimisation de certaines requêtes (et ça, ce n'est pas du ressort du modèle conceptuel de données ou du diagramme entité-association, éventuellement des vues correspondant aux requêtes sur un sous-ensemble cohérent du modèle de données)

      pour les relations de cardinalité 1-*, les associations sont représentées par des verbes, et on visualise bien sur le plan graphique qu'on représente deux types de trucs, les entités et les associations

      oui, ces 2 points concernant les associations (cardinalité, verbe de relation) m'ont manqué : j'imagine que c'est pour l'itération suivante :D

      edit: j'ai raté mon lien wikipedia, je le mets en direct

      hmmm j'y arrive : Entity relationship model mais il faut remplacer tiret et underscore par un espace et écrire [[en:Entity relationship model]] et si tu veux comme thoasm< que ce soit moche, tu rajoutes : devant — ce qui laisse wikipedia gérer la redirection et affiche `:en:' à ton mot wikipédifié — donne :en:Entity relationship model obtenu avec

      [[:en:Entity relationship model]] ;-) (mais je trouve ça moche :p)

      • [^] # Re: schéma technique

        Posté par  (site web personnel, Mastodon) . Évalué à 2 (+0/-0).

        L’indexation signale souvent une colonne (ou un tuple…) souvent interrogée et peu modifiée (sinon les index pénalisent), sans que ce soit directement lié au modèle lui-même sauf s’il s’agit d’une clé unique… qui peut être indiquée indiquée autrement dans le schéma de la table.
        Par contre la dénormalisation est une vraie plaie pour refaire l’opération inverse, mais souvent un vrai bonheur par rapport à certains besoins métiers.

        “It is seldom that liberty of any kind is lost all at once.” ― David Hume

        • [^] # Re: schéma technique

          Posté par  (site web personnel) . Évalué à 2 (+0/-0).

          Par contre la dénormalisation est une vraie plaie pour refaire l’opération inverse,

          euh le MCD n'est pas implémenté direct en prod' uniquement en base, heureusement les traitements sont censés l'assurer aussi (mais MCT n'existe qu'en Merise, pas en UML)

          mais souvent un vrai bonheur par rapport à certains besoins métiers

          bin, en prod', tu ne gardes pas un index qui n'est utilisé par aucune vue et qui plombe les performances (stockage, I/O, non efficace pour requêtes et ça c'est des informations hors du modèle, par nature limité…)
          Tu pensais à autre chose ? (oui, j'ai des utilisateurs qui font de la BI : ils ont leur base dédiée à plomber et pas d'accès à la prod' :p)

      • [^] # Re: schéma technique

        Posté par  . Évalué à 2 (+2/-0). Dernière modification le 04 septembre 2026 à 18:48.

        oui, ces 2 points concernant les associations (cardinalité, verbe de relation) m'ont manqué : j'imagine que c'est pour l'itération suivante :D

        Tu avais presque tout vu juste : un bouton "⋈ cardinalités" vient d'apparaître sur tous les diagrammes ;) Mais ce n'est pas activé par défaut. Par contre, pour les verbes de relation, ça ne se trouve pas dans les .sql, .dbm, etc. L'info n'y est pas, donc ce n'est pas possible, et ce n'est pas le but de cet outil.

        • [^] # Re: schéma technique

          Posté par  (site web personnel) . Évalué à 2 (+0/-0).

          Tu avais presque tout vu juste : un bouton "⋈ cardinalités" vient d'apparaître sur tous les diagrammes ;)

          ça manquait pour un MCD ;-)
          sachant que le lien n..n sera traduit par une table intermédiaire pour le MCT ou modèle conceptuel de traitement (ce sur quoi tu te bases, pour résoudre en 1..n, qui n'a aucune signification fonctionnelle)

          Par contre, pour les verbes de relation, ça ne se trouve pas dans les .sql, .dbm, etc. L'info n'y est pas, donc ce n'est pas possible, et ce n'est pas le but de cet outil.

          « dépend de » correspond à la notion d'association (donc non spécifiée pour le script de création de base de données, pourrait être édité), la précision du verbe est une notion fonctionnelle et donc du ressort du MCD (modèle conceptuel de données), pas du MLD (modèle logique de données)

          reste à avoir des liens courbes (comme actuellement) / obliques / rectangulaires et ce sera parfait :D

          • [^] # Re: schéma technique

            Posté par  . Évalué à 3 (+3/-0).

            J'ai déjà testé les liens obliques et rectangulaires, mais je trouvais ça terriblement laid … et y'a déjà parfois quelques incohérences sur les liens courbes… Puis le but premier, c'est quand même d'avoir un fichier html simple, léger, hébergeable partout. J'ai déjà quelques personnes qui râlent parce que ça s'affiche mal sur leur smartphone (quelle idée aussi) et qu'il y a trop de boutons …

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.