IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Schéma Discussion :

Spécialisation vraiment spéciale [MCD]


Sujet :

Schéma

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Avatar de Nowwis
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2009
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2009
    Messages : 406
    Par défaut Spécialisation vraiment spéciale
    Bonjour à tous,

    J'ai un problème de conception qui ne m'ai jamais arrivé, et je n'arrive pas à le résoudre le plus efficacement possible.

    J'ai pour faire simple un MCD à réaliser pour des véhicules qui pourrait être Auto et Moto par exemple.

    J'ai donc une entité Véhicule, que j'aimerais spécialiser en Auto et Moto (car ces deux autres entités ont quelques différences).

    Deux élément interviennent : Marque/Modèle et Motorisation.
    - Une marque appartient à un ou plusieurs type de véhicule (Honda Auto, Honda Moto).
    Un modèle appartient à une seule marque (Clio de chez Renault par exemple) et qu'à un seul type de véhicule (Auto en loccurence).
    - Pour la motorisation, pour l'auto on retrouve diesel/essence, mais aussi GPL, électrique, hybride.. Alors qu'en moto y'en a pas encore autant, et il serait idiot de proposer toutes les motorisations si on choisit plus tard une moto (je visualise un peu le projet en même temps...)


    Donc je me demande si la spécialisation est possible, et comment cela se représente...

    En vous remerciant par avance !


    EDIT
    Je joins ce que je pense correct mais ça me semble la pagaille, si quelqu'un pouvait vérifier...
    Le soucis est maintenant d'ajouter des attributs qui sont uniquement dans moto ou dans auto... C'est pour moi impossible de le faire alors que le schéma semblait bon...

    TypeVehicule2 = "Auto", "Moto"
    Type = "Berline", "4x4", "Sportive"

    Pour éviter toute confusion.
    Images attachées Images attachées  

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Effectivement, c'est la pagaille !

    Vous parlez de spécialisation dans votre message mais vous ne l'avez pas mise en oeuvre dans votre MCD.

    Reprenons...

    une entité Véhicule, que j'aimerais spécialiser en Auto et Moto
    Règles de gestion :
    1) Une auto est un véhicule et un véhicule peut être une auto.
    2) Une moto est un véhicule et un véhicule peut être une moto.

    MCD :
    auto -(1,1)----être----0,1- vehicule
    moto -(1,1)----être----0,1-------|

    C'est le modèle d'un héritage de données.
    Il faudrait aussi représenter une contrainte d'exclusion mais c'est difficile en mode texte. Tu devrais pouvoir faire ça avec ton mogiciel de modélisation.

    Tables :
    vehicule (vhc_id, [colonnes communes à tous les véhicules])
    auto (aut_id_vehicule, [colonnes spécifiques aux autos])
    moto (mot_id_vehicule, [colonnes spécifiques aux motos])

    Un modèle appartient à une seule marque
    Je complète la règle de gestion :
    3) Un modèle appartient à une seule marque et une marque peut avoir plusieurs modèles.

    MCD :
    modele -1,1----appartenir----0,n- marque

    Une marque appartient à un ou plusieurs type de véhicule
    Ok mais un véhicule n'a qu'un modèle.

    Règle de gestion :
    4) Un véhicule a un seul modèle et un modèle peut avoir plusieurs véhicules.

    MCD :
    vehicule -1,1----avoir----0,n- modele

    - Pour la motorisation, pour l'auto on retrouve diesel/essence, mais aussi GPL, électrique, hybride.. Alors qu'en moto y'en a pas encore autant, et il serait idiot de proposer toutes les motorisations si on choisit plus tard une moto (je visualise un peu le projet en même temps...)
    On arrive là au point le plus délicat qui est celui des caractéristiques selon le type de véhicule.
    Il faut modéliser d'une part les caractéristiques possibles pour le type de véhicule puis associer les bonnes caractéristiques aux bons véhicules selon leur type.

    Bien que la modélisation de l'héritage rende en principe inutile un typage séparé, il me semble ici nécessaire de le modéliser.

    Règle de gestion :
    5) Un véhicule a un seul type et un type peut avoir plusieurs véhicules.

    MCD :
    véhicule -1,1----avoir----0,n- type

    Pour les caractéristiques, on peut soit les généraliser dans une seule entité type "caracteristique", soit les séparer dans plusieurs tables. Puisqu'on parle ici de la motorisation, ne prenons en compte que cette caractéristique.

    Règle de gestion :
    6) Un type de véhicule a une à plusieurs motorisations et une motorisation peut avoir plusieurs types de véhicules.

    MCD :
    type -1,n----avoir----0,n- motorisation

    Maintenant il faut appliquer ces motorisations aux véhicules.
    Règle de gestion :
    7) Un véhicule n'a qu'une motorisation et une motorisation peut avoir plusieurs véhicules.
    vehicule -1,1----avoir----0,n- motorisation

    Et il faudrait cette fois représenter une contrainte d'inclusion entre les trois dernières associations pour refuser l'insertion d'une motorisation GPL à un véhicule de type moto.
    Dans la BDD, cela se traduira probablement par un trigger before insert.

    Voilà le principe, à vous de recoller les morceaux de MCD.

    Bon courage !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre très actif
    Avatar de Nowwis
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2009
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2009
    Messages : 406
    Par défaut
    Bonjour, et merci pour votre réponse.

    On arrive là au point le plus délicat qui est celui des caractéristiques selon le type de véhicule.
    Il faut modéliser d'une part les caractéristiques possibles pour le type de véhicule puis associer les bonnes caractéristiques aux bons véhicules selon leur type.

    Bien que la modélisation de l'héritage rende en principe inutile un typage séparé, il me semble ici nécessaire de le modéliser.

    Cela voudra dire que je dois avoir une entité "Type" qui contiendra la même chose que mes entité fille ? (quand je dis la même chose : une entité fille Auto et une autre Moto, cela me donnera donc deux champs dans "Type(id-libelle)" 1-Auto, 2-Moto ?

    Et il faudrait cette fois représenter une contrainte d'inclusion entre les trois dernières associations pour refuser l'insertion d'une motorisation GPL à un véhicule de type moto.
    Dans la BDD, cela se traduira probablement par un trigger before insert
    Cela se matérialise "grosso-modo" comme la PJ ?

    Merci d'avance
    Images attachées Images attachées  

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Nowwis Voir le message
    Cela voudra dire que je dois avoir une entité "Type" qui contiendra la même chose que mes entité fille ? (quand je dis la même chose : une entité fille Auto et une autre Moto, cela me donnera donc deux champs dans "Type(id-libelle)" 1-Auto, 2-Moto ?
    La table type aurait effectivement cette structure et ce contenu. Mais ce n'est pas du tout le même contenu que dans les tables auto et moto qui contiennent les propriétés spécifiques de chaque auto et de chaque moto.

    Cela se matérialise "grosso-modo" comme la PJ ?
    Il me semble oui. Je ne l'ai jamais mis en oeuvre moi-même.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre très actif
    Avatar de Nowwis
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2009
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2009
    Messages : 406
    Par défaut
    Ok.

    Oui j'ai précisé la valeur dans la table pour pas que l'on confonde avec les propriété.

    Je pensais qu'on pouvait faire plus simple que ça (au niveau de Type avec les enfants... Mais finalement c'est simple...)

    Il faudra bien pensé quand on crée un enfant à l'ajouter dans le TypeVehicule. C'est la seule "contrainte".

    Merci beaucoup pour ce coup de pouce, ça m'a permis d'avancer !

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Nowwis Voir le message
    Il faudra bien pensé quand on crée un enfant à l'ajouter dans le TypeVehicule. C'est la seule "contrainte".
    Non !
    La table TypeVehicule est quasiment invariable, sauf si un jour tu traites les camions, avions, bateaux, soucoupes volantes...

    Exemple : ajout d'un véhicule Renault Laguna.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    INSERT INTO vehicule (vhc_immatriculation, vhc_id_type, vhc_id_modele, vhc_id_motorisation)
    VALUES (
    	'BT 123 YP',
    	(SELECT typ_id
    	FROM type
    	WHERE typ_libelle = 'Auto'),
    	(SELECT md.mdl_id
    	FROM modele md
    	INNER JOIN marque mq ON mq.mrq_id = mdl_id_marque
    	WHERE mq.mrq_nom = 'Renault'
    		AND md.mdl_nom = 'Laguna'),
    	(SELECT mtr_id
    	FROM motorisation
    	WHERE mtr_libelle = 'Diesel')
    );
    
    INSERT INTO auto (aut_id_vehicule, aut_nb_places)
    VALUES (
    	(SELECT vhc_id
    	FROM vehicule
    	WHERE vhc_immatriculation = 'BT 123 YP'),
    	5	
    );
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation spéciale de LIKE
    Par tonyskn dans le forum Langage SQL
    Réponses: 5
    Dernier message: 19/07/2024, 10h36
  2. [DC]Spécialisation un peu spéciale !
    Par CinePhil dans le forum Diagrammes de Classes
    Réponses: 5
    Dernier message: 28/08/2008, 13h27
  3. Pas de JOIN sous Oracle (vraiment dommage...)
    Par Isildur dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/03/2007, 11h28
  4. Requete de comptage de doublons spéciale
    Par COliveOnTheNet dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/09/2003, 10h11
  5. Inclure un type de police spécial dans un projet
    Par AOliv dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 27/06/2003, 09h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo