wake-up-neo.com

Like-Datenstruktur von Facebook

Ich habe mich gefragt, wie Facebook das Datenbankdesign für all die verschiedenen Dinge verwaltet, die Sie "mögen" können. Wenn es nur eine Sache gibt, die Sie mögen können, ist dies einfach ein Fremdschlüssel für das, was Sie möchten, und einen Fremdschlüssel für den, der Sie sind.

Es muss jedoch hunderte verschiedener Tische geben, die Sie auf Facebook "mögen" können. Wie bewahren sie die Likes auf?

27
Oskar Kjellin

Wenn Sie diese Art von Struktur in einer relationalen Datenbank darstellen möchten, müssen Sie eine Hierarchie verwenden, die normalerweise als Tabellenvererbung bezeichnet wird. Bei der Tabellenvererbung gibt es eine einzige Tabelle, die eine parenttype- und dann child-Tabelle definiert, deren Primärschlüssel auch Fremdschlüssel für die Eltern sind.

Wenn Sie das Beispiel von Facebook verwenden, können Sie etwa Folgendes haben:

User
------------
UserId (PK)

Item
-------------
ItemId (PK)
ItemType (discriminator column)
OwnerId (FK to User)

Status
------------
ItemId (PK, FK to Item)
StatusText 

RelationshipUpdate
------------------
ItemId (PK, FK to Item)
RelationshipStatus
RelationTo (FK to User)

Like
------------
OwnerId (FK to User)
ItemId (FK to Item)
Compound PK of OwnerId, ItemId

Der Vollständigkeit halber sei darauf hingewiesen, dass Facebook für diese Art von Aufgaben kein RDBMS verwendet. Sie haben sich für eine NoSQL-Lösung für diese Art von Speicher entschieden. Dies ist jedoch eine Möglichkeit, solche lose gekoppelten Informationen in einem RDBMS zu speichern.

25
Adam Robinson

Facebook hat keine traditionellen Fremdschlüssel und solche, da sie für den größten Teil ihrer Datenspeicherung keine relationalen Datenbanken verwenden. Einfach, sie schneiden es nicht dafür.

Sie verwenden jedoch mehrere NoSQL-Datenspeicher. Das "Gefällt mir" wird höchstwahrscheinlich auf der Grundlage eines Dienstes zugewiesen, der wahrscheinlich in der gesamten Infrastruktur im SOA-Stil eingerichtet ist. Auf diese Weise kann das "Gefällt mir" im Grunde genommen auf alles zurückgeführt werden, mit dem es in Verbindung gebracht werden soll. All dies mit enormer Skalierbarkeit und ohne enge Beziehungsprobleme. Etwas, mit dem sich Facebook bei der Lautstärke, mit der sie arbeiten, nicht wirklich auseinandersetzen kann.

Sie könnten auch einen AOP-Verarbeitungsmechanismus (Aspect Oriented Programming) verwenden, um ein "Like" an alles anzuhängen, was zum Zeitpunkt des Renderns einer Seite benötigt wird, aber ich habe die Vorstellung, dass es sich um eine asynchrone Verarbeitung über JavaScript gegen ein SOA Web-Service oder anderer Übermittlungsmechanismus.

Wie auch immer, ich würde gerne hören, wie sie dieses Setup aus der Perspektive der Architektur selbst haben. In Anbetracht ihrer Lautstärke wird selbst der einfache "Gefällt mir" -Button zu einer bedeutenden Implementierung der Technologie.

2
Adron

Sie können eine Tabelle mit Id, ForeignId und Type haben. Typ kann alles sein, z. B. Foto, Status, Ereignis usw.… ForeignId wäre die ID des Datensatzes in der Tabelle Typ. Dies ermöglicht sowohl Kommentare als auch Likes. Sie benötigen nur eine Tabelle für alle Likes, eine für alle Kommentare und die von mir beschriebene.

Beispiel:

Items
Id  | Foreign Id  | Type
----+-------------+--------
  1 |         322 | Photo
  4 |         346 | Status

Likes
Id  | User Id     | Item Id
----+-------------+--------
  1 |         111 | 1

Hier mag ein Benutzer mit der Id 111 das Foto mit der Id 322.


Hinweis: Ich gehe davon aus, dass Sie ein RDBMS verwenden, aber sehen Sie die Antwort von Adron. Facebook verwendet nicht ein RDBMS für die meisten seiner Daten.

0
user142019