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

 MySQL Discussion :

Entités d'une même famille


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Par défaut Entités d'une même famille
    Bonjour,

    Je dois modéliser des salles informatiques.

    La majorité des objets sont dépendants les uns des autres.
    Un exemple simpliste : Site => Salle => Travée => Baie => Equipement => ...
    Mais certain, ils sont présents à plusieurs niveaux :
    Site => Salle => Baie => ...
    Site => Baie => ...
    A priori, il faudrait normalement décrire Entité 'Baie' avec des liens IdTravée, un IdSalle, un IdSite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE InfraTelCo.Baie
      ( IdBaie        INT( 6 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
         . . .
        IdSite        INT( 6 ) UNSIGNED NOT NULL ,
        IdSalle       INT( 6 ) UNSIGNED NOT NULL ,
        IdTravee    INT( 6 ) UNSIGNED NOT NULL , 
         . . .
        PRIMARY KEY ( IdBaie )
      ) ENGINE = MYISAM ;
    Sur mon exemple simpliste, ca passe encore mais dans la vraie vie (+ d'une 30aine d'objets) ... Ça devient vite une horreur !!!

    Existe t'il une astuce de conception ?
    Merci de votre réponse.

  2. #2
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Je ne vois qu'une table `locaux` (chaque local typable en : site, travée, salle, etc) et des liens hiérachiques entre ses locaux dans la table elle-même.
    La baie est alors en relation avec cette table seulement.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Par défaut
    Merci de ce début de solution ...
    Si, j'ai bien compris, ça donnerait cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE InfraTelCo.Baie
    ( IdBaie INT( 6 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
    . . .
    IdLocal INT( 6 ) UNSIGNED NOT NULL ,
    . . .
    PRIMARY KEY ( IdBaie )
    ) ENGINE = MYISAM ;
    Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE InfraTelCo.Local
    ( IdLocal INT( 6 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
    . . .
    TypeLocal ENUM ( 'Site', 'Salle', 'Travée', ...)
    . . .
    PRIMARY KEY ( IdLocal )
    ) ENGINE = MYISAM ;
    Par contre, mes Tables 'Site', 'Salle', 'Travée', ... ont un bon nombre d'attributs qui leurs sont propres. Je ne peux pas tout fusionner dans une seule table.

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 287
    Par défaut
    Citation Envoyé par -( Jean-Michel )- Voir le message
    Sur mon exemple simpliste, ca passe encore mais dans la vraie vie (+ d'une 30aine d'objets) ... Ça devient vite une horreur !!!

    Existe t'il une astuce de conception ?
    Merci de votre réponse.
    S'il y a 30 entités suffisamment différentes, je ne vois pas trop où serait l'horreur dans le fait d'avoir 30 tables.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Par défaut
    Le soucis n'est pas d'avoir 30 tables (les BdD c'est fait pour çà) mais c'est d'avoir dans ces tables de nombreuses clefs étrangères qui sont mutuellement exclusives.
    Ça me donne une impression de bricolage ...
    En fait, en reprenant ma question, j'aurais deux Pb a gérer :
    Une hiérarchie d'objets qui ne serait pas figée.
    et
    Un lien entre des type d'objets qui évolue selon la hierachie.
    La solution serait peut être un arbre intervallaire (cf article sur le site) pour gérer la hiérarchie d'objets et la solution de 'Maljuna Kris' pour les liens entre objets.
    Ca donnerait alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE InfraTelCo.Baie
    ( IdBaie INT( 6 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
      . . .
      IdLocal INT( 6 ) UNSIGNED NOT NULL ,
      Avec les données spécifiques à l'objet (ici 'Baie')
      . . .
      PRIMARY KEY ( IdBaie )
    ) ENGINE = MYISAM ;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE InfraTelCo.Local
    ( IdLocal INT( 6 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
      CptDroitLocal  INT( 6 ) UNSIGNED DEFAULT '0' NOT NULL,
      CptGaucheLocal INT( 6 ) UNSIGNED DEFAULT '0' NOT NULL,
      ProfondLocal INT( 6 ) UNSIGNED DEFAULT '1' NOT NULL,
      Pour gérer l'arbre intervallaire
      . . .
      IdObjetLocal INT( 6 ) UNSIGNED NOT NULL ,
      TypeObjetLocal ENUM ( 'Site', 'Salle', 'Travée', ...)
      Pour connaître quelle table interroger
      . . .
      PRIMARY KEY ( IdLocal )
    ) ENGINE = MYISAM ;
    Il me reste un inconvénient : c'est que je ne peut pas avoir toutes les données en un seul SELECT car le choix de la table à interroger depuis la table 'Local' impose un traitement pour construire la requête.

    Peut être avec une procédure stockée ? Mais là j'ai jamais fait ...

    D'autres idées ???

  6. #6
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Citation Envoyé par -( Jean-Michel )- Voir le message
    Il me reste un inconvénient : c'est que je ne peut pas avoir toutes les données en un seul SELECT car le choix de la table à interroger depuis la table 'Local' impose un traitement pour construire la requête.

    Peut être avec une procédure stockée ? Mais là j'ai jamais fait ...

    D'autres idées ???
    Puisque chaque local n'aura une liaison que vers une seule de ces tables, tu peux faire des jointures externes (LEFT JOIN) vers chacune de ces tables, seule l'une d'entre elle apportera ses colonnes au SELECT, les autres retourneront NULL pour les colonnes du SELECT qui les concernent.
    Ce qui ne devrait pas poser problème puisque les colonnes spécifiques d'un type de local sont connues et seront seules utilisées.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 287
    Par défaut
    Ceci dit, en termes de modélisation, il me semble qu'une table hiérarchique unique, avec une colonne "type d'objet" serait effectivement plus adaptée, même s'il faut multiplier les colonnes nullables.

    Par ailleurs, LOCAL est un mot réservé, donc je déconseille son utilisation comme nom de table...

  8. #8
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Je crois que PostgeSql propose des tables dérivables à partir d'une table mère, un peu comme des classes qui peuvent hériter d'une classe supérieure.
    Ce qui est développé ici
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Par défaut
    C'est une bonne idée ...

    Par contre en utilisant les informations dont je dispose sur les volumétries à terme quand la base sera sortie du Bac à Sable et sera en Production, j'ai un peu peur des performances : J'aurais au total environ 1 million d'enregistrements (je dois représenter les points de connexions) dans mes différentes tables d'objets.

    Je pensais à une VUE mais les remarques sur les performances me laissent dire que çà va pas le faire.
    Le LEFT JOIN est pour le moment la meilleur solution (en tout cas que je connaisse).
    Je vais faire des essais sur la procédure stockée pour avoir une idée de la complexité.
    Je vais en causer avec mon Boss pour avoir le feu vert. Quand j'aurais choisi la solution je la placerais pour clore le sujet.

    Merci de ces échanges.

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/10/2014, 17h46
  2. Regrouper des clients au sein d'une "même famille"
    Par MDsas dans le forum SAS Base
    Réponses: 21
    Dernier message: 18/06/2014, 11h59
  3. [2.x] Plusieurs entités pour une même table doctrine
    Par JackStrieger dans le forum Symfony
    Réponses: 0
    Dernier message: 15/01/2014, 13h47
  4. [Modèle Relationnel] Des membres appartiennent à une même famille
    Par Tidus159 dans le forum Schéma
    Réponses: 8
    Dernier message: 04/01/2009, 02h12
  5. Plusieurs entités pour une même relation
    Par Mandotnet dans le forum Schéma
    Réponses: 1
    Dernier message: 08/04/2007, 19h13

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