2017-11-12 5 views
0

Arbeitet derzeit an einer MySQL-Struktur für eine soziale Netzwerk-Site.MySQL-Limit-Beziehungstabelle mit FIFO

Ich habe eine Anforderung: ein Benutzer kann nur maximal 5 Freunde haben, und beim Hinzufügen eines sechsten würde es den ältesten (FIFO) entfernen, und ich bin mir nicht ganz sicher, was der beste Weg ist, das zu lösen .

In meinem Backend-Code füge ich auch eine Einschränkung beim Hinzufügen eines Benutzers, so dass user1_id < user2_id.

ist die entsprechende Tabelle:

CREATE TABLE friendships (
user1_id INT, 
user2_id INT, 
date_added DATETIME DEFAULT CURRENT_TIMESTAMP, 
FOREIGN KEY (user1_id) 
    REFERENCES users (id) 
    ON DELETE CASCADE, 
FOREIGN KEY (user2_id) 
    REFERENCES users (id) 
    ON DELETE CASCADE 
); 

CREATE UNIQUE index single on friendships (user1_id, user2_id); 

Ich dachte über einen Trigger und schrieb dies mit:

CREATE TRIGGER inFriendships 
BEFORE INSERT ON friendships 
FOR EACH ROW 
BEGIN 
    DECLARE current_amount_user1 INT DEFAULT 0; 
    DECLARE current_amount_user2 INT DEFAULT 0; 
    SET current_amount_user1 = (SELECT COUNT(*) FROM friendships WHERE (user1_id = NEW.user1_id OR user2_id = NEW.user1_id)); 
    IF current_amount_user1 = 5 
    THEN 
     DELETE FROM friendships WHERE date_added IS NOT NULL AND (user1_id = NEW.user1_id OR user2_id = NEW.user1_id) order by date_added desc LIMIT 1; 
    END IF; 
    SET current_amount_user2 = (SELECT COUNT(*) FROM friendships WHERE (user1_id = NEW.user2_id OR user2_id = NEW.user2_id)); 
    IF current_amount_user2 = 5 
    THEN 
     DELETE FROM friendships WHERE date_added IS NOT NULL AND (user1_id = NEW.user2_id OR user2_id = NEW.user2_id) order by date_added desc LIMIT 1; 
    END IF; 
END; 

Aber ich lief mit toten Schlösser ein Problem in und ich versuche jetzt finde eine andere Lösung.

Alle Lösungen und Ideen sind sowohl SQL und Back-End-Pseudo-Code willkommen.

Antwort

0

(user1_id = NEW.user2_id OR user2_id = NEW.user2_id) würde bedeuten, dass ein Benutzer nur mit höchstens 5 Personen assoziiert werden kann. Es sollte einen Sinn geben; user1_id sollte die ID des übergeordneten Benutzers sein, und user2_id sollte der untergeordnete Benutzer sein. dies mit daran, die Anzahl der Freunde eines Nutzers erhalten tun:

SELECT user1_id, user2_id, date_updated from friendships where user1_id=NEW.user1_id; 

Sie Einfügen von Daten in Freundschaften ermöglichen können, dann einen Trigger laufen nach Einsatz des ältesten Freund zu entfernen, wenn die Anzahl der Freunde mehr als 5.

+0

Ich erhalte diesen Fehler: "Tabelle 'Freundschaften' in gespeicherten Funktion/Trigger kann nicht aktualisiert werden, da es bereits von Anweisung verwendet wird, die diese gespeicherte Funktion/Trigger aufgerufen hat ''. – OfekA