Facebook projekt bazy danych?

głosy
120

Zawsze zastanawiałem się jak Facebook zaprojektował przyjaciel <-> Relacja użytkownika.

I postać tabeli użytkownik jest mniej więcej tak:

user_email PK
user_id PK
password 

I postać tabeli z danymi użytkownika (płeć, wiek itp podłączonych za pośrednictwem poczty elektronicznej użytkownika Przypuszczam).

Jak to połączyć wszystkich znajomych do tego użytkownika?

Coś takiego?

user_id
friend_id_1
friend_id_2
friend_id_3
friend_id_N 

Prawdopodobnie nie. Ponieważ liczba użytkowników nie jest znana i poszerzy.

Utwórz 17/06/2009 o 20:17
źródło użytkownik
W innych językach...                            


13 odpowiedzi

głosy
21

To najprawdopodobniej wiele do wielu relacji:

Friendlist (tabela)

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

EDYTOWAĆ

W tabeli użytkownik prawdopodobnie nie ma USER_EMAIL jako PK, ewentualnie jako unikalnego klucza chociaż.

użytkowników (tabela)

user_id PK
user_email
password
Odpowiedział 17/06/2009 o 20:20
źródło użytkownik

głosy
86

Zachować tabelę przyjaciela, który przechowuje identyfikator użytkownika, a następnie identyfikator użytkownika z przyjacielem (będziemy nazywać to FriendID). Obie kolumny byłoby kluczy obcych z powrotem do tabeli użytkowników.

Nieco użyteczne na przykład:

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)

Przykład zastosowania:

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 pokaże, że Bob znajomość z obu Jon i Joe i że Jon jest również znajomość z Joe. W tym przykładzie zakładamy, że przyjaźń jest zawsze dwa sposoby, dzięki czemu nie będzie musiał wiersz w tabeli, takie jak (2,1) lub (3,2), ponieważ są już reprezentowane w innym kierunku. Do przykładów, gdzie przyjaźń i inne relacje nie są wyraźnie dwukierunkowy, trzeba by mieć te wiersze, aby wskazać relację dwukierunkową.

Odpowiedział 17/06/2009 o 20:21
źródło użytkownik

głosy
31

My najlepiej jest, że stworzony one strukturę wykresu . Węzły są użytkownicy i „przyjaźnie” są krawędzie.

Trzymaj jedną tabelę użytkowników, zachować kolejną tablicę krawędzi. Następnie można przechowywać dane o krawędzie, jak „dzień zaprzyjaźnili” i „zatwierdzony status” etc.

Odpowiedział 17/06/2009 o 20:21
źródło użytkownik

głosy
5

Szukasz kluczy obcych. Zasadniczo nie można mieć tablicę w bazie danych, chyba że ma swój własny stolik.


Przykład schematu:

    Tabela użytkowników
        userID PK
        inne dane
    Tabela znajomych
        userID - FK do tabeli użytkowników reprezentującej użytkownika, że ​​ma przyjaciela.
        friendID - FK do tabeli Użytkowników reprezentujący identyfikator użytkownika znajomego
Odpowiedział 17/06/2009 o 20:22
źródło użytkownik

głosy
2

Należy pamiętać, że tabele bazy danych mają rosnąć w pionie (więcej wierszy), a nie poziomo (więcej kolumn)

Odpowiedział 17/06/2009 o 20:40
źródło użytkownik

głosy
15

Spójrz na tych artykułów opisujących jak LinkedIn i Digg zbudowane są:

Jest też „Big Data: Viewpoints z Facebooka Danych Team”, które mogą być pomocne:

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

Ponadto, nie jest to artykuł, który mówi o tym non-relacyjnych baz danych oraz w jaki sposób są one wykorzystywane przez niektóre firmy:

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

Zobaczysz, że te firmy mają do czynienia z hurtowni danych, partycje baz danych, buforowanie danych i innych pojęć wyższym poziomie niż większość z nas nigdy do czynienia z na codzień. Albo przynajmniej, być może nie wiemy, co robimy.

Istnieje wiele linków na pierwszych dwóch artykułów, które powinny dać trochę więcej wgląd.

UPDATE 20.10.2014

