Facebook návrh databáze?

hlasů
120

Vždycky jsem se divil, jak Facebook navrhl známému <-> uživatel vztah.

Počítám uživatel tabulka je něco jako toto:

user_email PK
user_id PK
password 

Počítám tabulku s daty uživatele (pohlaví, věk atd připojených prostřednictvím uživatelského e-mailu bych předpokládal).

Jak se připojit všechny přátele s tímto uživatelem?

Něco takového?

user_id
friend_id_1
friend_id_2
friend_id_3
friend_id_N 

Asi ne. Vzhledem k tomu, že počet uživatelů je neznámá a bude expandovat.

Položena 17/06/2009 v 20:17
zdroj uživatelem
V jiných jazycích...                            


13 odpovědí

hlasů
21

Je to s největší pravděpodobností mnoho mnoho vztah:

FriendList (viz tabulka)

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

UPRAVIT

Uživatel tabulka pravděpodobně nemá USER_EMAIL jako PK, případně jako jedinečný klíč ačkoli.

Uživatelé (viz tabulka)

user_id PK
user_email
password
Odpovězeno 17/06/2009 v 20:20
zdroj uživatelem

hlasů
86

Udržovat kamarádovi tabulku, která drží ID uživatele a potom jméno uživatele na přítele (budeme říkat, že FriendID). Obě kolony by cizí klíče zpět ke stolu Users.

Poněkud vhodný příklad:

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)

Příklad použití:

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

To ukáže, že Bob je přátelé s oběma Jon a Joe a že Jon je také přátelé s Joe. V tomto příkladu budeme předpokládat, že přátelství je vždy dva způsoby, takže by nebylo nutné řádek v tabulce, jako je (2,1) nebo (3,2), protože jsou již zastoupeny v opačném směru. Pro příklady, kdy nejsou výslovně přátelství nebo jiné vztahy dvoucestný, budete muset mít také ty řádky indikují obousměrný vztah.

Odpovězeno 17/06/2009 v 20:21
zdroj uživatelem

hlasů
31

Můj Nejlepším řešením je, aby vytvořila strukturu grafu . Uzly jsou uživatelé a „přátelství“, jsou hrany.

Mějte jednu tabulku uživatelů, udržovat jinou tabulku hran. Pak můžete mít data o hrany, jako „den, kdy se stali přáteli“ a „schváleného statusu,“ atd.

Odpovězeno 17/06/2009 v 20:21
zdroj uživatelem

hlasů
5

Díváte se na cizí klíče. V zásadě nelze mít pole v databázi, pokud má svůj vlastní stůl.


Příklad schématu:

    uživatelé Tabulka
        ID uživatele PK
        jiné údaje
    Přátelé Table
        ID uživatele - FK do tabulky uživatelů lidové reprezentující uživatele, že má přítele.
        friendID - FK do tabulky uživatelů představující uživatelské id přítele
Odpovězeno 17/06/2009 v 20:22
zdroj uživatelem

hlasů
2

Mějte na paměti, že databázové tabulky jsou navrženy tak, aby růst vertikálně (více řádků), a to horizontálně (více sloupců)

Odpovězeno 17/06/2009 v 20:40
zdroj uživatelem

hlasů
15

Podívejte se na tyto články, které popisují, jak LinkedIn a Digg jsou postaveny:

K dispozici je také „Big data: Pohledy z Facebooku dat Team“, které by mohly být užitečné:

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

Také, tam je to článek, který hovoří o tom, non-relační databáze a jak jsou používány některými společnostmi:

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

Uvidíte, že tyto společnosti se zabývají datových skladů, rozdělených databází, datové cache a dalších konceptů vyšší úrovně, než většina z nás nikdy řešit na denní bázi. Nebo alespoň, možná nevíme, co děláme.

Existuje mnoho odkazů na prvních dvou článků, které byste měli dát nějaké bližší pohled.

UPDATE 10/20/2014

Murat Demirbas napsal souhrn na

  • TAO: Facebook je distribuován úložiště dat pro sociální graf (ATC'13)
  • F4: teplý skladování BLOB systém Facebook je (OSDI'14)

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

HTH

Odpovězeno 17/06/2009 v 22:38
zdroj uživatelem

hlasů
0

Pokud jde o výkon many-to-many tabulky, pokud máte 2 32bitových celých čísel, které spojují ID uživatelů, vaše základní úložiště dat pro uživatele 200.000.000 průměrně 200 přátel kus je těsně pod 300 GB.

Je zřejmé, že budete potřebovat nějaké dělení a indexování a vy nebudete mít na paměti, pro všechny uživatele.

Odpovězeno 18/06/2009 v 01:17
zdroj uživatelem

hlasů
44

Podívejte se na následující schéma databáze, reverzní inženýrství Anatolij Lubarsky :

Facebook Schema

Odpovězeno 13/07/2009 v 17:18
zdroj uživatelem

hlasů
9

To není možné k načtení dat z RDBMS pro uživatelská data s přáteli na údajích týkajících se více než půl miliardy na konstantní čas, takže Facebook realizovány pomocí tohoto hash databázi (ne SQL) a opensourced databázi s názvem Cassandra.

Takže každý uživatel má svůj vlastní klíč a přátelé Detaily ve frontě; vědět, jak Cassandra práce Podívejte se na tohle:

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

Odpovězeno 20/08/2010 v 06:51
zdroj uživatelem

hlasů
4

Její druh databáze grafu: http://components.neo4j.org/neo4j-examples/1.2-SNAPSHOT/social-network.html

Není to v souvislosti s relační databází.

Google pro databáze grafu.

Odpovězeno 12/04/2011 v 13:06
zdroj uživatelem

hlasů
1

Pravděpodobně tam je tabulka, která ukládá známému <-> uživatel vztah, řekněme „frnd_list“, které mají v polích ‚user_id‘, ‚frnd_id‘.

Vždy, když uživatel přidává další uživatele jako přítele, jsou vytvořeny dva nové řádky.

Předpokládejme například, že moje id je ‚deep9c‘ a přidám uživatel, který má id ‚akash3b‘ jako můj přítel, pak dva nové řádky jsou vytvořeny v tabulce „frnd_list“ s hodnotami ( ‚deep9c‘, ‚akash3b‘) a ( "akash3b ‘, 'deep9c').

Nyní, když ukazuje přátelé-list na konkrétního uživatele, jednoduchý sql by to, že: „select frnd_id z frnd_list kde user_id =“ kde je id přihlášeného uživatele (uložena jako relace atributu).

Odpovězeno 29/10/2011 v 17:59
zdroj uživatelem

hlasů
6

Tento nedávný příspěvek června 2013 jde do nějakého detailu do vysvětlování přechod z databází vztah k objektům s asociacemi pro některé datové typy.

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

K dispozici je již k dispozici na papír https://www.usenix.org/conference/atc13/tao-facebook's-distributed-data-store-social-graph

Odpovězeno 28/06/2013 v 19:07
zdroj uživatelem

hlasů
31

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:

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:

zadejte popis obrázku zde

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.

Odpovězeno 26/02/2015 v 00:34
zdroj uživatelem

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