1. #1
    Nouveau Membre du Club
    Profil pro
    Inscrit en
    mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 94
    Points : 32
    Points
    32

    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é Sénior Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    juillet 2007
    Messages
    3 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : juillet 2007
    Messages : 3 117
    Points : 4 550
    Points
    4 550

    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
    Nouveau Membre du Club
    Profil pro
    Inscrit en
    mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 94
    Points : 32
    Points
    32

    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 Confirmé Sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    septembre 2006
    Messages
    5 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

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

    Informations forums :
    Inscription : septembre 2006
    Messages : 5 165
    Points : 14 922
    Points
    14 922
    Billets dans le blog
    5

    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)...
    Faites simple, mais pas plus simple ! (A. Einstein)
    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 »)


    De grâce, pas de questions techniques par MP, ma boîte de réception explose !
    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !)

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

    Informations forums :
    Inscription : juillet 2007
    Messages : 3 117
    Points : 4 550
    Points
    4 550

    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 Confirmé Sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    septembre 2006
    Messages
    5 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

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

    Informations forums :
    Inscription : septembre 2006
    Messages : 5 165
    Points : 14 922
    Points
    14 922
    Billets dans le blog
    5

    Par défaut

    Citation Envoyé par Richard_35 Voir le message
    un trigger qui contrôle idSalarie<>IdSalarieSuperieur
    Une contrainte de table (CHECK) suffira.
    Faites simple, mais pas plus simple ! (A. Einstein)
    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 »)


    De grâce, pas de questions techniques par MP, ma boîte de réception explose !
    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !)

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

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