Arhitectura datelor

Cum arată modelele din baza de date și indexările.

O bază de date bine gândită nu se observă la prima vedere — se simte în viteza cu care răspunde aplicația. Schema Recash rulează pe MongoDB, prin Prisma și este construită pornind de la o singură întrebare pentru fiecare decizie: ce interogare va folosi acest câmp sau acest index?

Modelele principale

Schema are șapte modele de bază, fiecare cu un rol bine definit:

  • User — contul, cu contoare deja calculate (sticle date, sticle colectate, scor de reputație)
  • Post — o postare, cu locație, cantitate, procent oferit și program de disponibilitate
  • Transaction — finalizarea unei predări, cu valoarea tranzacționată și împărțirea ei
  • Badge — insignele câștigate de un utilizator
  • Notification — evenimentele care trebuie livrate cuiva
  • ChatMessage — conversația legată de o postare
  • Radar — locația și raza setate de un colector pentru alerte automate

Contoare precalculate

Scorul de reputație sau numărul de sticle colectate al unui utilizator nu se calculează de fiecare dată când cineva deschide profilul — se actualizează o singură dată, în momentul evenimentului care afectează starea. Diferența devine vizibilă la scară: clasamentul rămâne rapid, indiferent câți utilizatori folosesc platforma.

Ciclul de viață al unei postări

O postare trece prin mai multe stări, care reflectă exact ce se întâmplă în realitate:

OPEN → CLAIMED → IN_PROGRESS → COMPLETED

OPEN înseamnă că postarea este vizibilă și așteaptă un colector.

CLAIMED — un colector a revendicat-o.

IN_PROGRESS — colectorul se îndreaptă spre locație.

COMPLETED — sticlele au fost predate, tranzacția s-a încheiat.

Dacă nimeni nu o revendică la timp, postarea trece automat pe EXPIRED; dacă un participant renunță, aceasta devine CANCELLED.

Strategia de indexare

Un index de bază de date funcționează ca indexul unei cărți: în loc să parcurgi fiecare pagină ca să găsești un cuvânt, sari direct acolo unde trebuie. La fel, un index permite aplicației să găsească rapid exact datele de care are nevoie, fără să verifice, pe rând, fiecare înregistrare din colecție.

Fiecare index din schema Recash există pentru o interogare frecventată. Pagina "postările mele" are nevoie de postările unui singur autor, sortate după dată — există un index exact pentru această interogare. Feed-ul public are nevoie de postările valabile, cele mai noi primele — alt index, dedicat acestei căutări. Un proces caută periodic postările expirate — la fel, propriul index. Fără ele, fiecare astfel de căutare ar însemna parcurgerea întregii colecții de postări, una câte una.

Relații gândite până la capăt

Un utilizator poate avea mai multe postări ca autor și poate colecta mai multe postări ca și colector — acestea sunt relații distincte pe același model. Fiecare postare finalizată produce exact o tranzacție. Iar toate relațiile au reguli explicite de ștergere, astfel încât eliminarea unui cont nu lasă în urmă date orfane.