MCD et XML

7 Optimisations par les contraintes

L'exploitation des contraintes n'est pas toujours facile. Plus généralement, il n'est pas possible de transformer toutes les contraintes, même les contraintes ensemblistes, en contraintes syntaxiques. Cependant, il y a certains cas exploitables que nous allons évoquer ici.

Dans ce paragraphe, nous n'étudierons uniquement que les contraintes ensemblistes simples. De plus, toutes les associations seront référencées par chacune des entités (malgré la redondance) et uniquement sous forme d'élément contenu (pas de référence à une association sous forme d'attribut). Cette contrainte alourdit un peu le document, mais ne change pas le fond.

7.1 Cas d'une contrainte pour une seule entité

Nous allons d'abord traiter le cas d'une contrainte basée sur une seule entité. Le traitement proposé précédemment donne :

EAP Générique - gestion d'une contrainte

Commençons par traiter le cas de l'exclusion. L'idée est que toute occurrence de A participe soit à des S1 soit à des S2. Il suffit donc de remplacer la succession "S2*, A-S1*" par la disjonction "S2* | A-S1*". Ce qui donne :

EAP Générique - gestion d'une contrainte d'exclusion

Prenons maintenant le cas de la totalité. L'idée ici est que toute occurrence de A participe au moins à l'association S1 ou à l'association S2. Ce qui pose un problème dans l'exemple est la présence des deux "*". Il se peut qu'il y ait un "A" ne participant pas à une association (c'est que toutes les cardinalités la concernant sont en "0.._"). Nous devons alors garantir que nécessairement, au moins une des deux associations soit utilisée. Il suffit donc de remplacer la succession "S2*, A-S1*" par la disjonction "(S2+, A-S1*) | (S2*, A-S1+)". Ce qui donne :

EAP Générique - gestion d'une contrainte de totalité

Remarque : une autre solution sera de poser : "(S2 | A-S1), S2*, A-S1*". Cependant, l'ordre d'apparition des associations (risque de trouver un "A-S1" puis des "S2" et à nouveau des "A-S1") risque de perturber l'exploitation du document.

Pour la partition, le traitement est assez simple, il suffit de mettre une totalité sur l'exclusion. Il faudra donc transformer "S2* | A-S1*" en "S2+ | A-S1+". Ce qui donne :

EAP Générique - gestion d'une contrainte de partition

Pour terminer, nous allons traiter le cas de l'inclusion. Dans notre exemple, cela signifie que toute occurrence de "A" qui participe à "S2", participe alors à "S1" (mais pas nécessairement l'inverse). Dans ce cas, le contenu de "A" évolue pour donner "A-S1* | (A-S1+, S2+)". Ce qui donne alors :

EAP Générique - gestion d'une contrainte d'inclusion

7.2 Cas d'une contrainte entre deux associations

Nous allons traiter le cas d'une contrainte basée sur une association binaire. Le traitement proposé précédemment donne par exemple :

EAP Générique - gestion d'une contrainte d'exclusion

La contrainte la plus facile à traiter dans ce cas est l'exclusion. Par contre, il faut que les éléments associés aux contraintes ne soient plus dépendants d'un seul élément associé à une des entités. C'est pour cela que, dans notre situation de départ, les associations sont en dehors et les éléments-entités font tous référence aux associations. Ainsi, dans le cas d'une inclusion, "S2" passe alors en contenu de "S1" et les références aux entités disparaissent (puisque "S1" les possède). Ceci donne alors :

EAP Générique - gestion d'une contrainte d'inclusion d'associations

Remarque : dans cette configuration, il faut être attentif au choix des identifiants de "S1" et "S2". Ceux-ci ne peuvent pas être uniquement faits à base des identifiants de "A" et "B", car ils seraient alors identiques. Une solution serait de concaténer les identifiants de "A" et de "B" et d'ajouter le nom de l'association pour les différentier.

Retour