web-dev-qa-db-fra.com

Structure de données "similaire" de Facebook

Je me demandais comment Facebook gère la conception de la base de données pour toutes les choses que vous pouvez "aimer". S'il n'y a qu'une chose à aimer, c'est simple, il suffit d'une clé étrangère pour ce que vous aimez et d'une clé étrangère pour qui vous êtes.

Mais il doit y avoir des centaines de tables différentes que vous pouvez "aimer" sur facebook. Comment stockent-ils les goûts?

27
Oskar Kjellin

Si vous souhaitez représenter ce type de structure dans une base de données relationnelle, vous devez utiliser une hiérarchie, généralement appelée héritage de table. Dans l'héritage de table, vous avez une seule table qui définit un parent type, puis enfant tables dont les clés primaires sont également des clés étrangères renvoyées au parent.

En utilisant l'exemple de Facebook, vous pourriez avoir quelque chose comme ceci:

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

Dans l’intérêt de la complétude, il convient de noter que Facebook n’utilise pas de SGBDR pour ce genre de choses. Ils ont opté pour une solution NoSQL pour ce type de stockage. Cependant, c'est un moyen de stocker de telles informations à couplage lâche dans un SGBDR.

25
Adam Robinson

Facebook n'a pas de clés étrangères traditionnelles et autres, car ils n'utilisent pas de bases de données relationnelles pour la plupart de leurs stockages. Simplement, ils ne le coupent pas pour ça.

Cependant, ils utilisent plusieurs magasins de données de type NoSQL. Le "Like" est probablement attribué en fonction d'un service, probablement configuré de manière SOA dans toute l'infrastructure. De cette façon, le "Like" peut être attribué à tout ce à quoi ils veulent qu’il soit associé. Tout cela, avec une grande évolutivité et pas de problèmes relationnels étroitement liés à traiter. Quelque chose que Facebook, ne peut pas vraiment se permettre de gérer au volume qu’il exploite.

Ils pourraient également utiliser un mécanisme de traitement de style AOP (Aspect Oriented Programming) pour "attacher" un "j'aime" à tout ce qui peut en nécessiter un au moment du rendu de la page, mais je comprends l'idée qu'il s'agit d'un traitement asynchrone via JavaScript contre un SOA ou autre mécanisme de diffusion.

Quoi qu'il en soit, j'aimerais savoir comment ils ont cette configuration du point de vue de l'architecture. Compte tenu de leur volume, même le simple bouton "J'aime" devient une mise en œuvre significative de la technologie.

2
Adron

Vous pouvez avoir une table avec Id, ForeignId et Type. Le type peut être quelque chose comme Photo, Statut, Événement, etc. ForeignId serait l'id de l'enregistrement dans le type de table. Cela rend possible les commentaires et les goûts. Vous n'avez besoin que d'une table pour tous les goûts, une pour tous les commentaires et celle que j'ai décrite.

Exemple:

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

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

Ici, l'utilisateur avec Id 111 aime la photo avec Id 322.


Remarque: Je suppose que vous utilisez un SGBDR, mais reportez-vous à la réponse d'Adron. Facebook utilise pas utilise un SGBDR pour la plupart de ses données.

0
user142019