O baza de date cu grafice in memorie pentru date JavaScript.

stare

Utilizat moderat in cel putin un produs real. Se asteapta sa se desfasoare pe scara mai larga si testarea luptei in curand.

Inspiratie

Cea mai directa inspiratie este DataScript, care este la randul sau inspirat de Datomic. La fel ca DataScript, dar spre deosebire de Datomic, aceasta „baza de date” nu ofera durabilitate de niciun fel.

O inspiratie suplimentara vine de la Relay-ul Facebook si Falcor-ul Netflix. Spre deosebire de oricare dintre acestea, acest proiect nu incearca sa abordeze provocarile legate de retea si servicii.

In cele din urma, acest proiect este inspirat de Om Next si de discutiile cu creatorul sau, David Nolen.

fundal

Avem deja un set tot mai mare de API-uri JSON / REST, deci nu putem trece cu usurinta totul la un punct final al serviciului de tip Relay sau Falcor peste noapte.

Frontend-ul nostru este deja scris in JavaScript, utilizand React.js; ClojureScript este un salt prea mare pentru echipa noastra in acest moment.

Avem nevoie de ceva care, mai presus de orice, este simplu, dar care actioneaza ca o piatra de temelie de-a lungul cararii catre nirvana frontend.

Obiective

  • Partea client, numai in memorie.
    • Sa presupunem ca setul de date este suficient de mic pentru a parcurge portiuni din acesta de multe ori.
  • Obiecte JavaScript vechi.
    • Turtirea ierarhica a graficului.
    • Nu neaparat doar JSON (permite date, etc).
    • Incurajeaza utilizarea prin destructurare.
    • Toate instrumentele standard de depanare, imprimare etc. ar trebui sa functioneze.
  • Model de informatii bazat pe grafice.
    • Sprijin puternic pentru relatiile dintre entitati.
    • Permiteti navigarea din orice nod ca radacina, in orice directie.
  • Nicio actiune ciudata la distanta.
    • Fiecare operatiune a bazei de date face o copie defensiva implicita.
    • Destul de bun in comparatie cu imuabilitatea reala.
    • Este sigur sa reveniti direct la apelantii API-ului magazinului dvs.

Non-obiective

API

import Baza de date din „jseg”; sa db = baza de date noua (schema);

Este obligatoriu singurul camp furnizat de schema implicita, capac. Este scurt pentru „Local ID” si este denumit astfel pentru a-l diferentia de alti identificatori specifici aplicatiei. Numele recomandat pentru identificatorii specificati de server este „gid”, prescurtarea „Global ID”.

Vedeti mai jos metodele de detaliere a db-ului si schemei.

Consultati fisierul de testare pentru multe exemple concrete.

obtine (capac, optiuni)

Obtine un copac intreg de obiecte inrudite prin capac. Parametrul de optiuni poate fi omis.

Nu trece in cicluri. Daca este specificata optiunea maxDepth, nu va recurge mai mult de atatea nivele.

Valorile campului nul si colectiile goale sunt omise.

Returneaza intotdeauna un obiect, cu cel putin un camp de capac.

pune (entitate)

Pune un copac intreg de obiecte inrudite. Proprietatile sunt imbinate cu obiectele existente cu campuri de capac potrivite. Proprietatile colectiei sunt unite.

Campurile setate la nul sunt sterse din entitati.

cautare (camp, valoare, optiuni)

Obtine un obiect printr-o valoare unica de sir de camp. Vezi schema.

Parametrul de optiuni poate fi omis si este delegat pentru a obtine.

Returneaza nul daca nu exista nicio entitate.

distruge (capac)

Elimina un obiect din baza de date prin capac. Se repeta conform schemei.

elimina (parentLid, field, childLid)

Elimina un obiect asociat dintr-un camp de colectie de referinta.

Functioneaza si pe campuri de referinta care nu sunt colectate. Trata campul ca o colectie cu o dimensiune maxima de una. Echivalent cu setarea campului la nul.

capace ()

Returneaza o serie de toate capacele pentru toate obiectele din baza de date.

Schema

Doar o harta a campurilor numite de configurat.

Identitatea entitatii

Proprietatea capacului este necesara pentru toate operatiunile get / put. Este doar un sir.

Campuri scalare

In mod implicit, campurile pot contine valori scalare. Acestea sunt de obicei siruri si numere, dar este permis orice obiect JavaScript non-nul, nedefinit.

Cautare unica

unic: adevarat

Utilizati pe campurile sir pentru a activa indexarea O (1) pentru a fi utilizate de cautare.

Validare

Proprietatea de validare specifica o functie de validare si transformare a unei valori scalare. Aruncati o exceptie pentru a raporta o eroare de validare sau pentru a returna valoarea transformata.

Erorile de validare sunt inregistrate si campurile nevalide sunt eliminate.

validate: functie (valoare) {if (! valid (valoare)) {throw validationError; } returneaza constrangere (valoare); }

Referinte entitati

ref: „invers”

Specifica campurile care sunt referinte la alte obiecte si numele campului relatiei inverse ale acelor obiecte. Nici unul, nici ambele capete ale relatiei nu pot fi colectii.

De exemplu:

let schema = {proprietar: {ref: ‘bilete’, colectie: adevarat,}, bilete: {ref: ‘proprietar’,},};

Utilizati valoarea campului {lid: …} pentru obiectele conexe:

db.put ({lid: ‘ticket1’, proprietar: ‘user1’}); db.put ({lid: ‘user1’, tickets: [{lid: ‘ticket2’}]});

Colectii

ref: „invers”, colectie: adevarat, sortare: functie comparare (x, y) {…}

O valoare camp matrice adauga entitati intr-un set. Comparatorul de sortare este optional. Pentru a elimina entitati, consultati eliminarea.

Pentru colectii fara referinta, pur si simplu puneti o matrice sau alta colectie intr-un camp scalar. Retineti ca campurile scalare efectueaza o inlocuire completa a valorii, nu unirea setata.

Stergere in cascada

distruge: adevarat

Utilizati in campurile ref pentru a apela recursiv distruge.