2009-03-21 6 views
3

J'essaie de déterminer la meilleure façon de modéliser une relation d'enregistrements dans une base de données relationnelle. Il est le modèle ami/de suivi classique:Modélisation d'amis et de suiveurs dans un SGBDR

~~~~

Un utilisateur peut avoir zéro à beaucoup d'amis.
Un utilisateur peut avoir zéro à plusieurs abonnés.

Les amis et les abonnés sont eux-mêmes des utilisateurs.

~~~~~

Quelle est la meilleure façon de modéliser ce?

Merci!

+0

question importante: Comment les amis se rapportent aux disciples? Par exemple, mon ami peut-il également être mon suiveur? – deworde

+0

Et si je suis mon disciple, devenons-nous amis? – deworde

Répondre

11

utilisateurs (UserId, ...)
Abonnement (abonné, Publisher)
Amitié (FirstUser, SecondUser)

CREATE TABLE Users (
    UserID int not null primary key, 
    ... 
) 

CREATE TABLE Subscription (
    Subscriber int not null references Users(UserID), 
    Publisher int not null references Users(UserID), 
    constraint ck_NotEqual check (Subscriber <> Publisher) 
) 

CREATE TABLE Friendship (
    FirstUser int not null references Users(UserID), 
    SecondUser int not null references Users(UserID), 
    constraint ck_Order check (FirstUser < SecondUser) -- since friendship is reflective 
) 
+0

Puisque si A est un ami B, B est aussi un ami de A. Nous pourrions soit enregistrer les deux relations, soit en conserver une. Avec cette contrainte de vérification, nous insistons sur le fait que l'identifiant du premier utilisateur est toujours inférieur à l'identifiant de la seconde afin que nous puissions toujours savoir comment vérifier l'amitié et qu'il n'y aura pas de dupes. –

+0

Et un «ami potentiel» où il n'y a pas de réciprocité est un «suiveur» selon cette définition? Sinon, je garderais probablement asymétrique la table Friendship: une entrée enregistrerait que UserA considère UserB comme un ami, et une entrée séparée enregistrerait que UserB considère UserA comme un ami. –

+0

@Jonathan: Je suis d'accord que vous devez être en mesure de stocker une "invitation d'ami" qui n'a pas encore été acceptée. Peut-être une autre table "Invitations" qui est directionnelle, inclut la date de l'invitation (dans le cas où elle doit expirer), etc. Une fois que le destinataire accepte, il se déplace vers la table 'Friendship'. –

Questions connexes