Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PowerAMC Discussion :

Index non générés lors de la création du MPD


Sujet :

PowerAMC

  1. #1
    Membre à l'essai
    Index non générés lors de la création du MPD
    Bonjour,

    Je fais face à un souci assez embarrassant. Lorsque j'essaye de générer mon MDP à partir de mon MLD, PowerAMC ne crée aucun index pour les clés primaires et les clés étrangères.
    Je ne peux pas dévoilé le schéma ici (oui je sais ça n'aide pas du tout et c'est assez tordu de ma part) car il s'agit du site d'un client et il ne s'agit pas d'un site "simple".
    En fait j'ai de forts doutes sur la véracité de mon MCD ou MLD pour une partie précise de celui-ci.

    Pour faire simple, il y a trois associations multiples (0.N) qui possèdent trois relations chacune que j'ai moi-même transformé en tables car l'une des trois clés étrangères qui formait la clé primaire peut devenir nulle après suppression de l'entrée correspondante (ON DELETE SET NULL).
    Étant donné que je ne pouvais pas non plus établir la clé primaire sur les deux autres clés étrangères (car la paire peut ne pas être unique), j'ai donc crée une clé primaire spécifique à cette table.
    À partir de là, le MPD est généré normalement et PowerAMC fait le lien entre mon MCD, MLD et MPD mais ne crée par contre aucun index (comme expliqué plus haut).

    Je pourrais crée les index manuellement mais le problème est que lorsque j'apporte des modifications sur le MCD ou MLD et que je fusionne le MPD généré avec celui déjà établi, je pers à nouveau tous les index.

    Si quelqu'un a une idée du pourquoi du comment j'en serais très reconnaissant.

    Merci.

  2. #2
    Expert éminent sénior
    Bonsoir Rastaa_html,


    Quelle est votre version de PowerAMC ?

    Générez directement le MPD à partir du MCD. Effectuez une vérification de celui-ci (touche F4 sous Windows).

    Avez-vous vérifié les options de génération ? Cf. ci-dessous :

    Onglets : SGBD > Générer la base données


    Faites simple, mais pas plus simple ! (A. Einstein)
    E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    Je ne réponds pas aux questions techniques par MP. Les forums sont là pout ça.
    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench

  3. #3
    Membre à l'essai
    Bonjour fsmrel et merci d'avoir pris le temps de répondre

    J'ai en effet oublié de spécifier la version et il s'agit donc de la version 15.1.

    J'ai donc vérifié les options de génération et il semblerait que tout soit coché normalement (enfin je suppose...).
    Pour clé étrangère->création de clé étrangère, l'option choisie est externe et
    pour index, les deux cases concernant la création et suppression sont cochées.

    J'ai par ailleurs procéder comme vous l'aviez suggéré, en générant le MPD directement à partir du MCD et là, les index sont bien ajoutés mais il n'arrive pas à établir mon ancien MPD comme modèle cible afin de pouvoir les fusionner. J'ai donc bien peur qu'une modification sur mon MCD fera en sorte que je doive encore me retaper tout le travail que j'ai déjà effectué sur mon MPD.

    Auriez-vous une idée de la cause de cette non création d'index ?

    Encore merci pour votre aide précieuse.

  4. #4
    Expert éminent sénior
    Bonjour,


    Concernant les clés étrangères, êtes-vous bien dans cette configuration ?


    Faites simple, mais pas plus simple ! (A. Einstein)
    E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    Je ne réponds pas aux questions techniques par MP. Les forums sont là pout ça.
    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench

  5. #5
    Membre à l'essai
    Rebonjour,

    Oui, la configuration est identique à celle que vous indiquez.

  6. #6
    Expert éminent sénior
    Et le fitre d'index « Clé étrangère » est bien coché ?


    Faites simple, mais pas plus simple ! (A. Einstein)
    E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    Je ne réponds pas aux questions techniques par MP. Les forums sont là pout ça.
    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench

  7. #7
    Membre à l'essai
    En effet ce n'était pas coché. Quelle sera la conséquence une fois que je l'aurai coché. J'ai un peu peur de générer à nouveau le MPD je me suis coltiné tout le travail d'actualisation et ça m'a gâché une heure tout à l'heure. Faut dire que ça m'a déjà retardé plus qu'il n'en faut.

    Voici au cas où, l'ensemble de mes options :



    Encore merci

  8. #8
    Expert éminent sénior
    Pour ne pas ficher la zoubia, faites comme ci-dessous : changez le nom du script à générer, cochez la case filtre et regardez si les instructions CREATE INDEX sont bien présentes dans le nouveau script.


    Faites simple, mais pas plus simple ! (A. Einstein)
    E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    Je ne réponds pas aux questions techniques par MP. Les forums sont là pout ça.
    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench

  9. #9
    Membre à l'essai
    Je ne savais pas que "zoubia" a fait son entrée dans la langue française (et franchement avec la zoubida, on est à deux doigts du cliché )

    Quoi qu'il en soit, désolé pour la réponse tardive.

    Pour revenir au sujet,il y a un truc bizarre qui se passe au niveau des options. Je n'arrive pas à avoir et Clé étrangère->Création de clé étrangère et Index->Filtre d'index->Clé étrangère cochés en même temps. L'une décoche forcément l'autre.

    L'autre chose bizarre, est le fait que si la case Index->Filtre d'index->Clé étrangère est cochée, les contraintes ne sont pas générées au niveau SQL.
    Je commence donc à vraiment perdre le fil...

    Je songe vraiment à tout refaire parce que là ça s'apparente de plus en plus à un patchwork et du rafistolage qu'à un vrai travail propre. Le seul truc, c'est que j'ai peur de tout refaire et d'aboutir au même problème.
    Pour l'instant, à chaque fois que j'actualise un de mes schémas, je fais la même chose manuellement pour tout le reste.

    Donc y a-t-il vraiment une solution ou est-ce que le problème vient de moi ?

    Edit : Je profite encore de votre gentillesse et de vos connaissances, vu que je lis souvent vos interventions concernant PowerAMC sur ce forum. Je n'ai toujours pas compris comment ajouter de manière simple la contrainte unique à un champ sans forcément l'indexer ?

  10. #10
    Expert éminent sénior
    Bonsoir Rastaa_html,


    Citation Envoyé par Rastaa_html
    Je n'arrive pas à avoir et Clé étrangère->Création de clé étrangère et Index->Filtre d'index->Clé étrangère cochés en même temps. L'une décoche forcément l'autre.

    Si la case Index->Filtre d'index->Clé étrangère est cochée, les contraintes ne sont pas générées au niveau SQL.


    Pour que les contraintes référentielles (clés étrangères) soient générées, il est impératif que la 1re condition soit remplie :

    Clé étrangère est à cocher :





    Et pour que les index dédiés aux clés étrangères soient déclarés (CREATE INDEX), il est impératif que la 2e condition soit remplie elle aussi : « Index » coché ainsi que « Filtre sur clé étrangère » .






    Maintenant, vos index sont-ils correctement déclarés, à l’instar de l’index EMPLOYE_SERVICE_FK_X ci-dessous ?










    Citation Envoyé par Rastaa_html
    Je n'ai toujours pas compris comment ajouter de manière simple la contrainte unique à un champ sans forcément l'indexer ?


    Je suppose que vous avez défini une contrainte unique symbolisée par le mickey <ak>, à l’image de la contrainte EMPLOYE_AK (cf. MPD ci-dessus). Vous pouvez sélectionner l’index EMPLOYE_AK_X associé et le supprimer à l’aide de la touche de fonction « Suppr », mais les conséquences sont imprévisibles car, d’une manière générale, les SGBD garantissent l’unicité des clés non pas par du code, mais par l’affectation sous le capot d’un index de type UNIQUE, y a pas le choix (fainéantise oblige). On voit très bien cela en examinant le contenu du catalogue relationnel du SGBD.

    Exemple avec PostgreSQL :

    
    SET SCHEMA 'public' ;
    
    CREATE TABLE SERVICE 
    (
       serviceNo            INT NOT NULL,
       serviceNom           VARCHAR(24) NOT NULL,
       serviceBudget        INT NOT NULL,
       CONSTRAINT SERVICE_PK PRIMARY KEY (serviceNo)
    ) ;
    
    CREATE TABLE EMPLOYE 
    (
       employeNo            INT NOT NULL,
       serviceNo            INT NOT NULL,
       employeNom           VARCHAR(24) NOT NULL,
       employeSalaire       INT NOT NULL,
       CONSTRAINT EMPLOYE_PK PRIMARY KEY (employeNo),
       CONSTRAINT EMPLOYE_AK UNIQUE (employeNom),
       CONSTRAINT EMPLOYE_SERVICE_FK FOREIGN KEY (serviceNo)
          REFERENCES SERVICE
    ) ;
    
    CREATE TABLE COURRIEL 
    (
       courrielNo           INT NOT NULL,
       employeNo            INT NOT NULL,
       courrielDate         DATE NOT NULL,
       courrielTexte        VARCHAR(64) NOT NULL,
       CONSTRAINT COURRIEL_PK PRIMARY KEY (courrielNo),
       CONSTRAINT COURRIEL_EMPLOYE_FK FOREIGN KEY (employeNo)
          REFERENCES EMPLOYE
    ) ;
    
    CREATE INDEX COURRIEL_EMPLOYE_FK on COURRIEL (employeNo ASC) ;
    
    CREATE INDEX EMPLOYE_SERVICE_FK_X on EMPLOYE (serviceNo ASC) ; 
    
    

    Contenu du catalogue :

    
    SELECT tablename, indexname
    FROM   pg_indexes  where schemaname = 'public' and tablename in ('service', 'employe', 'courriel') 
    ORDER BY tablename
    ;
    
    
    =>

    
    tablename     indexname
    ---------     --------------------
    courriel      courriel_pk
    courriel      courriel_employe_fk
    employe       employe_pk
    employe       employe_ak
    employe       employe_service_fk_x
    service       service_pk
    
    

    Si on tente la suppression de l’index EMPLOYE_AK :

    
    DROP INDEX EMPLOYE_AK ; 
    
    
    Alors c’est macache oualou, plus une astuce débile de la part de PostgreSQL :

    Citation Envoyé par PostgreSQL

    ERREUR: n'a pas pu supprimer index employe_ak car il est requis par contrainte employe_ak sur table employe.
    État SQL :2BP01
    Astuce : Vous pouvez supprimer contrainte employe_ak sur table employe à la place.
    Faites simple, mais pas plus simple ! (A. Einstein)
    E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    Je ne réponds pas aux questions techniques par MP. Les forums sont là pout ça.
    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench

  11. #11
    Membre à l'essai
    Bonjour fsmrel et encore merci de consacrer du temps pour répondre à mon sujet.

    Là tout de suite je suis passé au dev de la partie front du site donc je me suis un petit peu éloigné du problème initial.
    En fait, j'ai actualisé mon MCD par contrainte afin de répondre à certains besoins et la BDD a été finalisée. J'ai donc généré mon MLD, puis mon MPD et tout s'est normalement passé. Le SQL généré était également bon donc je n'ai pas eu vraiment à essayer ce que vous m'avez dit mais dès que j'aurais le temps, je me pencherai à titre personnel sur ce cas (le sujet reste en suspend [?]).

    Concernant la création de contrainte unique, je pense que j'ai dû manquer de clarté (ou alors vous avez bien saisi la chose, je ne sais pas) car en fait il ne s'agit pas de création d'index mais tout le contraire.
    La méthode que j'utilisais est bien celle que vous décrivez, i.e en passant par la création d'une clé alternative. Cependant, comme vous le dites, c'est loin d'être approprié.
    Ce que j'aurais souhaité, c'est qu'en fait il n'y ait qu'une "simple" contrainte unique qui aboutirait à un SQL du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE table
    (
       id                	int not null auto_increment,
       libelle              varchar(255) not null unique,
       primary key (id)
    );
    Mais j'ai franchement l'impression que PowerAMC ne fait pas cela. Me trompé-je ?

    PS : "macache oualou" C'est festival

  12. #12
    Membre à l'essai
    icnclusion de l'index
    Bonjour,
    je suis nouveau dans les bases de données et dans l'utilisation de PowerAMC. j'ai fait un MCD que vous verrez en pièces jointes mais lorsque je génère la base de donnée il y'avait d'abord l'erreur "vérifier l'existence de l'index" après avoir suivi les étapes que j'ai vu sur l'une des discussion sur ce forum l'erreur est maintenant " vérifier l'inclusion de l'index"
    besoin d'aide merci.