Bonsoir sudtek,
Envoyé par
sudtek
Je reformule pour être sur d’avoir bien compris : La ou les contraintes de l’application que l’on constate dans le MCD doit/doivent être adapter en langage SQL ou propriétaire pour le SGBD.
Oui. La contrainte que j’ai fait figurer :
Est rédigée en Tutorial D (matrice des vrais langages relationnels).
Il faut donc traduire en SQL (ou autre langage si vous n’utilisez pas SQL) ce qui est rédigé en Tutorial D et, si l’on suit la norme, on fait appel à l’instruction CREATE ASSERTION. Si le SGBD ne propose pas cette instruction, il faudra en passer par l’instruction CREATE TRIGGER comme vous vous proposez courageusement de le faire, même si, comme je l’ai écrit précédemment, c’est beaucoup moins facile à coder :
Envoyé par
fsmrel
l’usine à gaz, car il faut penser non seulement aux ajouts dans les tables NOTATION et UE, mais aussi aux modifications et suppressions altérant ces tables ainsi que la table EAK : ça n'est pas trivial, en plus ça peut être SGBD dépendant, mais on ne construit pas en paille...
Envoyé par
sudtek
J’ai MYSQL
Aïe !
Envoyé par
sudtek
Est-ce pour cette raison d’un point de vue relationnel :
ELEVE.................ADRESSE
| idEleve |.............| idadresse |.....
…...1............................9.............
…...2.........................NULL.......
…...3.........................NULL.......
Oui. Je me souviens d’un audit que j’avais fait chez les grands magasins Tartempion, où très vite je vis que l’entité-type ARTICLE était un soleil autour duquel dansaient (entre autres) une quinzaine d’entités-types satellites pour lesquels en guise de rayons partaient du soleil des pattes à cardinalité 0,1. Cela se traduisait par une table ARTICLE dont la vision du contenu à l’écran était celle du vide sidéral... A part la clé {ArticleId} et le libellé de l’article, pratiquement rien que du noir... Et encore, le libellé n’aurait pas eu besoin d’être présent, car redondant, recomposable au moyen d’algorithmes tordus appliqués à d’autres données de la base de données... Quoi qu’il en fut, la table ARTICLE comportait quelques centaines de milliers de lignes, valorisées seulement à peine à 10% (NULL oblige !), sans oublier la quinzaine d’index utilisés pour les clés étrangères. Exemple de satellite « bouffant » un index : ce qu’on appelait le stock national :
[ARTICLE]----0,1----(ASN)----0,N----[STOCK_NATIONAL]
Or la table STOCK_NATIONAL contenait une dizaine de lignes, nanars d’une époque très lointaine mais pouvant encore servir, sait-on jamais...
Après intervention de ma part, le MCD est, vous vous en doutez, devenu :
[ARTICLE]----0,1----(R1)----(1,1)----[ASN]----1,1----(R2)----0,N----[STOCK_NATIONAL]
Et la table ASN contenait à tout casser une trentaine de lignes, une misère...
En procédant ainsi pour les autres satellites, on fit un gain plus que substantiel en ressources (quinze index, 15 colonnes pour la table ARTICLE), on éjecta le bonhomme NULL, on rendit les traitements incomparablement plus performants, et tout ça, tout ça... Et ce genre de constat combien de fois l'ai-je fait chez mes clients !
Envoyé par
sudtek
OK donc :
|ELEVE|----(0,1)----R----(0,N)----|ADRESSE|
idEleve ….................................idAdresse
deviendrait :
|ELEVE|----(0,1)----R----(1,1)----|ELEVE_ADRESSE|----(1,1)----R----(0,N)----|ADRESSE|
{idEleve}...............................{#idEleve,#idAdresse}…..........................{idAdresse}
Un ELEVE a au minimum aucune ADRESSE et a au maximum une ADRESSE.
Une ADRESSE appartient au minimum à aucun ELEVE (Car elle peut être affecté à un PROFESSEUR) et appartient au maximum à un seul ELEVE.
(idem pour professeur)
Oui. A noter que lorsque les cardinalités 1,1 sont entre parenthèses, cela signifie (avec PowerAMC) que l’identification est relative (voyez l’association ASN ci-dessus). Le mieux serait donc que vous écriviez :
|ELEVE|----0,1----R----(1,1)----|ELEVE_ADRESSE|----1,1----R----0,N----|ADRESSE|
Où l’identification relative vaut seulement pour l’association entre ELEVE et ELEVE_ADRESSE.
Pour qu'il n'y ait pas de jaloux chez les AGL, mettez l'association R entre parenthèses, car en leur absence c'est la façon qu'a WinDesign de signifier l'identification relative...
Envoyé par
sudtek
Mais du coup d’un point de vue bonne pratique dois-je modifier le MCD avec le complément MCD ou puis-je me contenter de fournir une explication + le schéma équivalent de remplacement pour garder une trace et justifier l'évolution du MLD ?
Le MCD est plus un support de lecture vous permettant de discuter avec les utilisateurs et vous pouvez donc éviter de le surcharger, en conservant :
|ELEVE|----0,1----(ELEVE_ADRESSE)---- 0,N----|ADRESSE|
Étant entendu que de son côté le MLD est inconnu des utilisateurs, et c’est lui votre support pour causer avec le DBA : changement de chanson, cette fois-ci ELEVE_ADRESSE est bien une table. Ne pas oublier que le MLD sert à la production du script de création des tables SQL.
Envoyé par
sudtek
Envoyé par
fsmrel
Je vois que CodeCNU peut prendre la valeur 0 signifiant « pas de CNU » : c’est du 0,1 déguisé...
donc :
|MODULE|----(1,1)----(R)----(0,N)----|CNU|
CNU { idCodeCNU}
MODULE {idModule, #idCodeCNU}
mais est ce à dire que l’on obtinedrait cela ?
|MODULE|----(1,1)----(R)---(1,1)---|MODULE_CNU|----(1,1)---(R)----(0,N)----|CNU|
et ce MLD ? :
MODULE_CNU {#idModule, #idCodeCNU}
Du moment que la cardinalité est 1,1 et non pas 0,1, vous pouvez légitimement au niveau SQL conserver le lien direct entre MODULE et CNU, on reste dans la logique bivalente qui prévaut depuis la nuit des temps (NULL nécessite pour sa part une logique trivalente propre à ficher la patouille).
Envoyé par
sudtek
en fait on fait du tests de charges réel et orienté pour confirmer ou infirmer si la méthode choisie est adaptée.
Attention à bien choisir les requêtes et plus généralement les traitements que vous allez expertiser tout en sachant qu’il pourra y avoir conflit entre deux requêtes, donc arbitrage de votre part pour décider de la requête à privilégier...
Partager