PHP - Fügen Sie Benutzer als Freunde hinzu

8

Ich habe eine soziale Website, Sie können Freunde hinzufügen. So funktioniert es:

  • klicken Sie auf Freund hinzufügen
  • fügen Sie den Benutzer hinzu, der auf ein geklickt hat Datenbankzeile, so in den Spalten [Bob] [Fred] [123123]
  • Fred akzeptiert es mit dem Geheimnis in einer Verifikation Link, per E-Mail.
  • Dies bringt dann eine weitere Zeile in die Datenbank umgekehrt, wie das [fred] [bob] [123123]

Ich kann dann feststellen, ob sie Freunde sind oder nicht und ob sie akzeptiert wurden.

Dies ist jedoch sicherlich nicht der richtige Weg. Ich bin mir jetzt sehr unsicher, ob ein Weg besser und reibungsloser verlaufen könnte.

    
ryryan 16.12.2010, 20:29
quelle

3 Antworten

7

Es gibt wirklich keinen richtigen oder falschen Weg, es ist das, was immer du entscheidest zu verwenden, am Ende des Tages ist es dein Code, also was immer du wählst und für dich arbeitet.

Wie auch immer, Sie sind ziemlich korrekt, wenn Sie zwei Zeilen eingeben, wäre das ein sehr hoher Overhead und Sie benötigen extra Platz für scheinbar keinen guten Grund. Viel einfacher können Sie eine andere Spalte in Ihrer DB setzen:

user_1 | user_2 | accept_code | accepted

user_1 Anforderungen zum Hinzufügen von user_2 als Freund - Sie legen einen accept_code fest, der einen Eintrag in der Datenbank erstellt. Legen Sie Ihre DB-Struktur so fest, dass die Spalte accepted auf als false festgelegt wird. Wenn die Zeile zum ersten Mal erstellt wird, sind die Benutzer momentan keine Freunde.

Mit Ihrem Beispiel: bob fragt fred als Freund an. Deine DB würde jetzt so aussehen:

bob | fred | 123123 | false

Wenn user_2 den accept_code eingibt, dann ändern Sie accepted in true.

bob | fred | 123123 | true

Auf diese Weise wird eine Abfrage Ihnen sagen, ob die zwei Benutzer Freunde sind, anstatt zwei Abfragen, um zu sehen, ob Sie zwei übereinstimmende DB-Einträge haben.

So hat Bob zum Beispiel fred, joe und alex als Freunde hinzugefügt, fred und alex haben Bob als Freund akzeptiert, aber Joe hat das nicht. Deine DB würde so aussehen:

user_1 | user_2 | accept_code | accepted

bob | fred | 123123 | true

bob | joe | 321321 | false

bob | alex | 789789 | true

Also zum Beispiel, eine psuedo wählen Sie vielleicht, finden Sie alle Freunde für Bob:

SELECT user_2 FROM relationships WHERE user_1="bob" AND accepted="true"

Das Ergebnis wäre:

fred alex

UPDATE wie in den Kommentaren:

DB-Struktur:

user_1 | user_2 | accept_code | accepted

bob | fred | 123 | true

bob | alex | 123 | true

bob | joe | 123 | false

ste | bob | 123 | true

joe | alex | 123 | true

Select-Anweisung:

SELECT * FROM relationships WHERE accepted = 'true' AND (user_1 = 'current_user' OR user_2 = 'current_user');

Beispiel 1 - Bob meldet sich an, er hat Freunde angefordert und wurde als Freund gefragt:

SELECT * FROM relationships WHERE accepted = 'true' AND (user_1 = 'bob' OR user_2 = 'bob');

Das Ergebnis:

bob | fred | 123 | accepted

bob | alex | 123 | accepted

ste | bob | 123 | accepted

Beispiel 2 - alex meldet sich an, er hat nie gefragt und Freunde, wurde aber als Freund gefragt:

SELECT * FROM relationships WHERE accepted = 'true' AND (user_1 = 'alex' OR user_2 = 'alex');

Das Ergebnis:

bob | alex | 123 | accepted

joe | alex | 123 | accepted

Beispiel 3 - Joe meldet sich an, er hat einen Freund angefordert und einen Freund abgelehnt:

