2009-03-21 4 views
3

Ich versuche zu entscheiden, wie eine Beziehung von Datensätzen in einer relationalen Datenbank am besten modelliert werden kann. Es ist die klassische Freund/Nachfolgemodell:Modellierung von Freunden und Followern in einem RDBMS

~~~~

Ein Benutzer Null zu viele Freunde haben.
Ein Benutzer kann null bis viele Follower haben.

Freunde und Follower sind beide Benutzer selbst.

~~~~~

Was ist der beste Weg, dies zu modellieren?

Danke!

+0

Wichtige Frage: Wie beziehen sich Freunde Anhänger? , d. H. Kann mein Freund auch mein Anhänger sein? – deworde

+0

Und wenn ich meinem Nachfolger folge, werden wir Freunde? – deworde

Antwort

11

Benutzer (Benutzer-ID, ...)
Abonnement (Subscriber, Publisher)
Freundschaft (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

Da, wenn A Freund B ist, ist B auch ein Freund von A. Wir könnten entweder beide Beziehungen aufzeichnen oder wir könnten nur einen behalten. Mit dieser Prüfbeschränkung erzwingen wir, dass die ID des ersten Benutzers immer kleiner ist als die ID des zweiten Benutzers, sodass wir immer wissen, wie man nach Freundschaft sucht, und es wird keine Betrüger geben. –

+0

Und ein "Möchtegern-Freund", wo es keine Gegenseitigkeit gibt, ist ein "Follower" unter dieser Definition? Ansonsten würde ich wahrscheinlich die Friendship-Tabelle asymmetrisch halten: Ein Eintrag würde aufzeichnen, dass UserA UserB als Freund ansieht, und ein separater Eintrag würde aufzeichnen, dass UserB UserA als Freund ansieht. –

+0

@ Jonathan: Ich stimme zu, dass Sie eine "Freundeseinladung" speichern müssen, die noch nicht akzeptiert wurde. Vielleicht enthält eine andere Tabelle "Einladungen", die direktional ist, das Datum der Einladung (falls es ablaufen muss), usw. Sobald der Empfänger akzeptiert, bewegt er sich in die "Freundschaft" -Tabelle. –

Verwandte Themen