Murat Demirbaş napisał na podsumowanie

  • TAO: sieciowy system plików Facebooka na wykresie społecznym (ATC'13)
  • F4: System ciepły przechowywania BLOB Facebooka (OSDI'14)

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

HTH

Odpowiedział 17/06/2009 o 22:38
źródło użytkownik

głosy
0

Jeśli chodzi o wydajność wiele-do-wielu stole, jeśli masz 2 32-bitowych ints linkami identyfikatory użytkownika, przechowywanie danych na podstawowym 200.000.000 użytkowników średnio 200 znajomych za sztukę wynosi niecałe 300 GB.

Oczywiście, będzie trzeba trochę partycjonowanie i indeksowanie i nie zamierzamy zachować to w pamięci dla wszystkich użytkowników.

Odpowiedział 18/06/2009 o 01:17
źródło użytkownik

głosy
44

Nie patrzeć na poniższym schemacie bazy danych, inżynierii odwrotnej Anatolija Lubarsky :

Facebook Schema

Odpowiedział 13/07/2009 o 17:18
źródło użytkownik

głosy
9

To nie jest możliwe, aby odzyskać dane z RDBMS dla znajomych użytkownika danych dla danych, które przejeżdżają przez więcej niż pół miliarda na stałym czasie, więc to Facebook realizowane przy użyciu bazy danych SQL (bez mieszania) i opensourced bazę danych o nazwie Cassandra.

Więc każdy użytkownik ma swój własny klucz i przyjaciele szczegóły w kolejce; wiedzieć, jak działa Cassandra spojrzeć na to:

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

Odpowiedział 20/08/2010 o 06:51
źródło użytkownik

głosy
4

Jego typ bazy danych wykresu: http://components.neo4j.org/neo4j-examples/1.2-SNAPSHOT/social-network.html

Nie jest związana z relacyjnych baz danych.

Google dla baz danych wykresu.

Odpowiedział 12/04/2011 o 13:06
źródło użytkownik

głosy
1

Prawdopodobnie znajduje się tabela, która przechowuje znajomego <-> Relacja użytkownika, powiedzieć „frnd_list”, posiadające pola „user_id”, „frnd_id”.

Gdy użytkownik dodaje innego użytkownika jako przyjaciela, dwa nowe wiersze są tworzone.

Na przykład, załóżmy, że mój id jest „deep9c” i dodać użytkownika posiadającego id „akash3b” jak mój przyjaciel, a następnie dwa nowe wiersze tworzone są w tabeli „frnd_list” z wartościami ( „deep9c”, „akash3b”) i ( 'akash3b ”, 'deep9c').

Teraz, gdy pokazano przyjaciół-list do konkretnego użytkownika, proste sql zrobi, że: „wybierz frnd_id z frnd_list gdzie user_id =” gdzie jest identyfikator zalogowanego użytkownika (przechowywane jako atrybut sesji).

Odpowiedział 29/10/2011 o 17:59
źródło użytkownik

głosy
6

Ten ostatni czerwiec 2013 poczta idzie do jakiegoś szczegółu do wyjaśnienia przejścia od bazy stosunek do przedmiotów ze stowarzyszeniami dla niektórych typów danych.

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

Jest już dostępny na papier https://www.usenix.org/conference/atc13/tao-facebook's-distributed-data-store-social-graph

Odpowiedział 28/06/2013 o 19:07
źródło użytkownik

głosy
31

TL; DR:

Wykorzystują architekturę stosu z pamięci podręcznej wykresów dla wszystkich powyżej dna MySQL ich stos.

Długa odpowiedź:

Zrobiłem kilka badań na ten sam, bo byłem ciekaw, jak radzą sobie z nimi ogromne ilości danych i szukać go w szybki sposób. Widziałem ludzi, którzy narzekają na zlecenie wykonane skryptów społecznościowych staje się powoli, gdy baza użytkowników rośnie. Po zrobiłem niektóre benchmarking się z zaledwie 10k użytkowników i 2,5 mln przyjaciel połączeń - nawet nie próbują przejmować uprawnień grupowych i lubi i słupków ściennych - szybko okazało się, że takie podejście jest błędne. Więc spędziłem trochę czasu szukając w internecie o tym, jak zrobić to lepiej i natknąłem się na to oficjalnej artykule Facebooku:

I naprawdę polecam do obejrzenia prezentacji pierwszego linku powyżej przed kontynuować czytanie. To chyba najlepszy wyjaśnienie sposobu FB działa za kulisami można znaleźć.

Film i artykuł powie Ci kilka rzeczy:

  • Oni używają MySQL na samym dnie swojego stosu
  • Powyżej SQL DB jest warstwa TAO, która zawiera co najmniej dwa poziomy buforowania i jest za pomocą wykresów w celu opisania połączenia.
  • Nie mogłem znaleźć nic na temat oprogramowania / DB faktycznie używać ich pamięci podręcznej wykresach

Rzućmy okiem na to, kontaktów są u góry z lewej:

wprowadzić opis obrazu tutaj

Cóż, jest to wykres. :) To nie powiedzieć, jak ją zbudować w SQL, istnieje kilka sposobów, aby to zrobić, ale ta strona zawiera sporą ilość różnych podejść. Uwaga: Należy rozważyć, że relacyjnych DB to co to jest: Uważa się, znormalizowane do przechowywania danych, a nie strukturę wykresu. Więc nie będzie tak dobry jak wykonać wyspecjalizowanej bazie wykresu.

Weź również pod uwagę, że trzeba zrobić bardziej złożonych zapytań niż tylko przyjaciółmi przyjaciół, na przykład gdy chcesz filtrować wszystkie lokalizacje wokół dana współrzędna że ty i twoi znajomi znajomych podobnych. Wykres jest idealnym rozwiązaniem tutaj.

Nie mogę powiedzieć, jak ją zbudować tak, że będzie dobrze wykonać, ale to wyraźnie wymaga prób i błędów i benchmarking.

Oto mój rozczarowujące test zaledwie ustaleń znajomych znajomych:

DB schematu:

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;

Znajomi znajomych zapytanie:

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

Naprawdę polecam Ci stworzyć Ci kilka przykładowych danych z co najmniej 10k rejestrów użytkowników, a każdy z nich posiada połączenia co najmniej 250 przyjaciół, a następnie uruchomić tę kwerendę. Na moim komputerze (4770k i7, SSD, 16GB RAM) wynik był ~ 0,18 sekundy dla tego zapytania. Może to być zoptymalizowane, nie jestem geniuszem dB (sugestie są mile widziane). Jednakże, jeśli ten Wagi liniowe jesteś już w 1,8 sekundy za jedyne 100k użytkowników, 18 sekund do 1 miliona użytkowników.

To może nadal wydawać OKish za ~ 100k użytkowników, ale uważają, że po prostu ściągnięcie ich przyjaciół i nie robić nic więcej skomplikowane zapytania jak " wyświetlają mi stanowisk tylko z przyjaciółmi przyjaciół + zrobić sprawdzanie uprawnień, jeśli wolno mi lub niedozwolone aby zobaczyć niektóre z nich + sub zrobić kwerendę, aby sprawdzić, czy lubiłem każdy z nich ”. Chcesz pozwolić DB zrobić czek na razie podoba Ci się post już, czy nie, bo trzeba zrobić w kodzie. Weź również pod uwagę, że to nie jest tylko zapytanie biegać i że Twój mieć więcej niż aktywnego użytkownika w tym samym czasie na bardziej lub mniej popularnej stronie.

Myślę, że moja odpowiedź odpowiedzi na pytanie, jak Facebook zaprojektowane ich relacji znajomych bardzo dobrze, ale przykro mi, że nie mogę ci powiedzieć, jak wdrożyć je w taki sposób, że będzie działać szybko. Wdrożenie sieci społecznej jest łatwe, ale upewniając się, że dobrze wykonuje wyraźnie nie jest - IMHO.

Zacząłem eksperymentować z OrientDB zrobić wykres-zapytań i mapowanie moje krawędzie podstawowej SQL DB. Jeśli kiedykolwiek zrobić to ja napiszę o tym artykuł.

Odpowiedział 26/02/2015 o 00:34
źródło użytkownik

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