Ich habe eine MySQL-Tabelle für Benutzer mit dem Primärschlüssel _id, und ich möchte Freundschaften (Sichtbarkeit auf Freundeslisten anderer Benutzer) als ein darstellen Tabelle mit Paaren von Fremdschlüsseln userId. Ich denke, so etwas wie:SQL Composite Primärschlüssel ohne Reihenfolge (Paar von ganzen Zahlen in jeder Reihenfolge muss eindeutig sein)
CREATE TABLE UserFriendships (
userIdA INT NOT NULL,
userIdB INT NOT NULL,
PRIMARY KEY (userIdA, userIdB),
FOREIGN KEY (userIdA) REFERENCES Users(_id)
FOREIGN KEY (userIdB) REFERENCES Users(_id)
)
Es ist mein Verständnis, dass dies sowohl (userIdA = 2, userIdB = 7)
und (userIdA = 7, userIdB = 2)
erlauben wird als eindeutige Zeilen eingefügt werden. Ich möchte eine Zeile pro Freundschaft, also eine Zeile pro Paar userIds.
Weiß jemand, wie ich das verbessern könnte? Selbst wenn die obige Einschränkung erfüllt ist, muss ich eine Union erstellen, um eine Liste aller Freunde von Benutzer foo zu erhalten: SELECT userIdB AS friendUserId WHERE userIdA = foo UNION SELECT userIdA WHERE userIdB = foo
. Ist dies der beste Weg, um diese Abfrage durchzuführen, oder sollte ich darüber nachdenken, mein Schema zu ändern?
Wie gehen Sie mit der Hin- und Herbewegung um? – Strawberry
Wäre mit jedem anderen DBMS recht einfach, aber bei MySQL kann ich mir nur eine Trigger-Lösung vorstellen, um dies zu verhindern. –
@Strawberry Ich hatte nicht daran gedacht, aber ich kann eine separate Tabelle von FriendRequests einschließen, die, sobald sie reziprokiert sind, eine Einfügung in UserFriendships ergeben. Obwohl sie die gleichen Daten enthalten würden, scheint das überflüssig zu sein ... –