TL; DR:
Používají zásobníku architekturu s mezipaměti grafy pro všechno nade dnem MySQL svého stacku.
Dlouhé Odpověď:
Udělal jsem nějaký výzkum na toto téma, protože jsem byl zvědavý, jak zacházet s jejich obrovské množství dat a hledat ji v rychlém způsobem. Viděl jsem lidi stěžují na zakázku vyrobené sociálních sítí skript stává pomalu, když se uživatelská základna roste. Poté, co jsem udělal nějaké srovnávání sebe s jen 10k uživatelů a 2,5 milionu přátele připojení - dokonce ani se snaží starat o oprávnění a podobnými skupin a pracovních míst stěn - to rychle se ukázalo, že tento přístup je chybný. Tak jsem strávil nějaký čas hledáním na internetu o tom, jak to udělat lépe a narazil na tento článek oficiálního Facebooku:
Já opravdu doporučuji se dívat na prezentaci prvního odkazu výše, než pokračovat ve čtení. Je to pravděpodobně nejlepší vysvětlení toho, jak funguje FB zákulisí najdete.
Video a článek vám řekne pár věcí:
- Používají MySQL na samém dně svého stacku
- Nad SQL DB je vrstva TAO, která obsahuje alespoň dvě úrovně cache a pomocí grafů popsat připojení.
- Nemohl jsem najít nic o tom, co software / DB skutečně použít pro své mezipaměti grafy
Pojďme se podívat na to, spojení s přáteli jsou vlevo nahoře:

No, to je graf. :) To vám neřeknu , jak ho postavit v SQL, existuje několik způsobů, jak to udělat, ale toto místo má dobré množství různých přístupů. Upozornění: Domníváme se, že relační databáze je to, co to je: Je to myšlenka k ukládání normalizovaných dat, nikoli graf strukturu. Takže to nebude fungovat tak, jak dobrý jako specializované databáze grafů.
Také se domnívají, že budete muset udělat složitějších dotazů, než jen přátelé přátel, například když chcete vyfiltrovat všechna místa kolem dané souřadnici, že vy a vaši přátelé přátel podobně. Graf je dokonalým řešením zde.
Nemohu vám říct, jak ho postavit tak, že bude fungovat dobře, ale to zjevně vyžaduje několik pokusů a omylů a benchmarking.
Tady je můj zklamáním test na pouhé zjištění přátele přátel:
Schema DB:
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;
Přátelé přátel dotazu:
(
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
)
Opravdu doporučuji vám vytvořit ukázkových dat s alespoň 10k uživatelských záznamů a každý z nich má alespoň 250 přátelství připojení a spusťte tento dotaz. Na mém počítači (i7 4770k, SSD, 16GB RAM) výsledek byl ~ 0,18 sekundy pro tento dotaz. Možná, že to může být optimalizována, nejsem génius DB (návrhy jsou vítány). Nicméně, pokud tato stupnice lineární jste již na 1,8 sekundy za pouhých 100k uživatele, 18 sekund na 1 milion uživatelů.
To by mohlo ještě znít OKish pro ~ 100k uživatele, ale za to, že jste právě načtené přátelé přátel a neudělal nic víc složitější dotaz jako " prázdné mi pouze příspěvky od přátel přátel + provést kontrolu oprávnění, jestli jsem, nebo není povolena vidět některé z nich + dělat dílčí dotaz zkontrolovat, zda se mi líbil některý z nich “. Chcete-li nechat DB provést kontrolu na tom, zda jste již ani nelíbil příspěvek, nebo budete muset udělat v kódu. Také se domnívají, že to není jediný dotaz spustit a že jste mít víc než aktivního uživatele zároveň na více či méně populární stránky.
Myslím, že moje odpověď odpovídá na otázku, jak Facebook určený svými přáteli vztah velmi dobře, ale je mi líto, že nemohu říct, jak to provést takovým způsobem, že to bude fungovat rychle. Implementace sociální síť je snadné, ale ujistěte se, že funguje dobře zjevně není - IMHO.
Jsem začal experimentovat s OrientDB dělat grafu-dotazy a mapování své hrany podkladové SQL DB. Pokud jsem někdy to udělat budu psát článek o tom.