André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Modèle navigationnel (Mnav) Transformation du diagramme de classe UML en un modèle navigationnel pour un passage à l’objet André Gamache, professeur associé Département d'informatique et de génie logiciel Faculté des sciences et de génie Université Laval. Québec, Qc, Canada, G1K 7P4 Courriel: [email protected] 2015-04-07 © Module 2 page Modèle navigationnel © 1 Notions d’objet Objet physique : objet matériel concret de la vie ou symbolique ayant des attributs de volume, de poids, de matière, de fonctions, de forme, d’apparence, … Exemples: un avion, un moteur, une ouvre d’art, une photo, …, une réaction moléculaire, … Objet informatique: représentation des attributs de l’objet physique par une structure informatique disponible par un langage, construit de toute pièce ou une structure de stockage: entier, réel, struct, fichier, … Exemples: un vecteur de valeurs, une struct complexe, un fichier jpeg, … Objet informatique complexe: un objet informatique auquel est associé impérativement toute manipulation ou transformation de l’objet au regard de contraintes fortes et élaborées. Exemples: les plans vectorisés d’un avion et les traitements de création, mise à jour, rotation, translation, coloration, … Module 2 page Modèle navigationnel © Page 1 2 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Comment passer du conceptuel au modèle objet ? La passage du diagramme de classe de UML à l‘Objet est rendu facile par le modèle dit navigationnel (un outil didactique pour le niveau conceptuel) inspiré de la notation proposée par Christian Soutou (1). Le système à base d’objets va alléger les lacunes signalées dans le module 1, mais pas toutes! C'est un passage utile pour des fins didactiques seulement. Ce modèle Mnav joue le rôle de pivot ou d'étape entre le diagramme de classe de UML et le modèle d'implantation objet. Le Mnav ne remplace pas la vérification et le renforcement des contraintes du modèle, lesquelles devront être prises en charge par les méthodes spécialisées de chaque interface de classe. Le Mnav fournit une structure qui incorpore explicitement certaines contraintes du modèle mais pas toutes! (1) Notation graphique proposée par C. Soutou, Objet-Relationnel Eyrolles1999 Module 2 page Modèle navigationnel © 3 Modèle navigationnel (Mnav) Objectifs du Mnav • Faciliter le passage vers l’Objet par un ensemble de règles de transposition : Diagramme de classe‐UML => navigationnel => Objet • Favoriser la visualisation des structures complexes et des chemins de navigation possibles en conservant la notion d’objet. • Représenter concrètement le plus de contraintes possibles pouvant être spécifiées par le langage DDL du SGBD. Lacune du Mnav : • Devient rapidement encombré et encombrant pour des modèles complexes!!! • Ne représente pas bien le partage des types entre différentes parties d’un modèle UML (classes) complexe. Pourquoi le navigationnel ? Le modèle introduit les liens de type REF (implémentation avec l’oid + autres informations) entre les classes UML. Module 2 page Modèle navigationnel © Page 2 4 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Quelque définitions clés du Mnav Classe externe La classe UML sera rendue dans le Mnav par une classe dite externe qui est en quelque sorte au plan informatique un type (i.e. une structure nommée) défini par ses attributs. Une classe externe définit des objets autonomes (dont l’existence ne dépend pas d’un autre objet) dans la base i.e. possède une valeur + un oid qui rend l’objet persistant. Un oid est un identifiant d’objet unique, non réutilisable pour toute la vie de la base. Un objet ayant un oid est persistant dans la base. Classe interne Une classe interne est une classe capable de définir des objets mais sans oid dont la persistance exige son imbrication dans un objet d’une classe externe. La classe interne et externe sont nommées et ont une interface. Module 2 page Modèle navigationnel © 5 Les attributs du Mnav Attribut simple: L’attribut simple est idem à celui de UML: type atomique avec ses opérations primitives régulières et implicites: ex. un entier avec ses opérateurs arithmétiques valides une chaîne avec son opérateur de concaténation, … Attribut complexe L’attribut complexe permet d’abandonner la forme FN1 en ajoutant une structure de tuple pour regrouper plusieurs attributs éventuellement de types différents. (struct) L’attribut complexe a un type mais aucune méthode de traitement associée. Module 2 page Modèle navigationnel © Page 3 6 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Lien simple interne ou externe Lien simple: Un lien est établi entre un attribut et une classe interne ou externe : Un lien simple associe une valeur d’un attribut à 1 objet de la classe interne ou externe. Employe: nasE : int lien interne simple nomE : string specialite: Ce lien peut être vide (rond blanc) ou obligatoirement valué par un oid (rond noir) Module 2 page Modèle navigationnel © 7 Lien multiple Lien multiple: Un lien multiple est établi entre un attribut et une classe interne ou externe : Un lien multiple pour un attribut associe ce dernier 0 ou plusieurs objet de la classe interne ou externe. Employe: nasE : int nomE : string lesSpecialites Lien interne multiple Ce lien peut être vide (rond blanc) ou obligatoirement valué (rond noir) Module 2 page Modèle navigationnel © Page 4 8 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Attribut complexe: tuple et ensemble/classe externe et interne Tuple Le tuple est une structure logique linéaire formée d’attributs simples ou complexes mais sans interface. Un attribut complexe définit des valeurs dont l’existence dépend que de l’objet externe qui les héberge. Il est représenté par une structure non nommée et sans interface. Ce n’est pas une classe interne mais uniquement une structure pour y ranger des valeurs. Employe: Exemple d’un attribut de type complexe associée à une structure de tuple. nasE : int C’est un tuple et non une nomE : string classe interne car sans interface et sans nom de classe laSpecialite: représentation graphique specPrinc: string sans interface anExp : number date: Date Un employé a une spécialité définie par 3 attributs L’attribut « laSpecialite » est associé à une structure de tuple (similaire à une struct). Module 2 page Modèle navigationnel © 9 Attribut associé à un seul objet Un attribut associé à un seul objet d’une classe est représenté par un lien simple vers une classe interne. Le nom de la classe avec les : , annonce le type de la classe normalement constituée du nom suffixé par _t _t Employe: employe_t nasE : int nomE : string Classe interne nommée et dotée d’une interface Ex O2: laSpecialite: Specialite:specialite_t nasE : int spec: string nomE : varchar annee : Date laSpecialite: Specialite Dans cet exemple, l’attribut laSpecialite est obligatoirement valué par un objet qui caractérise chaque Employe et est imbriqué dans la classe externe Employe. Cet objet a une interface et une persistance. Module 2 page Modèle navigationnel © Page 5 10 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Attribut d’ensemble ordonné d’objets (v) Un attribut d’ensemble ordonné d’objets est rendu par un lien interne multiple concrétisée par une structure de type varray. Employe: Classe interne de type ensemble rendue par une structure varray nasE : int nomE : string lesSpecialites v Les éléments de l’attribut lesSpecialites sont stockés dans un varray (similaire à un tableau ou un array). Chaque entrée est indexée et peut-être soit une valeur soit un objet interne. Le varray a des attributs propres qui pourraient être considérés comme des fonctions prédéfinies et non modifiables. Module 2 page Modèle navigationnel © 11 Attribut d’ensemble non ordonné d’objets Un attribut d’ensemble d’objets est rendu par un lien interne multiple vers une classe interne. Employe: nasE : int Classe interne de type ensemble. nomE : string lesSpecialites lesSpecialites est un ensemble { } d’objets internes non vide. Chaque objet est associé à l’interface de la classe interne. Module 2 page Modèle navigationnel © Page 6 12 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Persistance d’un objet La notion de persistance a trait à la capacité d’un objet de devenir permanent dès sa création par une application. Certains objets ne sont pas persistants à leur création (objet de travail) tandis que d’autres le sont car ils sont intégrés dès leur création dans un containeur d’objets ou dans un autre objet persistant qui leur confère une persistance. Chaque objet persistant est obligatoirement associé à un oid généré par le système. Implantation de la persistance BD Un objet est créé en RAM par une application et devient persistant s’il est transféré dans la cache du serveur. En cas, de panne du serveur un objet persistant encore en cache doit survivre grâce aux techniques des journaux externes du SGBD (Rollback segments de Oracle): L’écriture d’un objet n’est pas nécessairement réalisée immédiatement pour des raisons de performance mais est toujours accompagné d’une écriture dans un journal interne ou externe à la base du recouvrement (voir la notion de rollback). Ceci garantit la persistance. ‘ Module 2 page Modèle navigationnel © 13 Passage de UML au Relationnel Modèle UML: les classes UML sont des concepts logiques apparentés à la notion de type (avec la technologie Oracle). Employe: Atelier: noA* : int nomA : string 0..* 0..1 Embauche > nasE*: int nomE: string metierE: string Conventions: * == 0..* 1 == 1,1 Le MR privilégie la notion de table en sous‐tendant la structure de tuple. Atelier (noA*, nomA) FN3; FN4:FN5 Employe (nasE*, nomE, metierE, noA) FN3; FN4:FN5 Rappel: Dans le MR, la normalisation est appliquée jusqu’en FN3 (ou mieux en FNBC) pour éviter l’incohérence. Idéalement, il faudrait avoir des relations en FN5 pour éviter certaines et dernières anomalies de mise à jour. Ces dernières anomalies sont cependant rares et leur évitement par un éclatement poussé des relations n’est pas toujours justifié. Important: on énonce qu’un employé a UN seul métier pour justifier la FN3. Module 2 page Modèle navigationnel © Page 7 14 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Passage de l’UML Atelier‐Employe au Mnav Atelier: Lien externe multiple représente le type ensemble (set) pour l’attribut lesEmbauches et est formé de oids des objets de type employé. noA* : int nomA : string * lesEmbauches: La multiplicité 0..* est explicitement représentée Employe: * lesEmbauches nasE*: int Classe externe de type objet nomE: string metierE: string L’association UML est rendue par un lien externe qui utilise une référence pour associer un ou plusieurs objets de la classe Employe. La multiplicité minimale 0 du côté Atelier est représentée par le cercle blanc. La multiplicité minimale de 1 le serait par le rond noir. Module 2 page Modèle navigationnel © 15 En l’absence d’un attribut d’association Atelier: noA* : int nomA : string lesEmbauches: lesEmbauches est un attribut d’ensemble dont les éléments sont des oids et non des objets. Ces derniers étant rangés dans le containeur de la classe externe Employe. La spécification de lesEmbauches peut être en principe un ensemble de type set, list, bag, table, … Employe: nasE*: int nomE: string metierE: string lesEmbauches est un attribut d’ensemble ayant un type d’ensemble et dont les éléments sont des objets internes ou des oids référant à des objets externes. Module 2 page Modèle navigationnel © Page 8 16 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Autre représentation du modèle Atelier‐Employe (sans attribut) Atelier: noA* : int nomA : string lesEmbauches: OidEmploye: L’attribut lesEmbauches est associé par un lien interne à un ensemble d’oids, chacun référant à un d’objet externe. Pour simplifier la représentation, cette table d’objets internes peut être enlevée du modèle graphique. refEmpl Employe: nasE*: int nomE: string metierE: string Module 2 page Modèle navigationnel © 17 Traversée du Mnav au moyen du lien simple Pour faire des recherches il faut parcourir l’association UML donc exploiter le lien externe simple avec SQL: 1‐ Quels sont les employés qui travaillent dans l’atelier 120? Le lien externe multiple permet de répondre à ces questions sans avoir à formuler explicitement une jointure. Sélection de l’atelier 120 fournit l’ensemble des oids dont chacun permet de référer à l’objet de Employé associé. Select {oid de employé} from Atelier a where a.noA =120 2‐ Quel est l’atelier où travaille l’employé dont le nasE est 50? Il faut afficher l’objet Atelier dont l’attribut lesEmbauches renferme l’oid du nasE 50. select a.noA from Atelier a Where ( oid de l’employe de nasE =50) ) IN (les oids de l’ensemble des employés de Atelier); Module 2 page Modèle navigationnel © Page 9 18 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Ajout d’un attribut d’association: classe interne et lien multiple Atelier: noA* : int ** L’attribut lesEmbauches désigne un ensemble d’objets de la classe refEmploye dont la définition comprend un attribut d’association: dateEmbauche nomA : string lesEmbauches: Nouvel attribut possible Employe: refEmploye: refEmpl nasE*: int dateEmbauche nomE: string metierE: string Ce modèle représente l’embauche à une certaine date d’un employé par un atelier. Module 2 page Modèle navigationnel © 19 Renforcement de la 2e multiplicité : 0..1 du côté Atelier? Lien externe multiple pour représenter le type ensemble (set). Aucun sens de parcours privilégié. Atelier: noA* : int nomA : string lesEmbauches: Employe: Classe externe de type objet nasE*: int nomE: string metierE: string refAtelier Boucle interdite: Pour définir l’objet Employe, il faut se référer à l’objet Atelier dont le type sera incomplet car il réfère par son lien multiple à un ensemble d’objets dont le type est déjà incomplet. Module 2 page Modèle navigationnel © Page 10 20 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Renforcement de la contrainte 0..1 du côté Atelier Comment faire? Par les méthodes : *- Prévoir la vérification de toutes les contraintes par une méthode exécutée dans une transaction avec synchronisation et validation des diverses modifications faites sur les données. Module 2 page Modèle navigationnel © 21 Représentation de Atelier‐Employe sans classe externe Atelier: noA* : int La classe UML devient une classe externe ou un type externe avec 3 attributs. nomA : string lesEmbauches: Employe : Attribut d’ensemble référant à des d’objets d’une classe interne. nasE: int nomE: string metierE: string modifNomA( ) Lien interne de type ensemble pour modéliser l’association 0,* (pointe double). Ce lien sous-tend l’imbrication des objets Employe dans un objet Atelier. Classe interne de type objet Mnav représente visuellement et directement les données complexes sans exiger la normalisation des structures de 1er niveau. Caractéristiques de ce modèle: accès direct à un atelier et à ses employés; Sauf: la multiplicité du côté Atelier : En créant un employé il faut aussi obligatoirement créer au préalable un Atelier : (1..1) du côté Atelier Module 2 page Modèle navigationnel © Page 11 22 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Représentation multiple pour un modèle Pour un même modèle UML il peut dont y avoir plusieurs modèles Mnav possibles. Comment choisir? Le plus complexe n’est pas nécessairement le pire comme le plus simple le meilleur. Critère de choix: Le choix se fera entre plusieurs représentations de la même réalité sur la base de l’efficacité des principales opérations à mettre en œuvre pour effectuer les traitements lourds. L’importance relative des questions est aussi à prendre en compte (mais souvent difficile à estimer). Il faudra souvent attendre de connaître les structures physiques utilisées pour l’implantation du modèle pour faire un choix judicieux! Module 2 page Modèle navigationnel © 23 Réification : construction d’un objet [informatique] Un objet est structuré par l’entremise de son constructeur. Après sa création un objet peut acquérir un oid le rendant persistant. Quel est le constructeur? Chaque classe externe, interne a un type qui porte le même son nom suffixé par _t : L’objet :employe := [ 234, ‘Paul’, 34, 85, ...] ∊ classe de type employe_t Avec Oracle, cet objet est construit avec le constructeur qui porte le nom du type: employe_t ( 234, ‘Paul’, 34, 85, ...) L’objet construit est rangé dans son extension ou son containeur qui est une tableobjet de Oracle et devient alors persistant, acquérant un oid. L’extension peut être toute autre structure de type ensemble utilisée avec d’autres systèmes: list(), bag(), set(), …. Module 2 page Modèle navigationnel © Page 12 24 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Résumé des conventions d'écriture pour le Mnav La notion de classe externe correspond à une structure de données complexe équivalente à la classe UML. La classe interne est aussi un type ou une structure de données mais imbriquée dans une classe externe. Elle peut représenter une structure d’ensemble ou de tuple selon la nature du lien (multiple ou simple) Le lien externe est de type REF représente une référence logique sans égard à leur implantation physique. Le lien peut-être simple ou multiple et réfère à des objets. Les objets d’une classe interne sont dits objet-colonne. Par convention: Le nom d'une classe externe commence par une lettre majuscule : Employe Le nom d'un attribut ou d'une méthode commence par une minuscule: matriculeE. Ce nom n'a pas d'accents, ni autres symboles orthographiques; Le nom d'une association UML commence par une majuscule : EffectueS; Module 2 page Modèle navigationnel © 25 Ensemble vide: création et suppression des objets Atelier : atelier_t noA : int nomA : string lesEmbauches : Employe: nasE : int nomE : string metierE : string La référence non obligatoire suppose que l’ensemble peut être vide, i.e. il peut y a voir un atelier sans employé! La suppression du dernier employé d’un atelier n’implique pas la disparition de ce dernier! Les opérations(méthodes) Attribut lesEmbauches est un lien interne multiple sur des objets internes (sans oid) de Employe (objet-colonne de Oracle) inclus dans la classe Atelier. Module 2 page Modèle navigationnel © Page 13 26 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Information ajoutée par la référence obligatoire (ou non vide)? Atelier : noA : int La référence obligatoire impose qu’un atelier à sa création a obligatoirement au moins 1 employé. nomA : string lesEmbauches : La suppression du dernier employé sous-tend la suppression de l’atelier. Employe: nasE : int ** Source d’incohérence si l’atelier n’est pas supprimé avec la suppression du dernier employé. nomE : string metierE : string Les opérations Dans cet exemple, le lien interne multiple représente un ensemble d’objets internes nommé lesEmbauches. En Oracle cet ensemble imbriqué correspond à une sous-table . Module 2 page Modèle navigationnel © 27 Représentation (Oracle) TABULAIRE du lien interne multiple Atelier: noA: string A20 Nested Table A30 {lesEmbauches} ou lesEmbauches: { } nomA: string nasE : int nomE: string metierE: string 123 Arthur fraîseur 234 Sylvie tourneur 256 Pierre perceur 456 Serge ponceur Atelier B Atlier C Avec 2 collections (sets) Cette vision de la classe instanciée repose sur la notion de table comme containeur. La table Atelier a un attribut d’ensemble, lesEmbauches tune soustable (imbriquée) formée avec les attributs typés : nasE, nomE, metierE. Module 2 page Modèle navigationnel © Page 14 28 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Lien externe : avec le type REF La navigation entre les classes externes se fait avec un lien défini par un attribut de type REF. Le lien externe spécifie une référence à un objet (matérialisée par un oid ou l'équivalent). L’oid n’est pas une adresse physique mais le deviendra lorsque l’objet sera transféré dans la cache du serveur d’objets (swizzling ou mutation de la référence). Il est possible de contraindre le lien REF pour le limiter à cibler qu’une sorte d'objets (via la REF) et au besoin à être null (attribut scopé avec le SCOPE) Objets associés à des adresses physiques de la RAM Cache en RAM Adr_RAM oid Espace exécution du SGBD oid + objets Module 2 page Modèle navigationnel © 29 Inconvénient du Mnav: partage difficile d’une classe interne Atelier: adresse_t noA : int Domicile:domicile_t nomA : string paysD : string adresseA : Adresse: no: int rue: Ville: adresseD: (mais sous-entend un oid pour adresseD?? Or les objets de Adresse n’ont pas de oid!) Le partage d’une classe interne avec plusieurs autres classes externes est difficile à représenter dans le Mnav : partage de Adresse par les classes Atelier et Domicile. Possibilité d'utiliser une astuce comme un lien fait d'un pointillé ?? Devient rapidement lourd avec plusieurs partages dans de gros modèles ! Module 2 page Modèle navigationnel © Page 15 30 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Résumé: attributs et liens du Mnav Un attribut peut être: • • • • • Simple (chaîne de caractères, nombre, …) Composé (complexe) avec une structure de tuple [..] Une référence (logique et basée sur l’oid : Ref) Collection ou un set (d’objets ou des références) Combinaisons des types précédents : TAD (Type Abstrait défini par l’usager) Lien interne et externe: Externe (inter): entre deux classes externes (explicite) incluant un ou des valeurs de Ref. C'est un lien navigationnel. Ex.: Oracle : un attribut de type REF. Interne (intra): à l'intérieur d'une même classe externe et donnant accès représentant une structure de tuple; c'est un lien non‐navigationnel ‐‐ (avec Oracle: ce lien référence un objet‐colonne, OC, intégré dans la classe externe; Module 2 page Modèle navigationnel © 31 Lien simple et multiple (sommaire) Un lien simple peut être: 1. Interne: pour associer à un attribut ayant une valeur complexe ou à un objet d’une classe interne (avec son interface) 2. Externe: pour associer un objet à un seul objet externe appartenant à une autre classe. Un lien multiple (sous‐tend l’ensemble*) associe un objet à plusieurs instances d’un objet regroupé dans un ensemble (ordonné ou pas) 1. Interne multiple pour associer plusieurs objets‐colonnes inclus dans la classe interne. 2. Externe multiple pour associer plusieurs objets autonomes référés via un ensemble de oid *En Oracle, un ensemble est une collection (terme générique pour Oracle!). Module 2 page Modèle navigationnel © Page 16 32 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Avantages escomptés du modèle navigationnel (Mnav) Le passage du DC‐UML vers le modèle objet est plus simple via le Mnav surtout avec les petits modèles UML . Favorise un choix plus judicieux des liens entre les classes d’objets en prenant en compte les accès anticipés; Une description plus explicite des associations La visualisation des chemins par les liens rendant (souvent) plus facile la formulation des requêtes complexes multi‐classes; Module 2 page Modèle navigationnel © 33 Inconvénients du modèle navigationnel Le partage d'un même type par plusieurs classes n'est pas représenté simplement voire adéquatement. Il demeure possible (mais déconseillé ) de débuter la conception d'une base objet par l'élaboration directe d'un schéma navigationnel, donc sans DC‐UML. Danger de simplification ! C'est un modèle didactique … dont il faudra abandonner par la suite! Peut être parfois plus difficile de raisonner avec le Mnav complexe que de le faire le modèle relationnel, notamment pour les mises à jour des attributs de type ensemble. Toutes les contraintes du diagramme de classe ne sont pas implémentées implicitement par une structure du Mnav. Etape non essentielle ajoutée : passage direct du DC‐UML vers l’objet est possible sans transiter par le modèle Mnav. Module 2 page Modèle navigationnel © Page 17 34 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Sommaire des symboles Lien simple Lien simple Lien simple pouvant être null (facultatif) Lien simple obligatoirement valué* (not null) ** L’absence de cercle signifie obligatoire Avec les liens interne et externe : Classe C1 Classe C1 attrib_Cle attribClé attrib1 attrib1 struct *Valuation: signifie donner une valeur à un attribut La valuation de attrib1 donne une valeur représentée par la struct interne ou celle correspondant à un objet de la classe externe. Module 2 page Modèle navigationnel © 35 Sommaire des symboles Lien multiple Lien multiple Lien multiple pouvant être null (ensemble pouvant être vide) Lien multiple obligatoirement valué (ensemble obligatoirement non vide) ** L’absence de cercle signifie obligatoire Avec les liens multiples Classe C1 attrib_Cle interne et externe : Classe C1 attribCle attrib1 attrib1 Classe int. La valuation de attrib1 donne un ensemble de valeurs . Classe externe Module 2 page Modèle navigationnel © Page 18 36 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Suite : Sommaire de la représentation graphique (1) Dans un Mnav, le lien simple est représenté par une flèche simple () et le lien multiple par une flèche a double pointe. Le lien interne (intra) associe un attribut de structure complexe participant à la définition de la classe hôte et dont les données sont intégrées dans l’objet hôte. Le choix entre un lien interne ou externe est basé sur des considérations d'exploitation : efficacité et le sens privilégié de la navigation exprimé par la flèche dans le diagramme de classe UML. En bref: le lien externe évite la formulation explicite des jointures par l’application, mais peut rendre les mises à jour et les ajouts plus complexes : les Ref doivent être ajoutées et des contraintes sur les Ref doivent être gérées correctement. Le lien Interne facilite la suppression des objets : suppression d'une instance de Chercheur entraîne celle de Adresse (son adresse). Module 2 page Modèle navigationnel © 37 Cascade de liens dans le modèle navigationnel (Mnav) Représentation explicite par les liens externes: des structures de données complexes, des hiérarchies et des agrégations; Atelier: atelier_t Le type { } est sous-entendu par le lien externe multiple noA*: int Employe: employe_t nomA : string nasE*: string lesEmbauches nomE : string refMetier lesEmbauches est le nom d’un ensemble de références (oid) Les opérations At Em Me Création 1 objet 2 3 1 mise à jour 1 objet 2 2 1 Suppression 1 objet 1 2 2 Metier: metier_t noM*: int corpoM: int cotisation: real La difficulté est évaluée au regard de la gestion des liens. Module 2 page Modèle navigationnel © Page 19 38 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Cascade d’associations UML: 1..* ‐ 1..* (liens) Region: 1..* 1..1 noR*: int Ville: nomV: string Reunit > nomR : string (Interface) (Interface) Formée > L’insertion d’une région ne peut pas se faire sans celle d’au moins une ville laquelle ne peut pas être créée dans la base sans la création d’au moins un arrondissement. 1..1 1..* Arrondis: nomA: string presA: string popA: int (Interface) Pour y arriver il faudra retarder la vérification des contraintes de ce modèle géré par le SGBD. Module 2 page Modèle navigationnel © 39 Mnav avec deux liens externes Region: region_t noR*: int La multiplicité 1..1 du côté Region sera renforcée par la méthode d’ajout d’une ville afin de vérifier qu’il y a obligatoirement une région associée à une ville au moins un arrondissement. Le lien renforce la contrainte qu’une région est obligatoirement associée à au moins une ville. nomR:string lesVilles: Ville:ville_T ? R V A création 2 2 1 mise à jour 2 3 2 Arrondis: suppression 1 3 2 nomA: string presA:string popA: int nomV*: string lesArrondis: delaRegion AjoutV Trois classes, cela sous-tend normalement un stockage des objets dans des tablespaces de Oracle différents, ce qui peut alourdir l’exploitation. Module 2 page Modèle navigationnel © Page 20 40 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Pourquoi ne pas définir aussi un lien inverse? 2e Ce lien de Ville vers Region (delaRegion) serait pratiquement inutile s’il n’est pas justifié par le parcours privilégié du lien. Exemple avec un lien inverse ajouté: Ajout du lien delaRegion dans Ville: - créer un 1er lien de Region vers Ville avec l’insertion d’une REF. Region: region_t Le parcours préférentiel d’une association détermine la nature du lien à privilégier. noR*: int nomR:string lesVilles: Ville:ville_T nomV: string lesArrondis: ? Select r.nomR From Region r delaRegion Where (oid de la ville dont le nomV = ) IN lesVilles AjoutV Module 2 page Modèle navigationnel © 41 Mnav avec deux liens : externe et interne Avec un lien interne entre Ville et Arrondis. Cela sous-tend que les objets de Arrondis sont stockés dans les pages de l’objet de Ville associé. Region: region_t En découle une plus grande performance dans l’accès aux arrondissements. noR* : int Ville: ville_t nomR : string nomV : string lesArrondis lesVilles: R V création 2 3 Mise à jour 2 2 suppression 2 2 Arrondis: nomA: string presA: string popA: int L'attribut lesVilles est une collection ou set() de oids (ref) sur les objets de la classe externe Ville. Module 2 page Modèle navigationnel © Page 21 42 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Mnav avec deux liens et imbrication des classes Region: region_t noR*: string nomR: string lesVilles: Ville:ville_t nomV* : int lesArrondis: Arrondis: Le lien est interne et multiple pointant sur une classe interne ce qui sous-tend un ensemble. Par contre ce Mnav ne permet pas d’avoir une ville sans qu’elle soit associée à un une région. La contrainte 1..1 est renforcée par ce modèle navigationnel. La suppression d'une instance de Region entraîne aussi celle de ses villes et arrondissements. Impact au niveau de la performance? Quels sont les arrondissements de la région R1? nomA*:string R V A création 3 2 1 presA: string mise à jour 3 2 1 suppression 1 2 2 lecture 1 2 3 popA: int Module 2 page Modèle navigationnel © 43 Modèle UML CSP Chercheur: noC*: string nomC: string 0..* 1..1 Gere > Subvention : noS : int nomPgm : string Finance > 0..1 1..* Projet : projet_t noP* : int montant : real organisme : string La suppression d'un objet Chercheur nécessairement la suppression de sa subvention entraîne (si elle existe) mais pas des projets qu’elle finance. Module 2 page Modèle navigationnel © Page 22 44 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Combinaison de lien interne simple et externe multiple Chercheur: noC*: string nomC: string lesSubventions: L’ajout d’un chercheur peut se faire sans subvention ni projet. Si le chercheur a une subvention, celle-ci est obligatoirement associée à 1 ou plusieurs projets. Subvention : noS : int nomPgm : string lesProjets Projet: noP* : int montant : real organisme : string C P création 2 1 Mise à jour 2 1 suppression 1 2 Le dernier projet ne pourrait-être supprimé sans faire disparaître la subvention obtenue; sinon il y a violation de la contrainte sur le lien externe. Si une subvention est supprimée, le chercheur ne l’est pas de facto. Idem pour Projet Module 2 page Modèle navigationnel © 45 Mnav avec deux liens externes et multiples Chercheur: Projet: noC*: string noP* : int nomC: string montant : real lesSubventions: organisme : string Subvention : noS : int nomPgm : string lesProjets Avec ce modèle il devient plus difficile d’obtenir le chercheur travaillant sur un projet subventionné particulier. La suppression du dernier projet entraîne celle de la subvention mais pas celle du chercheur. Module 2 page Modèle navigationnel © Page 23 46 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Les interfaces dans un Mnav Les classes externe et interne peuvent avoir leur propre interface. Avec la technologie Oracle: • L’interface d’une classe externe permet le traitement des objets de table (OT). • L’interface d’une classe interne permet le traitement des objets imbriqués (objetscolonnes (OC)). Dans les deux cas: objets à part entière: interface et persistance. Module 2 page Modèle navigationnel © 47 Les interfaces dans un Mnav Logiciel: Departement: nomL* : string versionL: int editeurL: string lesInstallations: noD*: int nomD: string adresseD: lesLogiciels: budget : real Installation: datateI: string Adresse: refPosteI: rue : string ville : string installerLog(…) creerDep achatLogiciel(…) PC: Dans un modèle les signatures sont identifiées globalement comme une interface: avec Oracle, l’interface n‘est pas nommée. L’interface est factorisée au regard des instances et rangée dans le dictionnaire de la base, lui-même structuré en objets. Modèle navigationnel © Page 24 noSerie*: int adrIP: string cpu: string installerPC(…) brancherPC(…) Module 2 page 48 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Accès aux objets ou aux données ? En phase d’exploitation, l’application peut faire une recherche et obtenir soit un objet soit les valeurs de l’objet en provenance de la base de données. Cas 1: La recherche renvoie à l’application des objets que celle-ci doit stocker dans une structure d’objet préalablement définie par l’application. Ces objets peuvent ensuite être traités par les méthodes propres à l’application par le programme JAVA, C++, … Cas 2: La recherche renvoie que les valeurs des objets trouvés par la SGBD. Ces valeurs sont stockées dans des variables typées locales à l’application. Le traitement se poursuit et se fait par l’application. Pour obtenir que ces valeurs avec une BDOO de Oracle: il faut souvent aplatir les tables contenant les objets-colonnes. C’est le unnesting des objets qui se fait par le SGBD sur le serveur avec SQL. Module 2 page Modèle navigationnel © 49 Classe interne et UnNesting (sous‐table) Une classe interne avec un lien multiple incident correspond à une sous-table dans une vision tabulaire des données. Pour avoir accès aux données des objets de la classe interne avec SQL, donc aux données de la sous-table avec celles de l’objet externe associé , il faut faire une opération spéciale de unNesting. Ce traitement ramène les objets-colonnes (les objets de la classe interne) au 1er niveau, exploitables directement par SQL (et les curseurs de PL/SQL) comme des valeurs (et non comme des objets). Depart: Depart: noD: int noD: int nomD: varchar lesEmpl Unnest Empl: noE : int Depart noD nomD lesEmpl.noE lesEmpl.nomE nomD: varchar lesEmpl.noE : int lesEmpl.nomE: varchar nomE: varchar Select d.noD, e.noE From Departement d, Table(d.lesEmpl) e Select lesEmpl Where d.Empl.noE > 135; From Departement d Where d.lesEmpl.noE >135; Module 2 page Modèle navigationnel © Page 25 50 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Représentation tabulaire d’une classe externe et interne Avec la technologie objet de Oracle, le container ou l’extension des objets est la table laquelle doit pouvoir stocker des valeurs et des objets en cohabitation. Une classe interne est rendue par une table imbriquée peu importe le niveau et doit être aplatie (Unnested) suivi d’une jointure pour permettre l’accès aux valeurs avec SQL. Les valeurs de la classe externe est rendue par une table de base du genre relationnelle. T1: T1*: A a1 a2 lesB A B.C B.D C D a1 c1 d1 c1 d1 a1 c3 d2 c3 d2 a2 c4 d5 c4 d5 a1 c4 d4 + Impossible : Insert into T1 ( A, B.C, B.D) values (a1, c4, d4); Mais … Insert into T1* ( A, B.C, B.D) values (a1, c4, d4); si et seulement si la table préalablement aplatie Select * from T1; -- fournit les valeurs de A et les objets-colonnes Mais : Select A, B from T1 ne peut pas être calculé! Donc pas de réponse! Module 2 page Modèle navigationnel © 51 Unnesting d'une table (classe interne) en Oracle : la fonction Table() SQL‐DML manipule seulement des valeurs de tables de premier niveau, car SQL implémente les opérateurs de l’algèbre relationnelle. SQL doit donc exploiter des tables aplaties pour obtenir des valeurs! Une table imbriquée est aplatie (Unnested) par la fonction Table() qui implique l’usge d’ une clé interne entre la table et la sous‐table ramenée au 1er niveau! On peut aussi interpréter le unnesting comme une pseudo «désencapsulation» de l’ensemble imbriqué* pour amener au 1er niveau les attributs et les valeurs des objets de l’ensemble. L’accès et l’affichage SEULEMENT des valeurs d’attribut des objets‐colonnes ne nécessitent pas la jointure: seule la Table() de l’attribut d’ensemble est «unnesté». * L’attribut associé à un lien multiple en est un d’ensemble contenant des objets imbriqués Module 2 page Modèle navigationnel © Page 26 52 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Représentation tabulaire du Mnav et un lien interne T1 A : int T1 lesB A: B a1 c : int d: int a2 lesB:lesB_t C D c1 d1 c3 d2 c4 d5 Module 2 page Modèle navigationnel © 53 Unnesting et le Stockage physique d’une table imbriquée Pour afficher les valeurs de tous les attributs, il faut recourir au unnesting avec la fonction Table() suivi d’une jointure entre la table parent et la sous-table pour obtenir une table temporaire aplatie: T1 A lesB: lesB_t a1 a2 C D c1 d1 c3 d2 c4 d5 Select x.A , w.C, w.D From T1 x , Table (x.lesB) w; Pour accéder à des valeurs particulières de l’ensemble imbriqué seulement: Select w.C From Table (lesB) w ; Stockage d’une table imbriquée: T1a T1b C D cle‐interme A cle‐Interne c1 d1 p0001 a1 p0001 c3 d2 p0001 a2 p0002 c4 d5 p0002 Jointure implicite: T1 := T1a |x| T1b Modèle navigationnel © Page 27 Module 2 page 54 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Le Unnesting et la classe interne Pour chaque modèle navigationnel ayant une table interne, cela suppose au niveau de l’implantation et de l’exploitation une opération de Unnesting pour avoir accès aux valeurs. Select Select x.A, w.C From T1 x , Table (x.lesB) w; Select w.D /* lecture que des valeurs de la sous-table */ From Table (lesB) w ; Select x.A /* unnesting non necessaire pour afficher que cette valeur A */ From T1 x; Select * from lesB -- invalide car lesB n’a pas de containeur associé Module 2 page Modèle navigationnel © 55 Résumé pour aide‐mémoire Passage du diagramme de classe UML au modèle navigationnel (Mnav) Le passage du DC-UML au Mnav peut se faire de diverses façons. Le critère de choix du modèle cible est que le modèle navigationnel obtenu se conforme le plus possible : 1- avec la sémantique du DC-UML et de ses contraintes. 2- avec l’exploitation des données Plus il y aura de contraintes renforcées par la structure et la sémantique du modèle Mnav, plus ce dernier sera à privilégier. Les contraintes qui ne sont pas renforcées par le Mnav, le seront par une méthode. Module 2 page Modèle navigationnel © Page 28 56 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Du DC‐UML vers le navigationnel: règles de passage Transformation d'une classe UML : • Chaque classe du DC‐UML, sauf les classes‐associations, est transformée en une classe externe du Mnav. • Chaque attribut composé de type tuple UML devient une classe interne avec un lien interne simple vers un seul objet. Il peut aussi être transformé en un attribut complexe sans être un objet. • Chaque attribut d’ensemble est rendu par un lien interne multiple ou un lien externe multiple (avec Ref) selon l’existence autonome ou pas des objets au regard de la suppression. Le choix est aussi fonction de la performance d’accès recherchée. Identifiant facultatif pour la classe du Mnav : • Chaque classe du Mnav (sauf les sous‐classes dans l’arbre d’héritage) et la classe d'association, peut avoir un identifiant de valeur. Souvent pratique pour la recherche, mais non obligatoire. • Si aucun attribut ne convient pas comme clé, on peut ajouter une clé, si possible significative. Ce n’est cependant pas une exigence du modèle. Transformation des associations : Plusieurs possibilités selon le genre d'association : 1‐1, 1‐* et *‐*… La contrainte d’une association étant spécifiée de préférence par le DDL‐SQL du SGBD utilisé. Autrement, elle sera renforcée par une méthode. Module 2 page Modèle navigationnel © 57 Transformation de l'association 0..1 – 1..1 C1 as1 op1 0..1 <A C2 1,1 as2 op2 Asso as : attribut simple ar: attribut de type REF op: interface 1ère solution : L'attribut de type Ref peut être nul dans C2. L'accès privilégié est par C2. C1 C2 as1 as2 Toutes les multiplicités de la classe UML ne sont pas représentées par ce Mnav! ar2 En lisant l'attribut ar2 de C2 (1 ref ) il y a un accès direct à l'instance correspondante dans C1. Le ar2 est de type REF et peut être null. Module 2 page Modèle navigationnel © Page 29 58 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 (Suite) Transformation des associations: 0..1 – 1..1 2ème solution avec le parcours inverse : accès via C1 et accès à C2 via l'attribut de référence ar1 qui ne peut pas être nul. C1 as1 op1 C2 1..1 0..1 as2 op2 A> C1 La multiplicité du côté de C1 n’est pas représentée ! C2 as2 as1 ar1 Le sens de la navigation est indiqué dans le DC-UML suggérant la transformation appropriée. Si le sens de la navigation est absent dans l'association : on peut assumer alors que les 2 sens sont équiprobables Module 2 page Modèle navigationnel © 59 (suite) Transformation des associations UML : 0..1 – 1..1 3e solution pour les 2 sens de parcours: 2 liens simples (aucun sens privilégié) C1 C2 as1 as2 ar1 ar2 ar1 de C1 est du type REF monovalué non null qui réfère à C2 (donc aux objets de la classe C2). ar2 : est un attribut REF qui réfère à un objet de C1 et qui peut être null. • La suppression de C2 sous-tend 1 mise à jour de ar1. • La suppression de C1 est suivie d’une mise à jour de ar2 Ce Mnav exprime le renforcement des 2 contraintes par le modèle sans égard au sens privilégié du parcours de l’association. Il faut recourir cependant au shadowing ou type incomplet pour définir ce modèle. Module 2 page Modèle navigationnel © Page 30 60 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 (suite) Transformation des associations: 0..1 – 1..1 4e solution (dite universelle): utilisation d'une 3e classe CA avec 2 liens externes. Toutes les multiplicités sont renforcées par le modèle. C1 C2 as1* as2* CA ar2 ar1 La suppression de C2 entraîne celle de C1 qui lui serait associé. Évolution du modèle: Le modèle peut évoluer en intégrant un attribut pour la classe d’association sans pénaliser l'interrogation et la manipulation de la base d’objets. Module 2 page Modèle navigationnel © 61 Interrogation avec SQL: cas lien simple Stages étudiants (UML) : Etudiant(e): matricule* : string nom : string Stage: 0..1 Effectue > 1..1 noS* : int themeS: string respS : string Solution avec une REF simple: Etudiant(e): Stage: matricule* : string noS* : int nom : string themeS: string refStage respS : string Un lien peut être parcouru grâce à la référence et via la notation pointée. Module 2 page Modèle navigationnel © Page 31 62 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Quelques interrogations du modèle Mnav (via le lien simple) 1‐ Quels sont les étudiants (matricule) sans stage? Aucun car pour être dans la base il faut être associé à un stage. 2‐ Quels sont les stages disponibles? Etudiant(e): Stage: Select s.noS From Stage s matricule* : string noS* : int nom : string themeS: string ‐ (minus) refStage respS : string Select e.refStage.noS From Etudiant e [ Where e.refStage is not null ] Notez le parcours de l’association par la notation pointée. Module 2 page Modèle navigationnel © 63 (Suite) interrogation avec SQL 3‐ Quels sont les thèmes des stages choisis? Select e.refStage.themeS From Etudiant e ; 4‐ Quel est le matricule des étudiants et le numéro de stage choisi dont le thème porte sur l’analyse? Select e.matricule, e.refStage.noS From Etudiant e Where e.refStage.themeS = "analyse"; Module 2 page Modèle navigationnel © Page 32 64 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Association de multiplicités 0..* et 1..1 (enfants) C1 as1* op1 (parent) 0..* C2 1..1 as2* <A op2 as : attribut simple ar: attribut de type REF op: action d’interface 1ère solution : un lien multiple. La multiplicité minimale 0 figure à la source du lien ar2 de C2. Le parcours privilégié est pris en compte. C1 as1* C2 as2* ar2 (<) op2 op1 c1 c2 création 2 1 Mise à jour 1 2 suppression 2 2 recherche 1 1 L'accès par C2 est privilégié (<). La suppression d'un objet C2 doit entraîner s’il y a lieu les objets C1 associés (contrainte 1..1 du côté C2). La suppression de C1 ? Module 2 page Modèle navigationnel © 65 Association 0..* ‐‐ 1..1 (suite) 2e solution *** : un lien monovalué non nul vers le parent C2 C1 C2 as1* as2* ar1 c1 c2 création 2 1 Mise à jour 2 1 suppression 1 2 recherche 1 1 Chaque instance de C1 est liée à une instance de C2 par la référence ar1 obligatoire. La suppression de C1 se limite à cette opération. La suppression de C2 doit être bloquée si elle est référée par un objet de C1. La ref ar1 doit avoir obligatoirement une référence valide. La suppression de C2 devrait donc éventuellement entraîner aussi celle de C1 qui s'y réfère et cela au cours d’une même transaction. Module 2 page Modèle navigationnel © Page 33 66 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Interrogation avec le modèle de la solution no 1 Quels sont les objets C1 associés à un objet C2 dont as2 = 5 ? Select s.as1.* From C1 s Where s.ar1.as2 = 5 La variable objet associée à C1 , s est obligatoire Le parcours avec le lien externe simple est fait grâce avec la notation pointée. Module 2 page Modèle navigationnel © 67 Association (C1) 0..* ‐ 1..1 (C2) avec un lien interne multiple C2 L’ajout d’un objet C2 ne présume de la création d’un objet C1. En supprimant un objet C2, les objets C1. associés sont aussi supprimés. as2 L’ajout d’un objet de C1 suppose l’existence d’un objet hôte C2. as1 ar2 (ou lesar2) C1 Le lien interne multiple pour ar2 sous-tend un ensemble formé avec des objetscolonnes de type C1 imbriqués. La réalisation physique en Oracle prend la forme d’une sous-table d’objets imbriqués. ** L'accès est privilégié par C2 pour trouver les C1. La suppression de C1 n’entraîne pas celle de C2, la classe hôte. Module 2 page Modèle navigationnel © Page 34 68 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Attribut d’ensemble sous‐tend la notion de oid La notion d’ensemble pour l’attribut ar2: En raison du lien multiple, le ar2 est un ensemble de oids se référant à autant d’objets de la classe CA. L’implantation physique de cet ensemble dépend du SGBD. En Oracle, cet ensemble prendra la forme d’une sous-table imbriquée de oids par exemple. Avec d’autres, cela peut-être une liste, un bag,… Module 2 page Modèle navigationnel © 69 Exemple avec une association: (C) 1..* ‐ 1..1 (P) Exemple : Cours‐Prof Cours: noC* : int Prof: 1..* Enseigne 1..1 noP*:int titreC :string nomP : nbCred : int gradeP:int Cours: Prof: noC* : int noP* : int titreC : string nomP : string nbCred : int gradeP : int refProf lesCours Avec Oracle, ce Mnav est inacceptable en raison de l’impossibilité de référer à un type incomplet via un lien multiple Module 2 page Modèle navigationnel © Page 35 70 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Mnav avec (C) 1..* ‐ 1..1 (P) : lien multiple Pour un professeur donné, il sera facile d’obtenir tous les cours dont il est responsable. Cours: 1- Avec un lien externe multiple: Prof: noC* : int noP* : int titreC : string nomP : string nbCred : int gradeP : int lesCours 2- Avec un lien externe simple: Cours: Prof: noC* : int noP* : int titreC : string nomP : string nbCred : int gradeP : int refProf Module 2 page Modèle navigationnel © 71 Quelles sont les contraintes associées à l'ajout et à la suppression d'un cours / prof? Avec le Mnav 1: À l’ajout d’un cours: Le cours ajouté doit être associé à un prof : pas renforcé dans le Mnav 1 À la suppression d’un cours: Le cours est supprimé suivi d’une suppression dans lesCours. À l’ajout et d’un professeur: Ajout d’un prof implique l’ajout d’un ou plusieurs cours (contrainte de multiplicité). Suppression: ‐ suppression de tous les cours enseignés par ce prof. et ‐ suppression du prof. Ces contraintes devront être implémentées dans une méthode de suppression qui prendra en charge la vérification de ces contraintes dans une même transaction. Module 2 page Modèle navigationnel © Page 36 72 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Association (C) 0..* ‐ 1..* (E) sans attribut d’association Cours noC* : int 0..* Inscrit Etudiant 1..* matricule:* titreC: string nom:string nbCred : int Solution 1: Cours: cours_t Etudiant: noC* :int matricule* : int titreC : string nom : string nbCred : int lesCours lesEtudiants Avec Oracle, la circularité des liens multiples interdit la définition des types lesCours et lesEtudiants. Donc le modèle ci-dessous doit être abandonné! La définition de 2 liens circulaires ne peut pas être faite si la classe cible renferme aussi une définition multiple inverse (voir type incomplet). Module 2 page Modèle navigationnel © 73 Association (C) 0..* ‐ 1..* (E) sans attributs d’association Cours noC* : int titreC: string 0..* Inscrit Etudiant 1..* matricule:* > nom:string nbCred : int Solution 2: Avec préférence de parcours: 1 liens multiple avec un nouvel attribut de type ensemble de REF . Cours: cours_t Etudiant: noC* :int matricule* : int titreC : string nom : string nbCred : int lesEtudiants Quels sont les matricules d’étudiant inscrits au cours 124? La sélection du cours identifie les références les étudiants inscrits via le lien externe multiple. ** Avec le lien multiple: l’attribut a le type d’un ensemble (Table of) de références vers etudiant_t Module 2 page Modèle navigationnel © Page 37 74 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Afficher les cours suivis par un étudiant Select c. noC From Cours c Where (select ref(e) from Etudiant e where e.matricule=123) IN (select e.* from table(lesEtudiants) e ); Les oids de l’ensemble lesEtudiants NOC 50 n.b. Le 2e select fournit que les oids de l’ensemble lesEtudiants; il n’est nécessaire de faire une jointure et le unnesting car la projection implique que les oids. Module 2 page Modèle navigationnel © 75 Quelques interrogations sur ce Mnav (2) Select * From Cours c Where c.lesEtudiants is not empty; -- prédicat d’ensemble NOC TITREC 50 Java NBCRED LESETUDIANTS 3 LESETUDIANTS_T(0000220208E938BD8BE15C46F3A8544ADB258D6A9E19FF34467AEE448EAF2B2D401B8701) Select c.noC From Cours c Where c.lesEtudiants is not empty ; NOC 50 Module 2 page Modèle navigationnel © Page 38 76 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Définition de cette structure en objet Oracle Demo pour l’association 0..* ‐ 1..* Create type etudiant_t as object (matricule varchar(10), nom varchar(50)) / *** le lien multiple externe est spécifié comme un ensemble de références de type etudiant_t Create type lesEtudiants_t as table of REF etudiant_t ‐‐ as SET OF refétudiant_t / Create type cours_t as object ( noC int, titreC varchar(50), nbCred int, lesEtudiants lesEtudiants_t) / Create table Etudiant of etudiant_t; Create table Cours of cours_t Nested table lesEtudiants Store as Table_lesEtudiants ; Module 2 page Modèle navigationnel © 77 Suite … Les objets: Insert into Etudiant values (etudiant_t(‘123’, ‘Luce’)); Insert into Etudiant values (etudiant_t(‘456’, ‘Jacques’)); Insert into Cours values cours_t(50, 'Java', 3, (lesEtudiants_t( (select ref(e) from Etudiant e Where e.matricule = ‘123') ) ) ); SQL> select lesEtudiants from Cours; LESETUDIANTS LESETUDIANTS_T(0000220208E938BD8BE15C46F3A8544ADB258D6A9E19FF34467AEE448EAF2B2C4D401B8701) *************************************************** Select c.noC, c.lesEtudiants from Cours c; NOC 50 LESETUDIANTS LESETUDIANTS_T(0000220208E938BD8BE15C46F3A8544ADB258D6A9E19FF34467AEE448EAF2B2C4D401B8701 Module 2 page Modèle navigationnel © Page 39 78 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Association: (C) 0..*‐ 1..* (E) Avec au moins un attribut à la classe‐association Solution 3 : 2 liens simples imposés par la présence d’un attribut d’association Etudiant: Cours: noC* :int matricule* : string titreC : string nom : string nbCred : int Recherche aussi possible si la classeassociation a aussi les clés des classes externes concernées.. Inscription: refEtudiant refCours dateInsc : Date La classe CA, et les 2 liens s'imposent si l'association Inscrit a des attributs. Attribut de l’association Module 2 page Modèle navigationnel © 79 Recherche avec la classe d’association (avec notation pointée et lien simple) Quels sont les matricules étudiants inscrits au cours 134FT en 2012? Select In.refEtudiant.matricule From Inscription In Where In.refCours.noC = ‘134FT’ and In.dateInsc = ‘2012’; Quels sont les cours suivis par l’étudiante Elise? Select I.refEtudiant.noC From Inscription I Where I.reEtudiant.nom = ‘Elise’; Quels sont les cours suivis par chaque étudiant inscrit dans la BD? Select From I.refCours.* Inscription I Module 2 page Modèle navigationnel © Page 40 80 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Recherche avec l’attribut d’ensemble Quels sont les matricules étudiants inscrits à aucun cours? (Select e.matricule From Etudiant e) – ( Select Ins.refEtudiant.matricule from Inscription Ins) ` Module 2 page Modèle navigationnel © 81 Est-il que ce Mnav est spécifiable en objet? Produit: produit_t Usine: usine_t noU* : int noP* : int nomU : varchar leDepot lesProduits VilleDepot:villeDepot_t nomV *:varchar popV : int maireV : varchar Est-il possible de supprimer un produit sans supprimer aucun autre objet? La définition du lien multiple est possible dans ce modèle car les liens ne forment pas une boucle avec un lien multiple. Module 2 page Modèle navigationnel © Page 41 82 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Association 0..* ‐ 0..* avec un attribut pour l’association Solution 1 (universelle) : une 3e classe avec le nom de l'association est formée avec les attributs de l'association, deux liens monovalués vers les classes participantes. Les multiplicités ne sont pas renforcées par le Mnav. 0..* C1 0..* C2 1..1 as1* as2* CA12 as3 Propriété de la classe association C2: C1: as1* as2* CA12: as3 ar3 Le CA12 peut avoir un identifiant composé de as1 et as2 représentés dans le CA12. ar4 Un objet de C2 (:C2) non associé à un objet de C1 n’aura pas d’objet d’association du type CA12. Module 2 page Modèle navigationnel © 83 Recherche avec une classe d’association C2: C1: as1* as2* CA12: as3 ar3 ar4 Quels sont les C1 associés à une valeur clé k2 de C2? Quels sont les C1 non associés à un objet C2? 1- recherche dans CA12 2- Les C1 moins les CA12: Select o.ar3.*, o.as3 Select x.* From C1 From CA12 -- o (moins) Select o.ar3.* Where o.ar4.as2 = k2 From CA12 o Where o.ar3 is not null; Module 2 page Modèle navigationnel © Page 42 84 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Association 0..* ‐ 0..* avec un attribut (suite) Solution 2: une classe interne avec un lien interne multiple et un lien externe simple. C1: C2: as1* as2* ar2 CA12: as12 ar4 : La suppression d'une instance de C1 sous-tend la suppression de l'instance de CA12 associée. Que donnerait: Select o.* from CA12 o? Un ensemble d’objets-colonnes CA12 exploitables en PL/SQL avec un curseur! Module 2 page Modèle navigationnel © 85 Exemple : Association UML 0..* ‐ 0..* avec attribut d’association Depart codeD*: int nomD:string 0..* 0..* 1..1 Logiciel codeLog*:int nomLog:string Achat dateAchat: Depart:depart_t Logiciel: codeD*: int codeLog* : int nomD: varchar nomLog : varchar lesAchats Achat :achat_t dateAchat : Date refDep Les achats de logiciels distincts faits par un département sont représentés par la classe interne dont les éléments ont la structure achat_t . La suppression d’un logiciel fait disparaître toute l’information au sujet de son achat. Module 2 page Modèle navigationnel © Page 43 86 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Création de la base objet Create type depart_t as object (codeD int, nomD varchar(50)) / Create type achat_t as object ( dateAchat Date, refDep REF depart_t) / create type lesAchats_ as table of achat_t / Create type logiciel_t as object (codeLog int, nomLog varchar(50), lesAchats lesAchats_t) / Create table logiciel of logiciel_t nested table lesAchats store as Table_lesAchats; Create table Depart of depart_t; 1* insert into Logiciel values(logiciel_t(100,'youpi', lesAchats_t(achat_t(sysdate,null)))) Module 2 page Modèle navigationnel © 87 Interrogation de la classe externe: Logiciel Important Il est possible d’interroger ce modèle notamment les classes qui ont un containeur d’objets en propre (table). Ainsi, il est possible d’interroger la table-objet Logiciel mais pas directement la classe interne qui correspond à des objets-colonnes imbriqués. Select * from lesAchats ERROR at line 1: ORA-00942: Table ou vue inexistante Select lesAchats -- fournit les objets imbriqués. from Logiciel Module 2 page Modèle navigationnel © Page 44 88 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Affichage des objets de la classe interne Select * from Logiciel CODELOG NOMLOG 100 youpi -- fournit tous les objets y compris les imbriqués. LESACHATS(DATEACHAT, REFDEP) LESACHATS_T(ACHAT_T('14-09-16', NULL)) Affichage des données de la classe interne avec Unnesting: Select L.codeLog, v.dateAchat from Logiciel L, Table(L.lesachats) v CODELOG 1 DATEACHAT 1799 Module 2 page Modèle navigationnel © 89 Fonction REF() Une fonction essentielle pour établir le lien externe et permettre la navigation associative avec SQL : REF(x) où x est un objet et la fonction fournit l’oid de cet objet. *** ne pas confondre la fonction REF() et le type REF L’association entre deux objets de classes différentes A et B est établie avec la référence soit l’oid. Module 2 page Modèle navigationnel © Page 45 90 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Fonction REF(): initialisation de l’attribut de type ref Créer un objet A dont la valeur x = 15 avec une association avec l’objet B dont c=5 . A: x* : int w : B: c : int d: int Insertion des objets associés: Insert into B values (b_t( 5 , 10 )); Insert into A values (a_t ( 15 , (select REF(b) from B b where b.c =5))); * Lors du «parsing» du DML, il y a évaluation en priorité les expressions entre parenthèses. Module 2 page Modèle navigationnel © 91 Exemple comportant plusieurs classes Modélisation des randonnées effectuées par des personnes qui visitent des lieux touristiques situés dans diverses régions. Module 2 page Modèle navigationnel © Page 46 92 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Exemple d'une classe d'association participant à une autre association (solution universelle) Rando: Personne: noR* : int 1..1 0.. * Tant que les classes Mnav sont concrétisées par des classes d'objets dotés d’un oid, la clé primaire n'est pas essentielle, mais utile pour la recherche des objets. 0…* RandoPerso: lieuDepart: dateDepart: UML nasP*: int 1..* 0..* 1..1 LieuTourist lieuT*:string regionT: RL: dateVisite: prix: :real Rando Personne noR*:int nasP*: int Mnav RandoPerso: dateDepart: Les liens sont tous simples. Ils sont traversés avec la notation pointée. LieuTourist: lieuDepart: RL: refRando dateVisite: Date refPersonne prix: real lieuT: string regionT: char refLieuTourist refRandoPerso Module 2 page Modèle navigationnel © 93 Quelques interrogations avec parcours par référence ? Dans le choix de la transformation, il ne faut pas perdre de vue l’exploitation subséquente du modèle. Cela peut justifier la classe d’association. Voici quelques clauses SQL pour interroger et mettre à jour cette base. Quels sont les régions de départ pour les randos effectués par le randonneur dont le nasP est 3456? Select rp.refRando.noR From RandoPerso rp Where rp.refPersonne.nasP = 3456; Quels sont les lieux touristiques visités par le randonneur dont le nasP est 3456? Select t.refLieuTourist.lieuT From RL t Where t.refRandoPerso.refPersonne.nasP = 3456; ‐‐ double indirection Module 2 page Modèle navigationnel © Page 47 94 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Mise à jour du modèle RANDO avec les références Le randonneur 3456 qui a quitté le 15‐09‐2010 n’a pas parcouru la région 5 mais la région 6. Une mise à jour s’impose. Update RandoPerso rp set rp.refRando = (select Ref(r) From Rando r Where r.noR = 6) Where rp.dateDepart = to_date(2010‐09‐15 , ‘YYYY‐MM‐DD’) and rp.refPersonne.nasP = 3456 and rp.refRando.noR = 5 ; Remarque: Dans ce Mnav, une randonnée d’une personne ne peut pas être ajoutée s’il n’y a pas aussi la visite d’un lieu touristique. Cela est imposé par la contrainte de multiplicité. Le Mnav ne renforce pas cette contrainte! Module 2 page Modèle navigationnel © 95 Les choix à privilégier pour les associations (Best Practices) Pour l'association Modèle navigationnel 1..1 – 1..1 Un lien simple obligatoire 1..1 – 0..*(sans préférence de navigation) Un lien simple de enfant vers le parent 0..* - 1..* sans attributs 2 liens simples 0..* - 1..* avec attributs 2 liens simples + CA Les contraintes non explicitées et renforcées par le Mnav le seront par les méthodes. Module 2 page Modèle navigationnel © Page 48 96 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Association réflexive 1..1 – 0.. * Modèle Ouvrier spécialisé 1..1 chef nasO* : int adrO : string metierO: string 0..* Solution 1 : rôle dirigéPar > Ouvrier * Un chef est aussi un ouvrier Ouvrier 1 lien externe simple: Ouvrier:ouvrier_t nasO*: int adrO: string metierO: string refChef NB: Un chef est aussi un ouvrier Module 2 page Modèle navigationnel © 97 Lien simple et le suivi avec la notation pointée • Quel est le chef de l’ouvrier 50? Select o.refChef.nasO From Ouvrier o Where o.nasO = 50 (and o.refChef.nasO is null); Quels sont les ouvriers dont le chef est 25? Select o.* Ouvrier:ouvrier_t nasO* : int adrO : string metierO : string refChef From Ouvrier o Where o.refChef .nasO = 25; Quel est le chef du chef 25? Select o. refChef.nas.O From Ouvrier o Where o.nas = 25; Module 2 page Modèle navigationnel © Page 49 98 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Select et Curseur PL/SQL Quels sont les ouvriers dirigés par le chef 25 Select o.nas. o.metierO (1) From Ouvrier o Where o.refChef = 25; Ouvrier:ouvrier_t nasO* : int adrO : string metierO : string refChef (1) Un ensemble d’objets sera formé par le calcul de la réponse. Cet ensemble sera exploré par la suite avec une proc PL/SQL exploitant un curseur*. *Curseur est l’équivalent du ResultSet. Cet espace permet de parcourir les objets un à un avec une proc PL/SQL. Module 2 page Modèle navigationnel © 99 Modèle à deux liens externes Modèle exclu evec Oracle: Ouvrier:ouvrier_t nasO* : int adrO : string metierO : string refChef lesOuvriers Ce Mnav ne peut pas être implémenté avec Oracle en raison de la présence dans le Mnav d’une boucle comprenant un lien multiple qui aboutit à un type incomplet (ouvrier_t). Module 2 page Modèle navigationnel © Page 50 100 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Ajout d’un ouvrier (25) et son chef (100) (modèle à un seul lien) Ouvrier:ouvrier_t Avec ce modèle, un ouvrier qui est un chef réfère à lui-même. nasO*: int adrO: string metierO: string refChef Create type ouvrier_t as object(nasO int, adrO varchar(50), metierO varchar(50), refChef REF ouvrier_t); Insert into Ouvrier values (ouvrier_t(25, 'rue des pignes', 'soudeur', null)); L’ouvrier 25 a l’ouvrier 100 comme chef: Update Ouvrier o Set o.refChef = ( select Ref(x) From Ouvrier x where x.nasO = 100) Where o.nasO = 25 ; Module 2 page Modèle navigationnel © 101 Insertion d’un ouvrier‐chef (nasO = 100) avec qui est chef -- Insertion d’un ouvrier-chef dont le nasO = 100: (2 opérations) Insert into Ouvrier values (ouvrier_t(100, 'rue des guignols', 'soudeur', null)); Insertion de son chef qui est lui-même: Update Ouvrier o set o.refchef= (select Ref(w) from Ouvrier w where w.nasO = 100); Module 2 page Modèle navigationnel © Page 51 102 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Agrégation des classes Module 2 page Modèle navigationnel © 103 Agrégation : composition et partage Agrégation de composition et de partage : ce sont d’abord des associations dotées de contraintes supplémentaires au regard de la suppression. • Composition (forte) : la suppression de l'agrégat doit entraîner celle des instances agrégées (qui composent ..). Chaque instance du composant ne peut être qu’en association qu'avec une seule instance de l'agrégat. Donc pas de partage du composant! • Faible (ou partagée) : la suppression de l'agrégat n'entraîne pas nécessairement celle d'un composant qui peut être éventuellement en association avec une autre instance de l’agrégat ou avec une entité d’une autre classe. La représentation d'une agrégation : • Soit par imbrication de la classe du composant dans laclasse composée (agrégat) avec des liens simples ou multiples; • Soit par une classe composée reliée aux différentes classes (externes) avec des liens simples ou multiples externes. Module 2 page Modèle navigationnel © Page 52 104 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Agrégation de composition forte C1 1..1 as1 0..* C2 La suppression d'une instance de C1 entraîne celle des instances de C2 associées. Dans cet exemple la création de C1 peut ou pas se faire dans la même transaction que la création de C2. as2 C1 as1 Quel est le Mnav pour l'agrégation ci-dessous ? ast1 Ordinateur: c2 noSerie: int as2 1..1 1..1 0..* Ecran : Disque: noEcr*:int noDisq*:int Module 2 page Modèle navigationnel © 105 Agrégation de composition pour une association 1.. * – 1..1 orientée C1: as3: 1..* 1..1 C2: C2: as2: as2: ar2: La suppression de C2 entraîne de facto celle des C1. C1: La suppression de C1 est possible mais s’il est le dernier, l’opération est refusée. as3: as4 La composition sous-tend un accès par C2. C2: as2 ar2 as3 t90 R45 as4 10 as 23 sig 28 Low 12 dig Module 2 page Modèle navigationnel © Page 53 106 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Mnav pour l’agrégation avec 2 composants Solution avec 2 liens internes : Ordinateur Ordinateur: noSerie*: noSerie*: 1..1 refEcran lesDisques 1..1 Ecran: 0..* Disque: Ecran: noEcr*: noDisq*: noEcr*: Disque: La modélisation avec une agrégation forte sous-tend la suppression dans la BD de l’écran et des disques qui le composent lorsque l’ordinateur est supprimé de la BD. noDisq*: De même un écran ou un disque ne peut pas être dans la base sans être associé à un ordinateur. Par contre, un ordinateur peut agréger qu’un écran (sans disque 0..* ). Module 2 page Modèle navigationnel © 107 Quelle est la vision tabulaire de ce Mnav? Ordinateur noSerie refEcran Ordinateur: noSerie*: noEcr 2345 e34 34712 e89 refEcran lesDisques Ecran: noEcr*: 562 E23 lesDisques noDisq fourn D2 F1 D3 F2 D7 F2 D9 F1 D12 F4 Null null Disque: noDisq*: fourn Dans cet exemple, tous les objets internes sont physiquement imbriqués dans la classe externe Ordinateur. Module 2 page Modèle navigationnel © Page 54 108 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Composition forte avec une multiplicité de 0..1 Ordinateur En ajout: un écran est inscrit dans la BD sans obligation d’être associé à un ordinateur. Idem pour le disque. noSerie:int 0..1 Un ordi est fait de 0 ou 1 écran et de 0 ou plusieurs disques . 0..1 0..* Disque Ecran noE*: int noD: int capaciteD: tailleE: En suppression : enlèvement obligatoire, s’ils existent , de l'écran et des disques associés à l’ordinateur. marqueD: NB: Avec la composition, la suppression a priorité sur la cardinalité (0..1) ou (1..1). Résultat idem mais différent avec l’ajout. Module 2 page Modèle navigationnel © 109 Mnav de l'agrégation forte avec (0..*) avec deux classes externes Ordinateur: noSerie* : int lesDisques refEcran Gestion plus lourde avec l’agrégation forte La suppression d'un ordinateur doit aussi entraîner la suppression de l'écran et des disques de la base. Ce sont des objets dans des containeurs distincts. 3 opérations de suppression sont nécessaires pour supprimer un ordi!! Disque: noD*: int noE*:int capaciteD: tailleE: marqueD: Ecran: Pour ajouter un ordi, 3 opérations d’ajout sont éventuellement nécessaires: • ajout un objet ordinateur • ajout d’un ou plusieurs objets (disque) • ajout d’un objet écran Module 2 page Modèle navigationnel © Page 55 110 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Quelle est la vision tabulaire de cette agrégation? Ordinateur: noSerie prix refEcran lesDisques noEcr 34712 noDisq oid9 oid7 oid19 oid8 562 oid3 Null Disque: noD capaciteD marqueD Ecran: noE tailleE (oid7) d67 456 Digital (oid9) e9 760 (oid19) D5 897 LaCie (oid3) e8 1024 (oid8) D1 67845 IBM Module 2 page Modèle navigationnel © 111 Agrégation partagée (ou faible) avec une multiplicité 1..*‐‐ 0..* Le point d'entrée est C2: C1 as1: 1..* 0..* < C2 as2: L’accès se fait sur C2 pour avoir accès à C1. C1 C2 as1: as2: ar2 La suppression de C2 ne doit pas entraîner automatiquement celle de C1 qui peut être partagée avec une autre occurrence de C2 (exclusion de l’intégration de C1 dans C2). Exige éventuellement une mise à jour de ar2. Le partage de C2 est à vérifier de préférence par la méthode utilisée pour la suppression. Module 2 page Modèle navigationnel © Page 56 112 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Sur la nature des réponses … En cours d’exécution, une application ( browser, pgm Java, ….) peut obtenir du SGBD des données typées ou des objets. La nature de la réponse dépendra des structures disponibles dans l’application pour stocker la réponse ainsi que des méthodes « invokées » en cours d’exploitation. Si une application appelle l’exécution d’une méthode qui retourne des objets, l’application devra avoir généré les structures « natives » nécessaires pour les ranger et les manipuler. Module 2 page Modèle navigationnel © 113 Clin d’œil sur la Spécialisation/généralisation Héritage dans le DC‐UML L’héritage est une notion qui réfère aux classes d’une hiérarchie et non aux containeurs des objets. Module 2 page Modèle navigationnel © Page 57 114 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Héritage et ses propriétés dans le Mnav L'héritage du Mnav se formalise avec la même sémantique que celle de UML; il est spécifié directement avec le schéma objet avec une clause DDL. L'héritage aura des propriétés : exclusivité (d), overlapping (o), total (c) et partiel (i). Chacune exprime une contrainte entre les classes spécialisées. C1 {complete, disjoint} : card (BDO) = card(c2) + card(c3) Le nombre d’objets dans leur containeur respectif de type C1 est égal au nombre d’objets de C2 plus ceux de C3 as1* : int {complete, overlapping} : card(BDO) = card(c2) + card(c3) – card(c2) ⋂ card(c3) {incomplete, disjoint}: card(BDO) = card(C1) + card(c1) + card(C2) {complete, disjoint} {incomplete, overlapping} : card(BDO) = card(C1) +card(C2) – card(C2) ⋂ card(C3) C2 C3 as2: as3: Le Mnav conserve la notation UML pour l'héritage ainsi que ses caractéristiques. Remarque: cette hiérarchie n’exclut pas que des objets de type C2 et C3 cohabitent dans le même containeur que C1. Module 2 page Modèle navigationnel © 115 Héritage avec une association incidente : 1..1 et 1..1 Une association avec une superclasse est aussi l’objet d’un héritage spécialisé C5 C1 1..1 as1* : int Asso1-5 {complete, disjoint} C2 as2: 1..1 as5* : int L’association Asso1-5 se fait avec une superclasse (concrète ou abstraite). Comme il y a héritage, un objet de C5 peut-être en association soit avec un objet de C2 ou C3 via une REF C3 as3: NB: cela en raison du « complete» pour l’héritage: C5 ne pas être en association avec un objet de type C1, mais peut l’être avec un objet de type C2 ou C3. Module 2 page Modèle navigationnel © Page 58 116 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Mnav pour l’héritage impliquant une Ref sur une superclasse C5 aura donc un ensemble de ref soit sur C1, soit sur C2 soit sur C3 selon la couverture de l’héritage. C5 C1 as5* : int as1* : int lesRefC5 {complete, disjoint} C2 L’attribut lesRefC5est une ensemble de références à des objets soit de C2 ou de C3. C3 as2: as3: ** refC5 pourrait avoir aussi une contrainte propre comme par exemple une limite sur le nombre total d’objets référés peu importe sa nature. Module 2 page Modèle navigationnel © 117 Mnav pour l’héritage impliquant une ref sur une classe autre que la racine C1 C5 as1* : int as5* : int lesRefC5 {complete, disjoint} C2 as2: C3 as3: {i, d} C4 as6* : int L’attribut refC5 est une ensemble de références à des objets soit de C3 ou de C4. Aucune référence à un objet de la classe C1 et C2 n’est alors autorisée. Module 2 page Modèle navigationnel © Page 59 118 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Conclusion Le Mnav a pour but de visualiser plusieurs structures conduisant à l’objet et en évitant autant que possible les jointures explicites. Renforcement par la structure: Il permet aussi de renforcer par la structure même certaines contraintes du modèle, mais pas toutes. Les autres seront renforcées par les méthodes de l’interface. Renforcement par les méthodes: Les contraintes de multiplicité autres que les classiques, par exemple une contrainte de multiplicité du genre (0..5) , restent à être renforcées par la logique même des méthodes de l’interface. Ces méthodes peuvent aussi s’appeler l’une l’autre afin de profiter de leur logique propre par le partage. La notion de transaction est sous-tendue dans la logique de la méthode. La transaction doit donc être définie dans chaque méthode. Le Mnav met aussi en évidence la notion de type d’ensemble sans toutefois préciser s’il s’agit d’un ensemble ordonné ou pas: Varray() , le set ou la sous-table. Module 2 page Modèle navigationnel © 119 Commentaire sur le diagramme UML proposé pour le développement du logiciel au regard de celui des données Un diagramme de classe pour le développement du logiciel se distingue de celui des données par le fait que la partie supérieure d’une classe, celle des données, est moins élaborée et surtout n’est pas obligatoirement persistante (à moins que le langage de développement le soit). Les langages de programmation persistants ne sont pas nombreux! L’interface C’est la partie des opérations qui correspond aux différentes fonctions ou procédures nécessaires pour exploiter les données. Ce sont les constituants du logiciel qui est l’objet d’un développement. Module 2 page Modèle navigationnel © Page 60 120 Module 2 André Gamache professeur associé, Département d'informatique et de génie logiciel Faculté des sciences et de génie, Université Laval. Québec, Qc, Canada, G1K 7P4 Modèle Navigationnel Passage de UML au Mnav Exercices Modèle navigationnel © Module 2 page 121 Module 2 page 122 Fin Modèle navigationnel © Page 61 Module 2
© Copyright 2024 ExpyDoc