[ENG] Reddit w swojej bazie ma tylko 2 tabele (+ mój komentarz)

Data: 07.05.2019 18:57

Autor: Thanos

kevin.burke.dev

ależ to jest genialne! mega ciekawe podejscie do #sql-a. zaczynali z #postgres-em, standardowo. klasyczna normalizacja danych (celem ich JOINOWANIA). problem pojawił się w momencie gdy:

– chcieli shardingować bazę (nigdy to nie jest takie łatwe, gdy trzeba robić joiny),

– gdy chcieli rozszerzyć tabelę o dodatkowe kolumny (przy liczbie ok. 10 MLN wpisów trwało to… za dlugo. w tym czasie kompletnie tracili kontrolę nad bazą danych, wszystko było zablokowane [ang. DB lock])

jakiś kosmaty geniusz wpadł na super świetny pomysł, aby rozwiązać wszystkie problemy za jednym zamachem. mianowicie wejść mocno w podejście NoSQL, czyli:

– maksymalna denormalizacja (pozbycie sie joinów),

– machnięcie wszystkiego na zasadzie key:value

tyle tytułem wstępu, teraz czas na najciekawsze.

mają tylko dwie tabele: things, poniewaz tam wszystko jest "rzeczą". trzymają w niej wspolne dane, takie, które ma kazdy obiekt w obrębie reddita (rzecz). np. ID (czyli unikatowy identyfikator), timestamp (czas powstania / craetedAt), type (info czy to jest post, czy user, czy subreddit etc.), upvote/downvote (wszystko mozna oceniać, + lub -) itd.

w drugiej zaś trzymają dane szczegółowe, ale schematowo wspólne dla wszystkich rekordów w bazie. tabela ma prosty schemat, 4 pola: ID, thing_id (to jest to samo ID, co w tabeli things), key (czyli co przechowujemy w tym wierszu) oraz value (czyli wartość owego klucza).

i teraz taki np. post ma następujące dane:

w things jest tylko: id, timestamp, upvotes, dowvotes etc.

w data natomiat mają: tyle wierszy, ile było normalnie kolumn, czyli:

  1. ID=uuid, thing_id=id_np_posta, klucz=title, value='Tytuł posta'

  2. ID=uuid, thing_id=id_np_usera, klucz=username, value='Nazwa_usera'

tak wygląda mniej wiecej schemat DB. poniewaz jest to mocno Cassandrowe podejscie, nic dziwnego, że przepisali się na Cassandre (CQL to baza jakby SQL-owa, ale z pełnym zachowaniem KEY/VALUE)

Jeśli uda mi się machnąć Lurka 2.0, będzie on wlasnie takze w podobnym schemacie (#Cassandra. miałem wziąć postgresa, ale z takiego rozwiązania płynie jednak więcej zalet. nie trzeba się troszczyć o schemat DB (mozna go rozbudowywac do woli), jest to mega łatwe w utrzymaniu, mega elastyczne itd.

Coś pięknego <3