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

Langage SQL Discussion :

Modéliser un lien (n,m) d'une table vers elle-même


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 17
    Points : 11
    Points
    11
    Par défaut Modéliser un lien (n,m) d'une table vers elle-même
    Bonjour,
    Je voudrais savoir quelle est la meilleure méthode pour modéliser un lien (n,m) d'une table vers elle-même.
    Exemple: si facebook avait une table "Utilisateurs", comment représenteriez-vous un lien d'amitié ?
    Si Pierre est ami avec Paul et Jacques (Paul et Jacques ne sont pas amis)

    - soit je stocke dans ma table d'association un seul lien (arbitrairement)
    (ID_Paul, ID_Pierre)
    (ID_Pierre, ID_Jacques)
    => Dans ce cas là, toutes les requêtes de l'application doivent être dédoublées : pour les amis de Pierre : select champ2 from Utilisateurs where champ1=ID_Pierre UNION select champ1 from Utilisateurs where champ2=ID_Pierre

    - soit je stocke tout en double
    (ID_Paul, ID_Pierre)
    (ID_Pierre, ID_Paul)
    (ID_Pierre, ID_Jacques)
    (ID_Jacques, ID_Pierre)
    ce qui permet d'avoir une requête propre (pour les amis de Pierre select champ2 from Utilisateurs where champ1=ID_Pierre), mais l'information est dupliquée.

    D'autres solutions? Qu'est-ce qui est recommandé?
    Merci

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    soit avec cette méthode

    les CTE

    soit avec celle-ci

    arborescence intervallaire

    après tout dépend de la profondeur et de ce que vous allez concrètement faire

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 902
    Points : 53 143
    Points
    53 143
    Billets dans le blog
    6
    Par défaut
    voici les tables adéquates

    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 T_PERSONNE_PRS
    (PRS_ID                INT NOT NULL PRIMARY KEY,
     PRS_NOM               ...);
     
    CREATE TABLE T_AMI
    (AMI_ID                INT NOT NULL PRIMARY KEY,
     AMI_DEMANDE           DATE NOT NULL DEFAULT CURRENT_TIMESTAMP,
     PRS_ID_DEMANDEUR      INT NOT NULL 
        FOREIGN KEY REFERENCES T_PERSONNE_PRS (PRS_ID),
     PRS_ID_DESTINATAIRE   INT NOT NULL 
        FOREIGN KEY REFERENCES T_PERSONNE_PRS (PRS_ID),
     AMI_REPONSE           DATE NOT NULL DEFAULT CURRENT_TIMESTAMP,    
     AMI_OK                BOOLEAN NOT NULL DEFAULT 0);
    mais si vous ne voulez pas de doublosn d'amis (pierre ami avec paul et paul avec pierre, il faut rajouter une contrainte sous forme d'assertion, du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE ASSERTION ASS_AMI_NON_RECIPROQUE
    CHECK NOT EXISTS (SELECT *
                      FROM   T_AMI AS T1
                             INNER JOIN T_AMI AS T2
                                   ON T1.PRS_ID_DEMANDEUR = T2.PRS_ID_DESTINATAIRE
                                      AND T1.PRS_ID_DESTINATAIRE = T2.PRS_ID_DEMANDEUR
                      WHERE  T1.AMI_OK = true
                        AND  T2.AMI_OK = true);
    A +

Discussions similaires

  1. [Débutant] EF4.1 et relation d'une table vers elle même
    Par 105rn2 dans le forum Entity Framework
    Réponses: 6
    Dernier message: 24/04/2013, 19h14
  2. Probleme jointure d'une table sur elle même
    Par fred64 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 18/05/2006, 15h01
  3. [SQL2K] delete cascade d'une table sur elle même
    Par StormimOn dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/04/2006, 16h28
  4. Croisement d'une table avec elle même
    Par lelapin dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/09/2005, 07h44
  5. [arborescence] jointure d'une table avec elle même ?
    Par Celelibi dans le forum Requêtes
    Réponses: 2
    Dernier message: 16/11/2004, 18h48

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