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:

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.