Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Nouveau Membre du Club
    Profil pro Stephen
    Inscrit en
    mars 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Nom : Stephen
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 96
    Points : 28
    Points
    28

    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 :
    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
    2 989
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : juillet 2007
    Messages : 2 989
    Points : 3 898
    Points
    3 898

    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 :
    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 :
    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 Stephen
    Inscrit en
    mars 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Nom : Stephen
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 96
    Points : 28
    Points
    28

    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 François de Sainte Marie
    Spécialiste en bases de données
    Inscrit en
    septembre 2006
    Messages
    4 634
    Détails du profil
    Informations personnelles :
    Nom : Homme François de Sainte Marie
    Localisation : Autre

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

    Informations forums :
    Inscription : septembre 2006
    Messages : 4 634
    Points : 12 293
    Points
    12 293

    Par défaut

    Citation Envoyé par Richard_35 Voir le message
    Code :
    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é Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    juillet 2007
    Messages
    2 989
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : juillet 2007
    Messages : 2 989
    Points : 3 898
    Points
    3 898

    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 François de Sainte Marie
    Spécialiste en bases de données
    Inscrit en
    septembre 2006
    Messages
    4 634
    Détails du profil
    Informations personnelles :
    Nom : Homme François de Sainte Marie
    Localisation : Autre

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

    Informations forums :
    Inscription : septembre 2006
    Messages : 4 634
    Points : 12 293
    Points
    12 293

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •