TL; DR:
Sie verwenden eine Stapelarchitektur mit zwischengespeicherten Diagrammen für alles über dem MySQL-Boden ihres Stapels.
Lange Antwort:
Ich habe selbst einige Nachforschungen angestellt, weil ich neugierig war, wie sie mit ihrer riesigen Datenmenge umgehen und sie schnell durchsuchen. Ich habe Leute gesehen, die sich darüber beschwert haben, dass maßgeschneiderte Skripte für soziale Netzwerke langsam werden, wenn die Benutzerbasis wächst. Nachdem ich mich mit nur 10.000 Benutzern und 2,5 Millionen Freundverbindungen verglichen hatte - ohne mich um Gruppenberechtigungen, Likes und Pinnwandeinträge zu kümmern - stellte sich schnell heraus, dass dieser Ansatz fehlerhaft ist. Ich habe einige Zeit im Internet gesucht, um herauszufinden, wie ich es besser machen kann, und bin auf diesen offiziellen Facebook-Artikel gestoßen:
Ich empfehle Ihnen wirklich , sich die Präsentation des ersten Links oben anzuschauen, bevor Sie weiterlesen. Es ist wahrscheinlich die beste Erklärung dafür, wie FB hinter den Kulissen funktioniert.
Das Video und der Artikel erzählen ein paar Dinge:
- Sie verwenden MySQL ganz unten in ihrem Stapel
- Über der SQL-Datenbank befindet sich die TAO-Schicht, die mindestens zwei Caching-Ebenen enthält und zur Beschreibung der Verbindungen Diagramme verwendet.
- Ich konnte nichts darüber finden, welche Software / Datenbank sie tatsächlich für ihre zwischengespeicherten Grafiken verwenden
Werfen wir einen Blick darauf, die Verbindungen zu Freunden sind oben links:
Nun, das ist eine Grafik. :) Es sagt Ihnen nicht, wie Sie es in SQL erstellen sollen. Es gibt verschiedene Möglichkeiten, dies zu tun, aber diese Site bietet eine Reihe unterschiedlicher Ansätze. Achtung: Bedenken Sie, dass eine relationale Datenbank das ist, was sie ist: Es wird angenommen, dass normalisierte Daten gespeichert werden, keine Diagrammstruktur. Es funktioniert also nicht so gut wie eine spezialisierte Grafikdatenbank.
Denken Sie auch daran, dass Sie komplexere Abfragen durchführen müssen als nur Freunde von Freunden, beispielsweise wenn Sie alle Orte um eine bestimmte Koordinate filtern möchten, die Ihnen und Ihren Freunden von Freunden gefallen. Ein Diagramm ist hier die perfekte Lösung.
Ich kann Ihnen nicht sagen, wie Sie es so bauen sollen, dass es gut funktioniert, aber es erfordert eindeutig einige Versuche und Benchmarking.
Hier ist mein enttäuschender Test für nur Befunde Freunde von Freunden:
DB-Schema:
CREATE TABLE IF NOT EXISTS `friends` (
`id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`friend_id` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
Freunde von Freunden Abfrage:
(
select friend_id
from friends
where user_id = 1
) union (
select distinct ff.friend_id
from
friends f
join friends ff on ff.user_id = f.friend_id
where f.user_id = 1
)
Ich empfehle Ihnen wirklich, einige Beispieldaten mit mindestens 10.000 Benutzerdatensätzen zu erstellen, von denen jeder mindestens 250 Freundverbindungen hat, und diese Abfrage dann auszuführen. Auf meinem Computer (i7 4770k, SSD, 16 GB RAM) betrug das Ergebnis für diese Abfrage ~ 0,18 Sekunden . Vielleicht kann es optimiert werden, ich bin kein DB-Genie (Vorschläge sind willkommen). Doch wenn diese Skalen linear sind Sie bereits bei 1,8 Sekunden nur 100k Benutzer, 18 Sekunden für 1 Million Benutzer.
Dies mag für ~ 100.000 Benutzer immer noch in Ordnung klingen, aber denken Sie daran, dass Sie gerade Freunde von Freunden abgerufen haben und keine komplexeren Abfragen wie " Nur Beiträge von Freunden von Freunden anzeigen + Berechtigungsprüfung durchführen, ob ich erlaubt oder NICHT erlaubt bin" durchgeführt haben um einige von ihnen zu sehen + mache eine Unterabfrage, um zu überprüfen, ob mir einer von ihnen gefallen hat ". Sie möchten, dass die Datenbank überprüft, ob Ihnen ein Beitrag bereits gefallen hat oder nicht, oder ob Sie dies im Code tun müssen. Bedenken Sie auch, dass dies nicht die einzige Abfrage ist, die Sie ausführen, und dass Sie mehr als aktive Benutzer gleichzeitig auf einer mehr oder weniger beliebten Site haben.
Ich denke, meine Antwort beantwortet die Frage, wie Facebook die Beziehung seiner Freunde sehr gut gestaltet hat, aber es tut mir leid, dass ich Ihnen nicht sagen kann, wie Sie sie so implementieren können, dass sie schnell funktioniert. Die Implementierung eines sozialen Netzwerks ist einfach, aber es ist eindeutig nicht sicher, sicherzustellen, dass es gut funktioniert - IMHO.
Ich habe angefangen, mit OrientDB zu experimentieren, um die Diagrammabfragen durchzuführen und meine Kanten der zugrunde liegenden SQL-Datenbank zuzuordnen. Wenn ich es jemals schaffen sollte, werde ich einen Artikel darüber schreiben.