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 :

Relation réflexive sur une table [MLD]


Sujet :

Schéma

  1. #1
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Mars 2009
    Messages : 94
    Points : 69
    Points
    69
    Par défaut Relation réflexive sur une table
    Bonjour,

    Je me demandais si les associations réflexives étaient une mauvaise pratique en général.

    Exemple classique, une table Salarié, dont chaque champ est composé de : id, nom, prénom, supérieur_hiérarchique où supérieur_hiérarchique pointe sur un autre champ de la table salarié.

    La question est : cela pose-t-il problème de fonctionner ainsi, c'est à dire est-il faire une table de mariage qui gère cet appairage simple ?

    Exemple pratique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (id), (nom), (prenom), (superieur_hierarchique)
    1, toto, toto, NULL
    2, moi, moi, 1
    Merci

  2. #2
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Bonjour Steph0,

    Citation Envoyé par Steph0
    Je me demandais si les associations réflexives étaient une mauvaise pratique en général.
    ==> non. Mais cela dépend du contexte : des règles de gestion.

    De ce point de vue, ton exemple est significatif. Les données que tu présentes reflète ces règles de gestion :
    • 1 salarié reporte à 0 (NULL) ou 1 seul supérieur hiérarchique ;
    • 1 supérieur hiérarchique a, sous sa responsabilité, 1 ou n salariés.

    donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Salarie -0,1--+
       |          |  
       |     [Reporter à]
       |          |
       +---- 1,n--+
    donnant :
    Salarie(id, nom, ...)
    Salarie_Superieur(idSalarie, #IdSalarieSuperieur, ...)
    une table associative, à cause du fait qu'un salarié peut ne pas avoir de supérieur hiérarchique. En effet, la possibilité qu'une clé étrangère soit nulle est dangereuse performance, quota, etc...).

    A contrario, si tes règles de gestion avaient été :
    • 1 salarié reporte, obligatoirement, à 1 et 1 seul supérieur hiérarchique ;
    • 1 supérieur hiérarchique a, sous sa responsabilité, 1 ou n salariés.

    donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Salarie -1,1--+
       |          |  
       |     [Reporter à]
       |          |
       +---- 1,n--+
    donnant :
    Salarie(id, nom, #IdSalarieSuperieur,...)
    N.B : la solution de la table associative peut s'avérer payante, même dans le second cas : par exemple, si ton association (réflexive) doit posséder des attributs propres (date de collaboration entre idSalarie et IdSalarieSuperieur, ...).
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  3. #3
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Mars 2009
    Messages : 94
    Points : 69
    Points
    69
    Par défaut
    Bonjour,

    Merci pour votre réponse détaillée. Cela répond parfaitement à ma question (il s'agit du premier cas pour moi).

    Je retiens néanmoins que de manière générale une table associative reste la bonne solution, sans parler de bonnes ou mauvaises pratiques.

    Merci

  4. #4
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par Richard_35 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Salarie -1,1--+
       |          |  
       |     [Reporter à]
       |          |
       +---- 1,n--+
    Adam est donc le fils de quelqu’un (quitte à ce qu'il soit son propre père, réflexivité oblige), et c’est parti pour une boucle infinie si on n’y prend pas garde lors de la manipulation des données (jointure récursive et toutes ces sortes de choses)...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  5. #5
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Bonjour Fsmrel,

    C'est vrai, et ma réponse était incomplète.
    Salarie(id, nom, ...)
    Salarie_Superieur(idSalarie, #IdSalarieSuperieur, ...)
    avec, dans un premier temps, un trigger qui contrôle idSalarie<>IdSalarieSuperieur.

    Dans un second temps, nous sommes dans la problématique des nomenclatures et je ne vois pas d'autre moyen que de créer un second trigger qui contrôle que les arborescences "ne se mordent pas la queue". C'est ce que font les GPAO, en général, avec les nomenclatures de produits finis.
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  6. #6
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par Richard_35 Voir le message
    un trigger qui contrôle idSalarie<>IdSalarieSuperieur
    Une contrainte de table (CHECK) suffira.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

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

Discussions similaires

  1. [1.x] save() impossible sur une table en relation n:n
    Par etoileweb dans le forum Symfony
    Réponses: 10
    Dernier message: 14/11/2010, 18h59
  2. Trigger delete sur une table réflexive
    Par oxino dans le forum PL/SQL
    Réponses: 4
    Dernier message: 29/06/2010, 11h17
  3. [AC-2003] Requête UPDATE sur une table sans relation
    Par SIGER_971 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 09/07/2009, 09h02
  4. [SQL] update sur une table de la relation
    Par comme de bien entendu dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 07/01/2009, 14h24
  5. relations multiples sur une table
    Par lapuce dans le forum Modélisation
    Réponses: 2
    Dernier message: 18/07/2007, 17h58

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