Facebook Datenbank-Design?

stimmen
120

Ich habe immer gefragt, wie Facebook den Freund entworfen <-> Benutzer Beziehung.

Ich stelle dar, die Benutzertabelle so etwas wie dieses:

user_email PK
user_id PK
password 

Ich stelle dar, die Tabelle mit Benutzerdaten (Geschlecht, Alter usw. über Benutzer E-Mail verbunden Ich würde davon ausgehen).

Wie kommt es, alle Freunde an diesen Benutzer verbinden?

Etwas wie das?

user_id
friend_id_1
friend_id_2
friend_id_3
friend_id_N 

Wahrscheinlich nicht. Da die Anzahl der Benutzer ist unbekannt und wird erweitert.

Veröffentlicht am 17/06/2009 um 20:17
quelle vom benutzer
In anderen Sprachen...                            


13 antworten

stimmen
21

Es ist sehr wahrscheinlich eine viele zu viele Beziehung:

Freundesliste (Tabelle)

user_id -> users.user_id
friend_id -> users.user_id
friendVisibilityLevel

BEARBEITEN

Die Benutzertabelle hat wahrscheinlich nicht user_email als PK, möglicherweise als eindeutigen Schlüssel though.

Benutzer (Tabelle)

user_id PK
user_email
password
Beantwortet am 17/06/2009 um 20:20
quelle vom benutzer

stimmen
86

Halten Sie einen Freund Tabelle, die die Benutzer-ID und dann die Benutzer-ID des Freundes hält (wir nennen es friendID). Beide Säulen würden Fremdschlüssel zurück in die Benutzertabelle.

Etwas gutes Beispiel:

Table Name: User
Columns:
    UserID PK
    EmailAddress
    Password
    Gender
    DOB
    Location

TableName: Friends
Columns:
    UserID PK FK
    FriendID PK FK
    (This table features a composite primary key made up of the two foreign 
     keys, both pointing back to the user table. One ID will point to the
     logged in user, the other ID will point to the individual friend
     of that user)

Verwendungsbeispiel:

Table User
--------------
UserID EmailAddress Password Gender DOB      Location
------------------------------------------------------
1      bob@bob.com  bobbie   M      1/1/2009 New York City
2      jon@jon.com  jonathan M      2/2/2008 Los Angeles
3      joe@joe.com  joseph   M      1/2/2007 Pittsburgh

Table Friends
---------------
UserID FriendID
----------------
1      2
1      3
2      3

Dies zeigt, dass Bob ist befreundet mit sowohl Jon und Joe und dass Jon ist auch Freunde mit Joe. In diesem Beispiel werden wir, dass Freundschaft ist immer zwei Möglichkeiten annehmen, so dass Sie nicht eine Zeile in der Tabelle wie (2,1) oder (3,2) benötigen, da sie bereits in der anderen Richtung dargestellt werden. Für Beispiele, in denen Freundschaft oder andere Beziehungen sind nicht explizit Zweiweg, müßten Sie auch die Zeilen haben die Zwei-Wege-Beziehung anzuzeigen.

Beantwortet am 17/06/2009 um 20:21
quelle vom benutzer

stimmen
31

Meine beste Wette ist , dass sie eine erstellte Graphstruktur . Die Knoten sind Benutzer und „Freundschaften“ sind Kanten.

Halten Sie eine Tabelle von Benutzern, hält eine andere Tabelle von Kanten. Dann können Sie Daten über die Kanten halten, wie „Tag sie wurden Freunde“ und „Zulassungsstatus“ usw.

Beantwortet am 17/06/2009 um 20:21
quelle vom benutzer

stimmen
5

Sie suchen Fremdschlüssel. Grundsätzlich können Sie nicht ein Array in einer Datenbank haben, wenn es seine eigene Tabelle hat.


Beispielschema:

    Benutzertabelle
        userID PK
        andere Daten
    Freunde Tabelle
        userID - FK an Benutzer der Tabelle, die dem Benutzer, der einen Freund hat.
        friendID - FK users' Tabelle, die die Benutzer-ID des Freundes
Beantwortet am 17/06/2009 um 20:22
quelle vom benutzer

stimmen
2

Beachten Sie, dass Datenbanktabellen sind entworfen, um zu wachsen vertikal (mehr Zeilen), nicht horizontal (mehr Spalten)

Beantwortet am 17/06/2009 um 20:40
quelle vom benutzer

stimmen
15

Werfen Sie einen Blick auf diese Artikel beschreibt, wie LinkedIn und Digg gebaut werden:

Es gibt auch „Big Data: Veranschaulichungen von dem Facebook-Data-Team“, das hilfreich sein könnte:

http://developer.yahoo.net/blogs/theater/archives/2008/01/nextyahoonet_big_data_viewpoints_from_the_fac.html

