Ich habe eine soziale Website, Sie können Freunde hinzufügen. So funktioniert es:
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.
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
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.
hi Sie können diese Logik ausprobieren.
Nehmen wir an, Bob möchte Fred als Freund hinzufügen.
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]
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
Tags und Links mysql database-design