Bonsoir Roswellus,
Vous écrivez :
Voici l'énoncé
Nom des cocktails - Boisson de base - Ingrédients
On peut formaliser cet énoncé en le structurant sous la forme d’un prédicat :
Le cocktail NomCocktail ayant pour boisson de base BoissonBase, est composé d’ingrédients Ingrédients.
A son tour, ce prédicat fait l’objet d’une variable relationnelle, schématisée par un nom de variable (Cocktail) et une liste de noms d’attributs (NomCocktail, BoissonBase, Ingrédients) :
Cocktail (NomCocktail, BoissonBase, Ingrédients)
Avertissement : Formellement, un attribut est un couple <Ai, Ti> où Ai représente le nom de l’attribut et Ti son type. Bien que le typage soit fondamental, on fera l’impasse dans le cadre de cette discussion.
Dans tous les sens du terme, chaque cocktail est unique, en vertu de quoi on l’identifie au moyen d’un (ou plusieurs) de ses attributs assurant la propriété d’unicité. En l’occurrence le nom du cocktail convient. Nous en prenons bonne note en soulignant NomCocktail :
Cocktail (NomCocktail, BoissonBase, Ingrédients)
Pour tenir compte des caractéristiques des ingrédients (à savoir la quantité des divers ingrédients entrant dans la composition d’un cocktail), nous complétons la liste des attributs :
Cocktail (NomCocktail, BoissonBase, Ingrédients(NomIngrédient, Quantité))
Là encore, il faut identifier chaque ingrédient sinon on pourrait avoir plusieurs fois le même ingrédient dans un cocktail, ce qui ne présenterait strictement aucun intérêt :
Cocktail (NomCocktail, BoissonBase, Ingrédients(NomIngrédient, Quantité))
Si l’on est dans le cadre de la théorie relationnelle, on peut en rester là (pour les initiés, la variable relationnelle Cocktail est en première forme normale).
Si l’on se situe dans le cadre de l’approche Entité/Relation (E/R), en l’occurrence la méthode Merise, l’attribut Ingrédients est réputé non normalisé, car il est multivalué. Pour prendre votre 1er exemple (le cocktail Passion), on a plusieurs ingrédients : jus de pamplemousse, gin, passoa, cointreau, sirop de sucre de canne. Merise demande que l’on rende monovalué ce qui est multivalué, pas de cocktail si je puis dire... (Toujours pour les initiés, la première forme normale de Merise n’est pas celle de la théorie relationnelle : pour cette dernière, une variable relationnelle est automatiquement normalisée. Cette théorie propose les opérateurs (Group/Ungroup) permettant, disons au sens de la méthode Merise, de dénormaliser/normaliser les relations, ce qui n’est pas prévu par celle-ci (attention, selon la théorie relationnelle, une relation est une valeur prise par une variables relationnelle, à ne pas confondre avec la relation (relationship) de la méthode).
En conséquence, si l’on veut se situer dans le cadre de l’approche E/R, la variable Cocktail est à décomposer ainsi : une première variable, toujours appelée Cocktail, mais débarrassée des ingrédients et une deuxième variable pour décrire ceux-ci :
Cocktail (NomCocktail, BoissonBase)
Ingrédient (NomCocktail, NomIngrédient, Quantité)
Vous observerez que le terme "Ingrédients" est désormais singulier : "Ingrédient". En effet, les énoncés portent désormais sur des données normalisées, atomiques, monovaluées. Par ailleurs, la variable Ingrédient est identifiée par le couple {NomCocktail, NomIngrédient} puisque le nom du cocktail doit évidemment être présent (sinon comment faire le lien entre un cocktail et ses ingrédients ?) mais ne suffit plus à lui seul. On dit encore que l’identification de Ingrédient est relative.
1 2 3 4 5 6 7 8 9 10 11 12 13
|
Cocktail (NomCocktail, BoissonBase)
Passion Gin, Liqueur fruit de la passion (passoa)
Téquila sunrise Téquila
Sangria Vin rouge
Soupe champenoise Champagne
...
Ingrédient (NomCocktail, NomIngrédient, Quantité)
Passion Jus de pamplemousse 4/10
Passion Gin 2/10
Passion Passoa 1/10
... |
Vous observerez que "Jus de pamplemousse", "Gin", etc. ne sont plus les éléments d’une liste, mais sont désormais des valeurs atomiques.
Concernant l’attribut BoissonBase, on pourrait faire observer que la valeur "Gin, Liqueur fruit de la passion (passoa)" n’est pas une valeur atomique et devrait donc aussi être atomisée en "Gin" et "Liqueur fruit de la passion (passoa)". Néanmoins, il s’agit là de la représentation d’une information à prendre comme un tout et donc non décomposable du point de vue du système.
Les concepteurs préfèrent identifier les variables par des attributs dont les valeurs ne sont pas susceptibles de changer au fil des corrections d’erreurs ou des caprices des utilisateurs. Aussi, utilisent-ils à cet effet des substituts qui sont des invariants. Ils ont bien raison. Imaginez cent tables de cent millions de lignes en moyenne, dont il faille remplacer des valeurs d’identifiants : si par exemple il s’agit du numéro INSEE et que l’INSEE vous envoie 10% de correctifs par mois : la production informatique peut exploser. Et puis, il peut y avoir des jumeaux parfaits quant à leurs propriétés naturelles (pas dans votre cas, en principe). En tout état de cause, la liste des attributs des variables Cocktail et Ingrédient peut évoluer, par intégration d’un attribut identifiant parfaitement stable, car non significatif, dont les valeurs sont des entiers (incrémentation de un en un, technique la plus courante, mais il existe d’autres procédés, par exemple l’utilisation d’horodateurs à la microseconde ou à la picoseconde, si votre système l’autorise). L’attribut NomCocktail est colorié pour montrer que de statut d’identifiant, il est passé à celui d’identifiant alternatif : l’attribut IdCocktail s’est substitué à lui, mais il reste contraint à être unique. Même principe pour l’attribut IdIngrédient, qui continue à participer à la contrainte d’unicité, couplé à IdCocktail. A noter que les valeurs de IdIngrédient commencent à 1 pour chaque cocktail : on procède en l’occurrence à une identification relative cf. plus haut).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
Cocktail (IdCocktail, NomCocktail, BoissonBase)
1 Passion Gin, Liqueur fruit de la passion (passoa)
2 Téquila sunrise Téquila
3 Sangria Vin rouge
4 Soupe champenoise Champagne
...
Ingrédient (IdCocktail, IdIngrédient, NomIngrédient, Quantité)
1 1 Jus de pamplemousse 4/10
1 2 Gin 2/10
1 3 Passoa 1/10
...
4 1 Cointreau 10cl
4 2 Champagne 1 bouteille
... |
Concernant la quantité des ingrédients : vos exemples mettent en jeu des proportions (le dixième, le huitième, ...), des unités de mesure (le centilitre, la bouteille), voire des indications approximatives ou vagues (quelques gouttes, fruits de saison...) Dans la mesure où vous souhaiteriez effectuer des opérations arithmétiques ou de comparaison sur des nombres, vous pourriez envisager la mise en œuvre d’un attribut Unité, en sorte que l’attribut Quantité ne prenne pas des valeurs telles que "10cl" ou "1 bouteille", mais les valeurs 10, 1, etc. en association avec l’attribut Unité ("cl", "bouteille", etc.) Attention quand même au problème délicat des indications approximatives et vagues, car elles ne sont pas concernées par les opérations arithmétiques.
Mais il existe 36 façons de traiter cela et vous risquez donc d’avoir à lire autant de messages donnant des solutions toutes plus intéressantes les unes que les autres : si cela vous convient, choisissez celle qui vous paraît la meilleure !
Par ailleurs, certains ingrédients sont utilisés simultanément pour des cocktails différents. Ainsi, le sirop de sucre de canne est utilisé pour le cocktail Passion et pour la soupe champenoise. Dans ces conditions, les concepteurs aiment bien définir une variable à cet effet, d’où les relations (valeurs de variables relationnelles) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
Cocktail (IdCocktail, NomCocktail, BoissonBase)
1 Passion Gin, Liqueur fruit de la passion (passoa)
2 Téquila sunrise Téquila
3 Sangria Vin rouge
4 Soupe champenoise Champagne
...
Ingrédient (IdIngrédient, NomIngrédient)
1 Jus de pamplemousse
2 Gin
3 Passoa
4 Sirop de sucre de canne
5 Cointreau
6 Champagne
...
Composition (IdCocktail, IdIngrédient, Quantité)
1 1 4/10
1 2 2/10
1 3 2/10
1 4 1/10
1 5 1/10
...
4 4 10cl
4 5 10cl
4 6 1 bouteille
... |
Schémas conceptuels
Il est d’usage de fournir un schéma conceptuel (Modèle conceptuel de données, MCD).
Sans "ronds", rien qu’avec des rectangles (ou quasi). En l’occurrence avec Toad Data Modeler (freeware). Ce schéma se lit ainsi :
Les rectangles représentent des entités-types indépendantes (qui ne dépendent pas d’autres entités-types).
Quand les coins sont arrondis, cela veut dire que l’entité-type est dépendante. Dans le cas de Composition, la dépendance est double et cette entité-type est alors dite associative.
L’entité-type indépendante Cocktail a pour attributs IdCocktail (identifiant) et NomCocktail.
L’entité-type indépendante Ingrédient a pour attributs IdIngrédient (identifiant) et NomIngrédient.
L’entité-type associative Composition a pour attributs IdCocktail et IdIngrédient, hérités des deux autres entités-types, tels que l’identifiant de Composition est composé du couple {IdCocktail, IdIngrédient} (équivalence avec l’identification relative évoquée plus haut). Elle a pour autre attribut Quantité.
Le trident à gauche signifie qu’un cocktail est composé de un à plusieurs (ingrédients), le trident de gauche signifie qu’un ingrédient entre dans la composition de zéro à plusieurs (cocktails).
Les deux petites barres verticales jouxtant les rectangles signifient qu’une composition donnée concerne au moins et au plus un cocktail et au moins et au plus un ingrédient.
Les termes PK et PFK signifient respectivement Primary Key et Primary Foreign Key mais peuvent être oubliés au niveau conceptuel, car ils concernent le niveau relationnel.
Version Merise :
La relation Composer remplace l’entité associative Composition. L’usage en Merise veut que pour nommer les relations, on utilise des verbes (Composer) plutôt que des noms (Composition). Les noms IdCocktail et IdIngrédient ne figurent pas dans la relation, ils y sont implicitement.
Comme ci-dessus, un cocktail est composé de un à plusieurs (ingrédients) et un ingrédient entre dans la composition de zéro à plusieurs (cocktails).
<pi> est l’abréviation de Primary Identifier et <ai> celui de Alternate Identifier (je suppose).
Je vous laisse le soin de vous occuper du dictionnaire des données.
Vous évoquez une matrice : il s’agit d’une matrice de quoi ?
Quant au graphe des clés : ce dernier terme ne fait pas partie du vocabulaire Merise. Cela dit, avec les identifiants évoqués plus haut vous disposez des éléments nécessaires pour dresser un inventaire.
Bon courage pour la suite.
Partager