Außerdem gibt es in diesem Artikel, die über nicht-relationale Datenbanken sprechen und wie sie von einigen Unternehmen gewohnt sind:

http://www.readwriteweb.com/archives/is_the_relational_database_doomed.php

Sie werden sehen, dass diese Unternehmen mit Data Warehouse, partitionierten Datenbanken, Daten-Caching und andere höhere Ebene Konzepte beschäftigen, als die meisten von uns nie mit auf einer täglichen Basis. Oder zumindest, vielleicht wissen wir nicht, dass wir es tun.

Es gibt eine Menge von Links auf den ersten beiden Artikeln, die Ihnen etwas mehr Einblick geben sollen.

UPDATE 2014.10.20

Murat Demirbas schrieb eine Zusammenfassung auf

  • TAO: Facebook verteilten Datenspeicher für das soziale Graphen (ATC'13)
  • F4: Facebook warmen BLOB Storage-System (OSDI'14)

http://muratbuffalo.blogspot.com/2014/10/facebooks-software-architecture.html

HTH

Beantwortet am 17/06/2009 um 22:38
quelle vom benutzer

stimmen
0

die Leistung einer many-to-many-Tabelle in Bezug auf, wenn Sie zwei 32-Bit ints Verknüpfung von Benutzer-IDs haben, die Basisdatenspeicher für 200 Millionen Nutzer durchschnittlich 200 Freunde pro Kopf liegt bei knapp 300 GB.

Natürlich würden Sie eine Partitionierung und Indexierung benötigen und Sie nicht, dass für alle Benutzer im Speicher gehen zu halten.

Beantwortet am 18/06/2009 um 01:17
quelle vom benutzer

stimmen
44

Haben Sie einen Blick auf die folgenden Datenbankschema von Anatoly Lubarsky Reverse Engineering :

Facebook-Schema

Beantwortet am 13/07/2009 um 17:18
quelle vom benutzer

stimmen
9

Es ist nicht möglich, Daten von RDBMS abzurufen für Benutzer Freunde Daten für Daten, die mehr als eine halbe Milliarde bei einer konstanten Zeit überqueren, um Facebook diese eine Hash-Datenbank implementiert (kein SQL) und sie opensourced die Datenbank Cassandra genannt.

So jeder Benutzer hat einen eigenen Schlüssel und die Freunde Details in einer Warteschlange; zu wissen, wie Cassandra Arbeiten auf aussehen:

http://prasath.posterous.com/cassandra-55

Beantwortet am 20/08/2010 um 06:51
quelle vom benutzer

stimmen
4

Es ist eine Art von Graph - Datenbank: http://components.neo4j.org/neo4j-examples/1.2-SNAPSHOT/social-network.html

Es ist nicht zu relationalen Datenbanken zusammen.

Google für Graph-Datenbanken.

Beantwortet am 12/04/2011 um 13:06
quelle vom benutzer

stimmen
1

Wahrscheinlich gibt es eine Tabelle, die den Freund speichert <-> Benutzer Beziehung, sagen Sie „frnd_list“, mit Feldern ‚user_id‘, ‚frnd_id‘.

Jedes Mal, wenn ein Benutzer einen anderen Benutzer als Freund hinzufügt, zwei neue Zeilen erstellt.

Zum Beispiel meine ID annehmen ist ‚deep9c‘ und ich fügen Sie einen Benutzer mit id ‚akash3b‘ als mein Freund, dann zwei neue Zeilen in der Tabelle „frnd_list“ mit Werten ( ‚deep9c‘, ‚akash3b‘) und ( 'akash3b erstellt ‘, 'deep9c').

Nun, wenn die Freunde-Liste zu einem bestimmten Benutzer zeigt eine einfache SQL das tun würde: „wählt frnd_id aus frnd_list wo user_id =“ wo ist die ID des angemeldeten Benutzer (gespeichert als Session-Attribut).

Beantwortet am 29/10/2011 um 17:59
quelle vom benutzer

stimmen
6

Diese jüngste Juni 2013 Post geht in einigen Einzelheiten in Erläuterung der Übergang von der Beziehung Datenbanken zu Objekten mit den Verbänden für einige Datentypen.

https://www.facebook.com/notes/facebook-engineering/tao-the-power-of-the-graph/10151525983993920

Es gibt ein längeres Papier erhältlich bei https://www.usenix.org/conference/atc13/tao-facebook's-distributed-data-store-social-graph

Beantwortet am 28/06/2013 um 19:07
quelle vom benutzer

stimmen
31

TL; DR:

Sie verwenden eine Stack-Architektur mit Cache gespeicherten Graphen für alles über der MySQL Unterseite ihrer Stack.

Lange Antwort:

Ich habe auf diesen einige der Forschung selbst , weil ich neugierig war , wie sie ihre große Menge an Daten verarbeiten und es in einer schnellen Art und Weise suchen. Ich habe Leute über Maß soziale Netzwerk Skripte beschweren gesehen langsam wird , wenn die Nutzerbasis wächst. Einige Benchmarking mich mit Nachdem ich tat nur 10k Nutzer und 2,5 Millionen Freund Verbindungen - nicht einmal versuchen , über Gruppenberechtigungen und Vorlieben und Wandpfosten zu stören - es stellte sich schnell heraus , dass dieser Ansatz fehlerhaft ist. Also habe er einige Zeit mit der Suche im Internet verbracht, wie man es besser machen und kam in diesem offiziellen Facebook - Artikel:

Ich wirklich empfehlen Sie oben vor weiter lesen die Präsentation der ersten Verbindung zu beobachten. Es ist wahrscheinlich die beste Erklärung, wie FB den Kulissen arbeitet hinter Sie finden können.

Das Video und Artikel erfahren Sie, ein paar Dinge:

  • Sie sind mit MySQL ganz am unteren Rand ihres Stapels
  • Oberhalb der SQL - DB gibt es die TaO - Schicht , die wenigstens zwei Ebenen von Zwischenspeichern enthält und unter Verwendung von Graphen , die die Verbindungen zu beschreiben.
  • Ich konnte nichts auf finden, welche Software / DB sie für ihre gecached Graphen tatsächlich nutzen

Lassen Sie uns einen Blick auf diese, Freund Verbindungen sind oben links:

Geben Sie hier image description

Nun, dies ist eine grafische Darstellung. :) Es ist Ihnen nicht sagen , wie es in SQL zu bauen, gibt es mehr Möglichkeiten , es zu tun , aber diese Seite hat eine gute Menge an unterschiedlichen Ansätzen. Achtung: Bedenken Sie, dass eine relationale DB ist , was es ist: Es wird vermutet , normalisieren Daten zu speichern, nicht eine Graphenstruktur. So wird es nicht so gut wie eine spezialisierte Graph - Datenbank durchführen.

Sehen Sie sich auch, dass Sie komplexere Abfragen als nur Freunde von Freunden, zum Beispiel zu tun haben, wenn Sie koordinieren alle Positionen um eine gegebene filtern möchten, dass Sie und Ihre Freunde von Freunden wie. Ein Graph ist die perfekte Lösung.

Ich kann Ihnen nicht sagen, wie es zu bauen, so dass es gut funktionieren wird, aber es erfordert eindeutig einige Versuch und Irrtum und Benchmarking.

Hier ist mein enttäuschender Test für nur Erkenntnisse 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 Sie einige Beispieldaten mit mindestens 10k Benutzerdatensätzen zu erstellen und jeder von ihnen mindestens 250 Freund Verbindungen aufweist , und dann diese Abfrage ausführen. Auf meinem Rechner (i7 4770k, SSD, 16 GB RAM) war das Ergebnis ~ 0,18 Sekunden für die Abfrage. Vielleicht kann es optimiert werden, ich bin kein Genie DB (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 könnte noch klingen OKish für ~ 100k Nutzer aber bedenken , dass Sie nur geholt Freunde von Freunden und nicht wie "mehr komplexe Abfrage tat mir angezeigt werden nur Beiträge von Freunden von Freunden + die Berechtigungsprüfung tun , wenn ich darf oder nicht erlaubt einige von ihnen zu sehen + tun , um eine Sub - Abfrage zu überprüfen , ob ich einen von ihnen gemocht “. Sie wollen , dass die DB tun , um die Überprüfung zu lassen , wenn Sie einen Beitrag bereits gefallen hat oder nicht , oder Sie werden in Code zu tun haben. Sehen Sie sich auch , dass dies nicht die einzige Abfrage Sie laufen und dass Ihre mehr als aktiver Benutzer zur gleichen Zeit auf einer mehr oder weniger populären Seite.

Ich denke, meine Antwort auf die Frage beantwortet, wie Facebook ihre Freunde Beziehung entwickelt, um sehr gut, aber es tut mir leid, dass ich Ihnen nicht sagen, wie es in einer Weise zu implementieren, es schnell funktioniert. ein soziales Netzwerk Die Implementierung ist einfach, aber sicherstellen, dass es gut ist, führt eindeutig nicht - IMHO.

Ich habe damit begonnen, die Graph-Abfragen experimentieren mit Orientdb zu tun und Abbilden meine Kanten auf die zugrunde liegende SQL-DB. Wenn ich es jemals getan werde ich einen Artikel darüber schreiben.

Beantwortet am 26/02/2015 um 00:34
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more