2016-06-10 7 views
1

Ich weiß, dass der Titel nicht so beschreibt, aber es ist wirklich schwer, etwas Generisches zu finden, um meine Situation zu beschreiben. Wenn jemand bearbeiten möchte, fühlen Sie sich frei ...Beste Art, nachgestellte Benutzer zu speichern

So habe ich eine Postgres-Datenbank, mit einer users Tabelle. Ich möchte die Benutzer, die von einem Benutzer gefolgt werden, speichern, und ich sehe wirklich nicht, wie ich das tun könnte. Ich möchte gerne SELECT followed_users FROM users WHERE username='username' tun und dies würde mir jeden Benutzernamen, ID oder was auch immer von jedem folgenden Benutzer zurückgeben. Aber ich sehe keine saubere Weg, dies zu tun.

Vielleicht würde ein Beispiel mehr beschreiben: user1 wird user2 und user3 folgen.
Wie speichern, wer user1 folgt?

EDIT: Ich weiß nicht, wie viele Benutzer der Benutzer folgen wird.

Vielen Dank für Ihre Hilfe.

+1

eine neue Tabelle erstellen genannt etwas wie 'user_follows' mit Säulen wie' Benutzer-ID1 | user_id2' oder 'follower_id | follows_id' wenn du mehr Beschreibung willst, oder wenn du denkst, dass du mehr Beziehungen neben 'follows' hast, dann mache eine Tabelle wie' relationships' mit 'user_id1 | Benutzer_ID2 | Beziehung 'wo' relations.relationship' Werte wie 'follows, student of, sister of' usw. haben könnte ... – JNevill

+0

Ich habe vergessen zu erwähnen: Ich weiß nicht, wie viele Benutzer der Benutzer folgen wird, also weiß ich nicht Wenn das eine nette Lösung wäre oder ich die Antwort nicht verstanden hätte. Entschuldigung, wenn ich nicht verstehe, ist es schwierig für mich, dies zu visualisieren – mgul

+0

@Jhun Basierend auf Ihrer Beschreibung, JNevill Lösung (in den Kommentaren) wird Ihre beste Option sein. Um es zu erweitern, um die Benutzer zu erhalten, denen ein Benutzer folgt, würden Sie etwas tun wie 'SELECT * FROM Benutzer WHERE Benutzer_ID IN (SELECT Benutzer_ID2 FROM Benutzer_Follows WHERE Benutzer_ID1 =' 4 ') ' –

Antwort

3

Ausbau oben auf meinen Kommentar, da es wortreich bekam:

eine neue Tabelle etwas wie user_follows mit Spalten genannt Erstellen wie

user_id1 | user_id2 

oder

follower_id | follows_id 

Dann können Sie abfragen:

SELECT t1.username as follower_username, t3.username as following_usernae 
FROM users t1 
    INNER JOIN user_follows t2 ON t1.user_id = t2.follower_id 
    INNER JOIN users t3 ON t2.following_id = t3.user_id 
WHERE t1.user_id = <your user> 

Am Ende, denken Sie an Ihre Tabellen als "Objekte". Wenn Sie dann ein Problem wie "Hinzufügen von Benutzern, die anderen Benutzern folgen" angezeigt werden, können Sie feststellen, ob diese Beziehung ein neues Objekt oder ein Attribut eines vorhandenen Objekts ist. Da ein Benutzer möglicherweise mehr als einem anderen Benutzer folgt, ist die Beziehung kein gutes Attribut für "Benutzer". Daher erhält er eine eigene Tabelle user_follows.

Da user_follows ist nur eine Art von Beziehung, die zwei Benutzer miteinander haben können, könnte es Sinn machen, den Anwendungsbereich dieses Objekt zu relationships und speichern den Beziehungstyp als ein Attribut der Tabelle zu erhöhen:

user_id1 | user_id2 | relationship_type 

wo relationships.relationship_type könnten Werte wie follows, student of, sister von etc haben ...

So würde die neue Abfrage so etwas wie:

SELECT t1.username as follower_username, t3.username as following_username 
FROM users t1 
    INNER JOIN relationships t2 ON t1.user_id = t2.user_id1 
    INNER JOIN users t3 ON t2.user_id2 = t3.user_id 
WHERE t1.user_id = <your user> AND t2.relationship_type = 'Follows'; 
+0

Ich bleibe bei diesem Design. Vielen Dank! – mgul

1

ich eine weitere Tabelle hinzufügen würde, machen wir es für Argument willen following nennen, die Paare von Benutzern und Benutzern speichert sie sind folgende:

CREATE TABLE following (
    user_id INT NOT NULL REFERENCES users(id), 
    following_id INT NOT NULL REFERENCES users(id), 
    PRIMARY KEY (user_id, following_id) 
) 

Dann könnten Sie fragen die alle Benutzer eines bestimmten Benutzers folgt durch den Beitritt mit der users Tabelle (zweimal). Z.B., Die Namen aller Benutzer erhalten, die ich (username „mureinik“) am folgenden:

SELECT fu.username 
FROM following f 
JOIN users u ON f.user_id = u.id 
JOIN users fu ON f.user_id = fu.id 
WHERE u.username = 'mureinik' 
+0

Vielen Dank für Ihre Hilfe, ich bleibe dabei, denn es ist das gleiche Design wie @ JNevill's – mgul

Verwandte Themen