la conception de base de données Facebook?

voix
120

Je me suis toujours demandé comment Facebook a conçu l'ami <-> relation utilisateur.

Je figure la table utilisateur est quelque chose comme ceci:

user_email PK
user_id PK
password 

Je figure la table avec les données de l'utilisateur (sexe, etc âge connectés par e-mail de l'utilisateur, je suppose).

Comment se connecter tous les amis à cet utilisateur?

Quelque chose comme ça?

user_id
friend_id_1
friend_id_2
friend_id_3
friend_id_N 

Probablement pas. Étant donné que le nombre d'utilisateurs est inconnu et se développer.

Créé 17/06/2009 à 20:17
source utilisateur
Dans d'autres langues...                            


13 réponses

voix
21

Il est très probablement une relation plusieurs à plusieurs:

Friendlist (tableau)

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

MODIFIER

Le tableau utilisateur n'a probablement pas user_email comme PK, peut - être comme une clé unique bien.

utilisateurs (tableau)

user_id PK
user_email
password
Créé 17/06/2009 à 20:20
source utilisateur

voix
86

Gardez une table d'amis qui détient le code d'utilisateur et le code d'utilisateur de l'ami (nous l'appellerons friendID). Les deux colonnes seraient clés étrangères à la table des utilisateurs.

exemple un peu utile:

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)

Exemple d'utilisation:

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

Cela montrera que Bob est amis avec les deux Jon et Joe et que Jon est aussi des amis avec Joe. Dans cet exemple, nous supposons que l'amitié est toujours deux façons, donc vous pas besoin d'une ligne de la table, comme (2,1) ou (3,2) parce qu'ils sont déjà représentés dans l'autre sens. Pour des exemples où l'amitié ou d'autres relations ne sont pas explicitement les deux sens, vous devez également les lignes pour indiquer la relation à double sens.

Créé 17/06/2009 à 20:21
source utilisateur

voix
31

Mon meilleur pari est qu'ils ont créé une structure graphique . Les noeuds sont les utilisateurs et les « amitiés » sont des bords.

Gardez une table d'utilisateurs, garder une table des bords. Ensuite, vous pouvez conserver les données sur les bords, comme « jour où ils sont devenus des amis » et « statut approuvé », etc.

Créé 17/06/2009 à 20:21
source utilisateur

voix
5

Vous êtes à la recherche pour les clés étrangères. Fondamentalement, vous ne pouvez pas avoir un tableau dans une base de données à moins qu'il dispose de sa propre table.


Exemple de schéma:

    Tableau des utilisateurs
        PK userID
        autre informations
    Table d'amis
        userID - FK à la table des utilisateurs représentant l'utilisateur qui a un ami.
        friendID - FK à la table des utilisateurs représentant l'ID utilisateur de l'ami
Créé 17/06/2009 à 20:22
source utilisateur

voix
2

Gardez à l'esprit que les tables de base de données sont conçus pour se développer verticalement (plusieurs lignes), et non horizontalement (plus de colonnes)

Créé 17/06/2009 à 20:40
source utilisateur

voix
15

Jetez un oeil à ces articles qui décrivent comment LinkedIn et Digg sont construits:

Il y a aussi « Big Data: Points de vue à l'équipe d'Facebook » qui pourraient être utiles:

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

En outre, il y a cet article qui parle de bases de données non relationnelles et la façon dont ils sont utilisés par certaines entreprises:

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

Vous verrez que ces entreprises font affaire avec des entrepôts de données, bases de données partitionnées, la mise en cache de données et d'autres concepts de niveau plus élevé que la plupart d'entre nous ne traiter sur une base quotidienne. Ou au moins, peut-être que nous ne savons pas ce que nous faisons.

Il y a beaucoup de liens sur les deux premiers articles que vous devriez donner plus de perspicacité.

Mise à jour 20/10/2014

