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 30/03/2011, 04h34   #1
Invité de passage
 
Inscription : mars 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 2
Points : 0
Points : 0
Par défaut Association réflexive et concaténation de PK

Bonjour,

Je débute en base de données et je suis perplexe concernant la concrétisation dans la base d'une relation réflexive.

Je cherche à permettre à des utilisateurs définis par un Id (PK) de ma table USER de "s'abonner" à d'autres USER.

J'aurais donc une table USER avec une autre table ABONNEMENT qui je pense comporterait pour clé primaire la concaténation des deux Id des USERS dans le sens Id.de.l'abonné#Id_User_Suivi.

Là où je bloque c'est sur le traitement ultérieur des données. Prenons par exemple le user 845 qui suit le user 1567, la concaténation donnera donc 8451567. Comment reconnaitre dans le traitement l'id de l'abonné parmi cette suite de chiffre ?

Placer un point entre chaque Id, tel que 845.1567, et donc avoir un type VARCHAR pour cet attribut ? (ça ne ralentirait pas drastiquement les temps de traitement?).

Merci pour vos idées sur cette question (qui peut parait farfelue, il existe peut-être des solutions beaucoup plus simple...)
ido_p est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2011, 05h12   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
La concaténation de PK est une mauvaise idée, indépendamment des perfs.
La table abonnement aura 2 colonnes :
abonnemnent (id_user,abonne) par exemple
où (id_user,abonne) est une PK ou au minimum une Uk (contrainte d'unicité) car 1 user ne peux s'abonner qu'à un autre user distinct (et pas plusieurs fois au même user)
Par ailleur "id_user" et "abonne" seront des clés étrangères de la table user pour éviter qu'un user puisse s'abonner à un user qui n'existe pas.

Donc il y aura abonnement(845,1567) mais aussi (845,1578) ....
et comme ça tout sera plus simple
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2011, 15h18   #3
Invité de passage
 
Inscription : mars 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 2
Points : 0
Points : 0
Merci pour ta réponse.

Si je comprends bien, pas tu préconises une table Abonnement avec en PK un Id_Abonnement (du type auto_increment) et deux attributs Id_User et Id_User_Suivi.

C'est bien ça ?

Edit: non, ça ne doit pas être ça: tu parles d'une PK formée par les deux attributs. Une PK peut être composée de deux colonnes ? (oui, je suis une bille en BDD)

Edit2: Primary keys can also constrain more than one column; the syntax is similar to unique constraints: PRIMARY KEY (a, c)
Je crois que c'est plutôt ça
ido_p est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2011, 17h42   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Citation:
Envoyé par ido_p Voir le message
Edit2: Primary keys can also constrain more than one column; the syntax is similar to unique constraints: PRIMARY KEY (a, c)
Je crois que c'est plutôt ça
Oui c'est pluôt ça, mais si la table abonnement est reliée à d'autres tables (autre que user) alors tu peux avoir une PK autoincrémentée et dans ce cas il faut créer une contrainte d'unicité sur (id_user,id_user_suivi) de la table abonnement, tout dépend du modèle dans sa totalité.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 08h55   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 998
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 998
Points : 18 262
Points : 18 262
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par skuatamad Voir le message
Oui c'est pluôt ça, mais si la table abonnement est reliée à d'autres tables (autre que user) alors tu peux avoir une PK autoincrémentée et dans ce cas il faut créer une contrainte d'unicité sur (id_user,id_user_suivi) de la table abonnement, tout dépend du modèle dans sa totalité.
Ou pas !
On peut très bien propager une clé primaire multi-colonnes en clé étrangère dans d'autres tables.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement 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 20h56.


 
 
 
 
Partenaires

Hébergement Web