SELECT * FROM relationships WHERE accepted = 'true' AND (user_1 = 'joe' OR user_2 = 'joe');

Das Ergebnis:

joe | alex | 123 | accepted

    
Scoobler 16.12.2010, 20:47
quelle
6

Social-Network-Datenbankbeziehungen können sehr schnell sehr kompliziert werden, besonders wenn der Traffic steigt und Anfragen fluten. Es gibt großartige Daten von den führenden Quellen wie Facebook in ihren Entwicklerblogs darüber, wie sie ihre Systeme geändert und angepasst haben skalieren Sie, wenn ihr Verkehr zunimmt.

Es gibt keinen richtigen Weg, um die Beziehung zu erstellen - das hängt von Ihrer Code-Struktur ab - aber es wird richtigerweise angenommen, dass es unnötig überflüssig ist, Ihre zwei Abfragen auszuführen, um eine einfache Eins-zu-eins-Beziehung zu erstellen Overhead.

Sie könnten eine einfache Junction-Tabelle mit den IDs der beiden Benutzer erstellen, wobei ein Feld angibt, von wem die Anfrage stammt (int Primärschlüssel des Benutzers) und der andere die Anfrage zur Genehmigung (auch der Primärschlüssel) empfängt. ) Sie könnten ein weiteres status int-Feld mit numerischen Werten haben, die dem Status der Beziehung entsprechen.

Sie sollten immer nummerische Schlüssel für die Identität Ihres Benutzers verwenden - Sie können nie wissen, wie viele 'Johns wird sich anschließen! Stellen Sie sicher, dass Sie nur eine einfache "Benutzer" -Tabelle mit Benutzer-IDs haben, die eindeutige Schlüssel sind.

%Vor%

Dies könnte natürlich andere Informationen, Nachnamen, Ort, Geschlecht, Lieblings Sylvester Stallone Film usw. enthalten.

Beziehungen können in einer separaten Beziehungstabelle mit der folgenden Struktur erstellt werden ... Wenn also Frank (ID 1) John (ID 2) anfordert, enden wir mit einer Zeile wie dieser.

%Vor%

Sie könnten dann einen Primärschlüssel für ALLE Beziehungen haben. Jeder einzelne Link wäre identifizierbar.

Ich persönlich würde auch eine andere Tabelle integrieren, um die Statusvariable zu definieren.

%Vor%

Auf diese Weise können Sie die Arten von Beziehungen im Programm erweitern, wenn Sie mehr wollten, wie zum Beispiel "Friended", "Deleted", "Blocked" usw. In den meisten Apps war diese Art von Daten ein guter Kandidat für XML , aber es ist nichts falsch daran, es in eine Datenbank zu werfen. Antworten vom Empfänger müssten die Beziehungs-ID abrufen und dann diesen Statuswert aktualisieren.

Das Hinzufügen eines Zeitstempels für Aktualisierungen in der Beziehungstabelle ist ebenfalls eine gute Idee.

Mit dieser Struktur können Sie einfach alle Freunde des Benutzers mit ihrer primären ID aus Ihrer Benutzertabelle abfragen. Lassen Sie uns Franks in eine Reihe bringen:

%Vor%

Dies ruft alle aktiven Freund-Benutzer-IDs für Frank ab, da er der Anforderer (1) ist und wir auf Anfragen beschränken, die vom Empfänger genehmigt wurden.

    
DeaconDesperado 16.12.2010 20:59
quelle
-1

hi Sie können diese Logik ausprobieren.

Nehmen wir an, Bob möchte Fred als Freund hinzufügen.

  1. bob sende fred als Freund hinzufügen

    Aktion: Es gibt eine Datenbank-Lookup-Tabelle als Freunde: [bob] [fred] [hide-only macht es sichtbar, wenn Bob es akzeptiert]

  2. fred akzeptiert die Anfrage nach der Validierung Aktion: Machen Sie das [Verbergen] --- & gt; [sichtbar]

    Jetzt haben Sie eine Beziehung mit Benutzern und Freunden [jede Zeile in der Nachschlagetabelle ist Freunde]

    hoffe, das wird hilfreich sein

Dhanu 16.12.2010 20:46
quelle

Tags und Links