Murat Demirbas a écrit un résumé sur

  • TAO: magasin de Facebook de données distribuées pour le graphe social (ATC'13)
  • F4: chaud système de stockage blob de Facebook (OSDI'14)

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

HTH

Créé 17/06/2009 à 22:38
source utilisateur

voix
0

En ce qui concerne les performances d'un grand nombre à plusieurs table, si vous avez 2 ints 32 bits reliant les ID utilisateur, votre stockage de données de base pour 200.000.000 utilisateurs en moyenne 200 amis est un peu moins de 300 Go chacun.

De toute évidence, vous besoin de partitionnement et l'indexation et vous n'allez pas garder en mémoire que pour tous les utilisateurs.

Créé 18/06/2009 à 01:17
source utilisateur

voix
44

Jetez un oeil sur le schéma de base de données suivante, ingénierie inverse par Anatoly Lubarsky :

Facebook schéma

Créé 13/07/2009 à 17:18
source utilisateur

voix
9

Il est impossible de récupérer les données de SGBDR pour les amis de l'utilisateur des données pour les données qui traversent plus d'un demi-milliard à temps constant si Facebook a mis en œuvre cette base de données en utilisant une de hachage (pas SQL) et ils opensourced la base de données appelée Cassandra.

Ainsi, chaque utilisateur a sa propre clé et les amis détails dans une file d'attente; de savoir comment fonctionne cassandra regardent ceci:

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

Créé 20/08/2010 à 06:51
source utilisateur

voix
4

Son type de base de données graphique: http://components.neo4j.org/neo4j-examples/1.2-SNAPSHOT/social-network.html

Ce ne est pas lié aux bases de données relationnelles.

Google pour bases de données graphiques.

Créé 12/04/2011 à 13:06
source utilisateur

voix
1

Il y a probablement une table, qui stocke l'ami <-> relation utilisateur, par exemple "frnd_list", ayant des champs de la user_id ', 'frnd_id'.

Chaque fois qu'un utilisateur ajoute un autre utilisateur comme un ami, deux nouvelles lignes sont créées.

Par exemple, supposons que mon id est «deep9c et j'ajouter un utilisateur ayant id « akash3b » comme mon ami, puis deux nouvelles lignes sont créées dans le tableau « frnd_list » avec des valeurs ( « deep9c », « akash3b ») et ( 'akash3b », 'deep9c').

Maintenant, en montrant la liste des amis à un utilisateur particulier, un sql simple serait faire: « select frnd_id de frnd_list où user_id = » où est l'identifiant de l'utilisateur connecté (stocké sous forme d'une session attribut).

Créé 29/10/2011 à 17:59
source utilisateur

voix
6

Cette annonce récente Juin 2013 va en détail en expliquant la transition des bases de données relationnelles à des objets avec des associations pour certains types de données.

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

Il y a un document plus disponible https://www.usenix.org/conference/atc13/tao-facebook's-distributed-data-store-social-graph

Créé 28/06/2013 à 19:07
source utilisateur

voix
31

TL; DR:

Ils utilisent une architecture de pile avec des graphiques mises en cache pour tout dessus du fond MySQL de leur pile.

Longue réponse:

Je l' ai fait des recherches sur moi - même parce que j'étais curieux de voir comment ils gèrent leur énorme quantité de données et la recherche d'une manière rapide. J'ai vu des gens se plaindre de scripts de réseaux sociaux sur mesure devient lent lorsque le nombre d'utilisateurs augmente. Après avoir fait quelques analyses comparatives moi - même avec seulement 10k utilisateurs et 2,5 millions d' amis connexions - même pas essayer de se soucier de permissions de groupe et goûts et messages sur le mur - il a rapidement tourné que cette approche est erronée. J'ai donc passé un certain temps à la recherche sur le web sur la façon de le faire mieux et suis tombé sur cet article Facebook officiel:

Je vraiment vous recommande de regarder la présentation du premier lien ci - dessus avant de continuer la lecture. Il est probablement la meilleure explication de la façon dont FB fonctionne dans les coulisses que vous pouvez trouver.

La vidéo et l'article vous dit quelques choses:

  • Ils utilisent MySQL au très bas de leur pile
  • Au- dessus de la couche il y a la TAO DB SQL qui contient au moins deux niveaux de mise en cache et utilise des graphiques pour décrire les connexions.
  • Je ne pouvais pas trouver quoi que ce soit sur ce logiciel / DB qu'ils utilisent effectivement pour leurs graphiques mises en cache

Jetons un coup d'oeil à cela, les connexions sont amis en haut à gauche:

entrez la description d'image ici

Eh bien, cela est un graphique. :) Il ne vous dit pas comment le construire dans SQL, il y a plusieurs façons de le faire , mais ce site a une bonne quantité de différentes approches. Attention: Considérer qu'une base de données relationnelle est ce qu'il est: On pense à stocker des données normalisées, et non une structure graphique. Donc , il ne fonctionnera pas aussi bon que d' une base de données graphique spécialisée.

Voir également que vous avez à faire des requêtes plus complexes que de simples amis d'amis, par exemple lorsque vous souhaitez filtrer tous les sites autour d'une donnée de coordonnées que vous et vos amis d'amis comme. Un graphique est la solution parfaite ici.

Je ne peux pas vous dire comment construire afin qu'il interprétera bien mais il faut bien quelques essais et erreurs et l'analyse comparative.

Voici mon décevant test seulement conclusions amis des amis:

DB schéma:

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;

Amis d'amis Question:

(
        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
    )

Je recommande vraiment que vous vous créez des données d'échantillons avec au moins 10k enregistrements d'utilisateur et chacun d'entre eux ayant au moins 250 connexions d'amis, puis exécuter cette requête. Sur ma machine (4770k Core i7, SSD, 16 Go de RAM) , le résultat a été ~ 0,18 secondes pour cette requête. Peut-être qu'il peut être optimisé, je ne suis pas un génie DB (suggestions sont les bienvenues). Cependant, si cette balance vous êtes déjà linéaire à 1,8 secondes pour seulement 100k utilisateurs, 18 secondes pour 1 million d' utilisateurs.

Cela pourrait encore paraître okish pour les utilisateurs , mais ~ 100k considérez que vous amis seulement d'amis et tirées par les cheveux ne fait pas de requête plus complexe comme " me afficher uniquement les messages des amis d'amis + faire la vérification de permission si je suis autorisé ou non autorisés de voir certains d'entre eux + faire une requête secondaire pour vérifier si j'aimé l' un d'eux ». Vous voulez laisser la DB faire le chèque si vous avez aimé un poste déjà ou non ou que vous aurez à faire dans le code. Voir également que ce n'est pas la seule requête que vous exécutez et que votre avoir plus d'utilisateurs actifs en même temps sur un site plus ou moins populaires.

Je pense que ma réponse répond à la question de savoir comment Facebook conçu leur relation d'amis très bien mais je suis désolé que je ne peux pas vous dire comment la mettre en œuvre d'une manière qu'il fonctionne rapidement. La mise en œuvre d'un réseau social est facile, mais en vous assurant qu'il est bien effectue clairement pas - à mon humble avis.

J'ai commencé à expérimenter avec OrientDB pour faire le graphique-requêtes et la cartographie mes bords à la DB SQL sous-jacente. Si jamais je le faire, je vais écrire un article à ce sujet.

Créé 26/02/2015 à 00:34
source utilisateur

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