9. Rétro-conception▲
9-1. Objet de la rétro-conception▲
    			La rétro-conception permet de produire un diagramme MWB à partir du code SQL (CREATE TABLE) ou encore — 
				ce qui est propre à  MySQL Workbench — produire un tel diagramme à partir d'un diagramme DBDesigner 4.
			
9-2. A partir du code SQL▲
    			Après avoir créé un modèle vierge (commande « File > New Model » 
				cf. paragraphe 2.2.1), on importe le fichier 
				contenant le code SQL utilisé pour la rétro-conception (le format .txt 
				ou équivalent est parfait pour cela) :
			
.png)
				Suite à l'ouverture de la fenêtre « Reverse Engineer SQL Script », 
				en y cochant la case « Place imported objects on a diagram », on demande que les objets soient 
				directement placés dans le diagramme. (On peut aussi se contenter de leur inscription au catalogue, 
				et plus tard utiliser la commande « Model > Create Diagram from Catalog 
				Objects » pour qu'ils apparaissent dans le diagramme) :
			

    			On peut avoir droit à quelques remarques :
			

				Une fois corrigées les erreurs, MySQL Workbench prend acte :
			

    			Et comme dans la chanson, tout finit par s'arranger...
			
.png)
				On a droit à un gros pâté qu'il restera à mettre en forme en déplaçant judicieusement les objets affichés :
			

    			Suite aux déplacements judicieux, le diagramme prend forme :
			

				Il reste à remplacer certaines cardinalités minimales 1 par 0 si cela est nécessaire (par exemple, 
				certains articles peuvent ne pas avoir été commandés).
				
				Le code SQL source ayant servi pour la rétro-conception  :
			
CREATE TABLE CLIENT 
(
     CliId                INT                  NOT NULL
   , CliNom               VARCHAR(48)          NOT NULL
   , CliSiret             CHAR(14)             NOT NULL
  , CONSTRAINT CLIENT_PK PRIMARY KEY  (CliId)
  , CONSTRAINT CLIENT_AK1 UNIQUE (CliSiret)
) ;
CREATE TABLE ARTICLE 
(
     ArtId                INT                  NOT NULL
   , ArtNom               VARCHAR(48)          NOT NULL 
   , PrixHT               DECIMAL(16)          NOT NULL
 , CONSTRAINT ARTICLE_PK PRIMARY KEY (ArtId)
) ;
CREATE TABLE CAMION 
(
     CamionId             INT                  NOT NULL
   , CamImmat             VARCHAR(14)          NOT NULL
   , Camstatut            CHAR(2)              NOT NULL
 , CONSTRAINT CAMION_PK PRIMARY KEY (CamionId)
 , CONSTRAINT CAMION_AK1 UNIQUE (CamImmat)
) ;
CREATE TABLE COMMANDE 
(
     CliId                INT                  NOT NULL
   , CdeId                SMALLINT             NOT NULL
   , CdeNo                VARCHAR(12)          NOT NULL
   , CdeDate              CHAR(10)             NOT NULL
   , CdeStatut            CHAR(2)              NOT NULL
 , CONSTRAINT COMMANDE_PK PRIMARY KEY (CliId, CdeId)
 , CONSTRAINT COMMANDE_AK1 UNIQUE (CdeNo)
 , CONSTRAINT COMMANDE_CLIENT_FK FOREIGN KEY (CliId)
      REFERENCES CLIENT (CliId) ON DELETE CASCADE
) ;
CREATE TABLE LIGNECDE 
(
     CliId                INT                  NOT NULL
   , CdeId                SMALLINT             NOT NULL
   , LigneId              SMALLINT             NOT NULL
   , ArtId                INT                  NOT NULL
   , Quantite             INT                  NOT NULL
 , CONSTRAINT LIGNECDE_PK PRIMARY KEY (CliId, CdeId, LigneId)
 , CONSTRAINT LIGNECDE_CDE_FK FOREIGN KEY (CliId, CdeId)
      REFERENCES COMMANDE (CliId, CdeId) ON DELETE CASCADE
 , CONSTRAINT LIGNECDE_ART_FK FOREIGN KEY (ArtId)
      REFERENCES ARTICLE (ArtId)
) ;
CREATE TABLE ENGAGEMENT 
(
     CliId                INT                  NOT NULL
   , CdeId                SMALLINT             NOT NULL
   , LigneId              SMALLINT             NOT NULL
   , EngId                SMALLINT             NOT NULL
   , EngType              CHAR(2)              NOT NULL
   , EngDate              CHAR(10)             NOT NULL
   , Quantite             INT                  NOT NULL
, CONSTRAINT ENGAGEMENT_PK PRIMARY KEY (CliId, CdeId, LigneId, EngId)
, CONSTRAINT ENGAGEMENT_LIGNE_FK FOREIGN KEY (CliId, CdeId, LigneId)
      REFERENCES LIGNECDE (CliId, CdeId, LigneId) ON DELETE CASCADE
) ;
CREATE TABLE LIVRAISON 
(
     CliId                INT                  NOT NULL
   , CdeId                SMALLINT             NOT NULL
   , LigneId              SMALLINT             NOT NULL
   , EngId                SMALLINT             NOT NULL
   , LivrId               SMALLINT             NOT NULL
   , LivrDate             CHAR(10)             NOT NULL
   , LivrStatut           CHAR(2)              NOT NULL
   , Quantite             INT                  NOT NULL
   , CamionId             INT                  NOT NULL
   , CONSTRAINT LIVRAISON_PK PRIMARY KEY (CliId, CdeId, LigneId, EngId, LivrId)
   , CONSTRAINT LIVRAISON_ENG_FK FOREIGN KEY (CliId, CdeId, LigneId, EngId)
         REFERENCES ENGAGEMENT (CliId, CdeId, LigneId, EngId) ON DELETE CASCADE
   , CONSTRAINT LIVRAISON_CAMION_FK FOREIGN KEY (CamionId)
      REFERENCES CAMION (CamionId)
) ;
				L'outil a évidemment correctement interprété les clés étrangères, et il  sait repérer les clés 
				alternatives, par exemple la clé {CdeNo} figurant dans la contrainte COMMANDE_AK1 :
			
    CONSTRAINT COMMANDE_AK1 UNIQUE (CdeNo)
				La clé alternative {CdeNo} est bien prise en compte (case « UQ » cochée) :
			

9-3. A partir de DBDesigner 4▲
 				Modèle DBDesigner 4 à rétro-concevoir (la hiérarchie des fournisseurs est discutable, mais bon...) :
			

 				Faire : « File > New Model », puis « Import » et 
				« Import DBDesigner4 Model » :
			

 				Saisie du nom du ficher au format XML :
			

 				Au résultat :
			

   	   				N.B. L'association réflexive portée par la table S peut être aménagée, comme dans le cas de la 
					hiérarchie figurant au paragraphe 7.2. 
   	   			
	

