Bonsoir Keizone,
Petite question subsidiaire, sur que tool vous faites vos démos de MCD ?
J’utilise PowerAMC en surchargeant les graphiques comme je l'ai déjà mentionné :
Envoyé par
fsmrel
Pour ma part, avec mon vieux Windows XP je fais des captures d’écran avec la touche « Impécr » et l’antédiluvien PAINT me permet de présenter des images lisibles.
Par contre le fait qu'il ne puisse commenter qu'une fois est géré en base j'imagine, au moment ou il reclick pour renoter, avec un "DELETE valor from RATE", puis "INSERT etc." grosso merdo, j'ai bon ?
Pour reprendre l’exemple de mon message précédent, Si x représente la note qu’Alberto (IdUser = 1) veut attribuer à l’article « Keizone s’éclate » (IdArticle = 9) :
— Soit Alberto n’a pas encore attribué de note (à ce propos, je vois que vos votes se raréfient... ), auquel cas il y aura un insert dans la table NOTER :
INSERT INTO NOTER (IdUser, IdArticle, Note) VALUES (1, 9, x) ;
— Soit Alberto a déjà voté, auquel cas (si la note change, tant qu’à faire) un UPDATE devrait suffire :
UPDATE NOTER SET Note = x WHERE IdUser = 1 AND IdArticle = 9 ;
Donc si je comprends bien je n'ai pas à me préoccuper des inclusions / exclusions à ce stade là de la conceptualisation.
Il faut au moins prendre conscience de l'existence de ces contraintes et les traduire sous forme de règles de gestion rédigées en français. Si on s’en sent capable il n’est pas inutile de les représenter dans le style Merise/2 (comme je l’ai fait à l'aide de « Magic » PAINT).
Par contre j'ai l'intention de faire mon MPD ensuite là et de générer ma BDD direct après, donc sans passer par le MLD donc si je comprends bien je ne verrai pas mes inclusions/exclusions matérialisées ^^.
He ? Une fois le MCD terminé, vous demandez à PowerAMC de produire soit un MLD, soit de sauter cette étape et de produire un MPD (au sens PowerAMC, ce qui ne veut pas dire que ce MPD ne soit pas un MLD, mais passons). Une fois ce MPD validé, vous demandez à PowerAMC de produire le code SQL de création des tables. En tout cas une chose est sûre, si vous voulez mettre en œuvre la contrainte d’exclusion, il faudra la programmer à l’aide d’un trigger, voyez par exemple ce message. Mais si vous décidez qu’un rédacteur peut s’auto-évaluer, vous n’en faites rien, c’est vous qui voyez... Quant à la contrainte d’inclusion que j’ai fait figurer dans le MCD (merci PAINT), je rappelle qu’au stade MLD elle est assurée par une contrainte référentielle.
Je vais utiliser MySQL comme SGBD, j'imagine que c'est conforme à la théorie relationnelle ?
Disons que la norme SQL elle-même n’est pas franchement conforme au Modèle relationnel de données (ou théorie relationnelle), elle ressemble moins au Prince charmant qu’à la Bête qui a un bon fond (voyez ici et un peu plus loin), par exemple, elle ne respecte pas le principe de l’information (Information Principle), parce qu’elle permet notamment l’utilisation de pointeurs et de marques NULL ; de son côté MySQL a des progrès à faire lui aussi avant d’être transformé en prince charmant (un ange passe...)
"If id_user not exists from USERS blablabla INNER JOIN id_article from ARTICLE INNER JOIN valor from RATE"
Blurps ? En français ?
Disons que je vais partir du principe que chaque table recueille deS donnéeS
Du singulier et du pluriel :
Un type d’entité (ou entité-type) est une classe d’entités ayant en commun un ensemble de propriétés. Le type d’entité USER symbolise l’utilisateur-type, lequel a pour propriétés (attributs) son nom, son prénom, son mot de passe, etc. Quant à eux, les utilisateurs proprement dits sont les entités, les instances (ou encore les occurrences) de la classe USER. Tout cela pour dire qu’un nom d’entité-type s’écrit de préférence au singulier : USER mais pas USERS. Comme vous risquez une collision avec les termes SQL (qui ne cause pas encore français ), je vous engage à remplacer « USER » par « UTILISATEUR »...
C’est comme pour les ensembles : on parle de l’ensemble N des entiers naturels (0, 1, 2, 3, ...) mais N est un nom propre donc au singulier bien qu’il contienne un nombre infini d’éléments...
C'est le moment qui m'a pris le plus de temps depuis notre dernière entrevue. Je suis du coup passé à la V3 de mon MCD. Sous vos conseils avisés, j'ai entrepris de décomposer mon entité USERS. Pas exactement comme votre exemple cependant.
Je me doute que le cerveau a dû fumer... Je ne vois pas grand-chose à redire, sinon que si vous ne sentez pas trop l’intérêt de l’entité-type zombie STAFF, vous la passez au rasoir du gars Ockham qui a dit qu’il était inutile de multiplier les entités sans nécessité : Pluralitas non est ponenda sine necessitate (principe de parcimonie). Si un jour l’existence de l’entité-type STAFF se justifiait, il ne serait pas difficile de la mettre en œuvre.
Je vous laisse seul juge de ma progression et surtout de mes erreurs. Dites moi ce que vous en pensez.
Ça progresse, petit à petit l’oiseau fait son nid. Toutefois l’oiseau aura à intérêt à bien comprendre ce qu’est une association ternaire !
Prenons l’exemple de RATE :
Traduction façon Masterchef :
Pour remplir la casserole RATE, il faut touiller ensemble au moins un article, un membre et un invité.
Sous forme prédicative :
Le membre M et l’invité G doivent conjuguer leurs efforts pour attribuer la note N à l’article A.
Exemple :
RATE (MEMBRE GUEST ARTICLE NOTE)
Alberto Raoul Keizone s’éclate 5
Alberto Paul Keizone s’éclate 4
Alberto Jean Keizone s’éclate 4
Bernard Raoul Keizone s’éclate 5
Or que je sache, un membre (ou un invité) n’a besoin de l'aide de personne pour noter un article, vous rendez dépendantes des données qui ne le sont pas ; pour les initiés il y a ce qu’on appelle un viol de quatrième forme normale (horresco referens !)...
Il faut détricoter tout ça et modéliser ainsi :
[MEMBER]----0,N----(RATE_M)----0,N----[ARTICLE]----0,N----(RATE_G)----0,N----[GUEST]
N.B. La présence dans l’association RATE de l’attribut nb_rate fait que cet attribut a le sens suivant : combien de fois Alberto a-t-il noté l’article « Keizone s’éclate » ? Normalement la réponse est : une fois (ça sent le rasoir d'Ockham)... Par contre, si on veut savoir combien de fois cet article a été noté, on utilisera l’opérateur d’agrégation COUNT :
SELECT COUNT(*) FROM RATE WHERE id_article = 9
Divers
— Les sous-types héritent de l’identifiant de leur surtype, donc les attributs id_member, id_guest, id_staff, id_admin n’ont pas lieu d’être, et doivent passer au fil du rasoir....
— Avec PowerAMC, cochez la case « O » (obligatoire) pour les attributs des entités-types, sinon le bonhomme Null viendra ficher la patouille dans la base de données :
Allez Keizone, ça avance, courage !
Partager