Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/04/2011, 23h30   #1
Invité de passage
 
Inscription : janvier 2007
Messages : 17
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 17
Points : 2
Points : 2
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
vince3147 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 10h27   #2
Membre régulier
 
Olivier Albertini
Inscription : avril 2006
Messages : 194
Détails du profil
Informations personnelles :
Nom : Olivier Albertini

Informations forums :
Inscription : avril 2006
Messages : 194
Points : 77
Points : 77
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
lerieure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 18h37   #3
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
voici les tables adéquates

Code :
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 :
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 +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h41.


 
 
 
 
Partenaires

Hébergement Web