SQL - Best Practice für einen Friendship-Tisch

8
  

Bevor Sie mir Duplikate zeigen, beachten Sie bitte, dass ich die Seite durchsucht habe und einige einige Beispiele gefunden habe, die aber nicht ganz spezifisch für mein Problem sind:)

Was ist der beste Weg, um eine Friendship -Tabelle in SQL zu erstellen, aber sicherzustellen, dass jede Zeile eindeutig ist in dem Sinne, dass die gleiche UserID und FriendID niemals erlaubt sind, unabhängig davon, zu welcher Spalte sie gehören ?

Ich habe dieses grobe Beispiel

%Vor%

Und es gibt 2 Fremdschlüssel für die Tabelle "Benutzer", sowohl von UserID als auch von FriendID.

Im Moment kann ich jedoch eine Freundschaft zwischen Benutzern zweimal einfügen und so ein Duplikat erstellen. Beispiel

%Vor%

Wie stelle ich sicher, dass diese Integrität erzwungen wird, vielleicht 2 PKs ? Eine Art eindeutiger Index ? Oder würden Sie insgesamt ein besseres Tischdesign vorschlagen? Würden Sie auch eine autoinkrementierende FriendshipID setzen? Wenn ja, kannst du erklären warum?

    
Marko 18.11.2010, 21:55
quelle

5 Antworten

13

Erstellen des Primärschlüssels für die Tabelle FRIENDSHIP :

  • Benutzer-ID
  • friendid

... stellt sicher, dass Sie keine Duplikate in der Reihenfolge haben können. Das heißt, es wird Sie davon abhalten, Duplikate von Benutzer-ID "123" und Friendid "789" hinzuzufügen. Wenn Sie die Statusspalte angeben, ist dies nicht mehr der Fall, da ein anderer Statuswert Dubletten der Spalten "userid" und "friendid" zulässt.

Stoppen von umgekehrten Paaren

Um umgekehrte Paare zu stoppen - Benutzer-ID "789" und Freund-ID "123" - müssen Sie entweder die Logik einschließen, um zu überprüfen, ob das Paar bereits in der Tabelle in einer gespeicherten Prozedur, Funktion oder Trigger vorhanden ist. Eine CHECK-Einschränkung der Benutzer-ID & lt; Friendid würde einen gültigen Versuch beenden, Benutzerid "789" und Friendid "123" hinzuzufügen, wenn das Reverse nicht bereits vorhanden ist.

%Vor%     
OMG Ponies 18.11.2010, 22:20
quelle
4

Quassnoi hat einen Artikel geschrieben, der erklärt, warum Sie eine Version der Tabelle mit zwei Zeilen pro Paar haben möchten, um Abfragen zu vereinfachen: Ссылка

(der Artikel spricht über MySQL, aber es ist es wert, als eine Leistungstechnik für jede SQL-Datenbank in Betracht gezogen zu werden)

    
araqnid 14.12.2010 22:31
quelle
1

Ich habe eine kleine Änderung vorgenommen, um die interne Abfrage durchzuführen, und gebe nur einen Datensatz zurück, wenn er existiert (doppelte Tabelle) am Ende der runden Klammern

%Vor%     
alejo 03.07.2012 16:54
quelle
0
%Vor%

Sie können eine UNIQUE-Einschränkung hinzufügen, um zu verhindern, dass ein Benutzer zweimal in einer Freundschaft ist.

Sie haben Nutzer und Freundschaften. Benutzer können Freundschaften (die 0 oder mehr Benutzer sein können) beitreten, indem sie einen Datensatz in der dritten Tabelle erstellen.

    
Amy B 18.11.2010 21:59
quelle
0

Benutzer (Benutzer-ID) Freundschaft (User1ID, User2ID, FriendshipStatus)

Prüfe Einschränkung: User1ID & lt; User2ID

Eindeutige Einschränkung: User1ID, User2ID

    
Stu 18.11.2010 22:07
quelle