Alagraafin kehitys, osa 2: Taulukoiden käsittely ja yksilöiden tunnistaminen

(ProtoFire.io)

(Osa 1 ) | Osa 2

Tämä blogiviesti tarjoaa käytännön suosituksia matriisien tehokkaaseen käyttöön ja luomiseen yksilötunnukset, jotka ovat yksilöllisiä ja joihin voi viitata.

Tämän sarjan osassa 1 annoimme yleiskuvan alikaavioista auttaaksemme kehittäjiä ymmärtämään niiden perusrakenteen. Lisäksi jaoimme myös oivalluksemme tietojen kartoittamisesta ja yhdistämisestä.

Tällä kertaa keskustelemme kahdesta toisesta aiheesta: matriisien käsittely ja tunnusten luominen entiteeteille, jotka ovat sekä yksilöllisiä että helposti viittaavia. Osana keskustelua annamme suosituksemme siitä, miten taulukoita voidaan hallita tehokkaasti ja nimetä yksiköt oikein.

Taulukoiden käsittely tehokkaasti

Taulukoiden lisääminen entiteetteihin on hyödyllistä tietyissä tilanteissa. Esimerkiksi on tapauksia, joissa meidän on mallinnettava tietolähteen osoiteluettelo tai seurattava tietyn kentän historiallisia muutoksia ajan myötä.

Ilman ennakkotietoa taulukoiden toiminnasta aligrafeissa voimme harkita taulukotyyppisen kentän luominen entiteettimääritelmälle (schema.graphql -tiedostossa) ja tyhjän taulukon alustaminen aina, kun uusi samantyyppinen entiteetti luodaan. Kun taulukkoon lisätään uusia tietoja, voimme työntää tietoja ja tallentaa entiteetin. Vaikka tämä kuulostaa intuitiiviselta, se ei valitettavasti toimi.

Matriisien käsitteleminen aligrafeilla, erityisesti yllä olevassa skenaariossa, sisältää muutaman varoituksen. Aina kun käytät entiteettiryhmää, saat oikeastaan ​​kopion matriisista. Jos lisäät uutta tietoa ja tallennat entiteetin, se ei toimi odotetulla tavalla, koska muokkaat yksinkertaisesti taulukon kopiota samalla kun alkuperäinen jätetään muuttumattomaksi.

Päivittämistä varten todellisen taulukon, voimme sijoittaa taulukon kopion muuttujaan ja muokata sitten tietoja. Seuraavaksi voimme asettaa muuttujan uudeksi matriisiksi entiteetissä. Tällä tavoin vanha taulukko korvataan kopiolla. Tämä taulukon päivitysprosessi on esimerkki seuraavasta koodista.

// This won"t work
entity.numbers.push(BigInt.fromI32(1))
entity.save()// This will work
let numbers = entity.numbers
numbers.push(BigInt.fromI32(1))
entity.numbers = numbers
entity.save()

Vaikka voit päivittää taulukon yllä esitetyllä tavalla, se ei ole ihanteellinen ratkaisu . Sen lisäksi, että on epämukavaa, on toinen syy olla käsittelemättä matriiseja manuaalisesti – aikamatkakyselyt. (Lue sarjan osa 1 saadaksesi lisätietoja aikamatkauskyselyistä.)

On mahdollista suorittaa vain aikamatkailukyselyjä, koska alikaaviot seuraavat kaikkia muutoksia kaikissa entiteeteissä, jotka esittävät kaikki aika. Jos on paljon entiteettejä, joilla on matriisikenttiä, jotka ovat suuria ja usein päivitettäviä, myös kaikkien matriisien kopiot on tallennettava. Tämä vie tullia jokaisen alihakemistosi indeksoivan indeksoijan suorituskyvystä ja levytilasta.

Tällä hetkellä The Graphin isännöimä palvelu on ainoa käytettävissä oleva aktiivinen indeksointilaite. Tulevaisuudessa lisää indeksoijia voi liittyä lisäämällä The Graphin hajautetun verkon. Nämä uudet indeksoijat voivat valita indeksoitavat aligrafit. Jos alikaaviosi on huonosti optimoitu matriisien takia, mikään indeksoija ei todennäköisesti noudata sitä.

Matriisien optimoimiseksi voimme käyttää @derivedFrom merkintä. Tämän menetelmän avulla kaikki entiteettityypissä määritetyt matriisikentät voidaan täyttää automaattisesti kaikilla määritetyn tyypin yksiköillä, jotka on linkitetty määrittelemäämme kokonaisuuteen. Seuraava esimerkki kuvaa @derivedFrom -merkinnän käyttöä.

type User @entity {
id: ID! positions: [Position!]! @derivedFrom(field: “user”)
}type Position @entity {
id: ID! user: User! # This is the ID String of the User
}

Yllä olevassa esimerkissä meillä on käyttäjä automaattisesti luodun Position -elementtien luettelon kanssa. Aina kun aligrafiikkamme vastaanottaa kyselyn, joka pyytää User -entiteetin kenttiä, alikaavio suorittaa käänteisen haun kaikille Position -tyyppisille entiteeteille linkitetty tiettyyn User -entiteettiin niiden user -kenttään. Tällä tavalla linkitetyt entiteetit ovat niitä, joiden jossakin kentässä on muiden entiteettien merkkijonotunnus.

@derivedFrom -merkintää käyttämällä voimme määritellä entiteetin tyyppi, jota haluamme taulukotiedoillemme, määritä taulukon johtamiseen käytetty kenttä ja linkitä se alkuperäiseen entiteettiin tunnuksensa kautta. Etuna on myös mahdollisuus lisätä enemmän tietoja (esim. Luomisen tai päivittämisen metatiedot) taulukkotietoja edustaviin entiteetteihin. Koska nämä ovat täysimittaisia ​​kokonaisuuksia, voimme päivittää ne helposti lataamalla heidän tunnuksensa sen sijaan, että etsimme niitä matriisista.

Käsitellessäsi taulukoita @derivedFrom -merkinnällä on helpompaa, on vielä joitain huomioitavia seikkoja.Ensinnäkin se toimii vain yksi-moni-suhteiden kanssa. Monissa moniin-suhteissa tarvitsemme edelleen yhtälön yhden puolen käsittelemään taulukkoa manuaalisesti. Toiseksi et voi käyttää matriisitietoja, kun aligrafiikkaa indeksoidaan, koska taulukko täytetään kyselyn yhteydessä.

Nimeämisen luominen käytäntö entiteettitunnuksille

Kaikki schema.graphql -tiedostossa määritellyt entiteetit tunnistetaan tunnuskentällä, joka on ilmoitettu merkkijonona edustettuna ID! -tyypinä. ID-kenttä on tärkeä, koska sitä käytetään entiteettien lataamiseen, luomiseen ja tallentamiseen.

Koska ID-kenttä on ensisijainen tapa tunnistaa entiteetti, sen tulisi aina olla ainutlaatuinen. Henkilökohtaisen henkilöllisyyden takaaminen ei kuitenkaan ole vaikeaa. Indeksiaikana olevat tiedot voidaan yhdistää yksilöllisten tunnusten luomiseksi. Seuraava koodi on esimerkki tästä.

event.transaction.hash.toHex() + "-" + 
event.logIndex.toString()

Ottamalla tapahtuman hash (tapahtumalle ainutlaatuinen) ja liittämällä se lokin hakemistoon tietyn tapahtuman (joka tunnistaa tapahtuman tapahtumassa), voimme luoda ainutlaatuisen yhdistetunnuksen. Tällä tavalla voimme tunnistaa tietyn entiteetin muiden samantyyppisten entiteettien joukosta edellyttäen, että vain yksi entiteetti luodaan yksittäiselle tapahtumalle. Tarvittaessa voimme myös liittää enemmän tietoja yksilöimään minkä tahansa määrän tapahtumia luotuista kokonaisuuksista. Voisimme esimerkiksi asettaa laskurin joka kerta, kun entiteetti luodaan, ja liittää arvon vasta luotuun entiteettiin.

Vaikka meillä on helppo menetelmä luoda yksilöllisiä tunnuksia entiteeteillemme, meidän tulisi myös pyrkivät luomaan tunnistettavissa olevat tunnukset, joihin voidaan viitata. Jos meillä on entiteettejä, jotka liittyvät verkkotunnuksemme osaan, josta loppukäyttäjät todennäköisesti kysyvät henkilöllisyystodistuksensa kautta, voimme luoda tunnuksen, joka viittaa työskentelemäämme verkkotunnukseen.

Harkitse esimerkkinä skenaario, jossa luomme Account -entiteetin DEX-alikaavioon. Tämä Account -entiteetti tallentaa käyttäjän saldon sekä muut tiedot. Jos luomme entiteettitunnuksen tapahtumien tiivisteen perusteella, käyttäjä voi etsiä ensin sen luoneen tapahtuman ja luoda sen uudelleen, mutta se ei ole intuitiivinen. Parempi vaihtoehto olisi luoda käyttäjätunnus käyttäjän Ethereum-osoitteen perusteella ja yhdistää tarvittaessa se johonkin muuhun verkkotunnukseen liittyvään. Tällä tavalla voimme yksilöidä tietyn käyttäjätilin saman käyttäjän muilta tileiltä.

Yhteenvetona voidaan todeta, että yleiset yksilölliset tunnukset ilman verkkotunnuskohtaisia ​​tietoja voivat olla hyödyllisiä entiteeteille, joita ei päivitetä jatkuvasti. Tämä on ihanteellinen entiteeteille, jotka on luotu tallentamaan metatietoja verkkotunnuskohtaisiin tapahtumiin, jotka kulutetaan johdetusta taulukosta pääyksikössä. Esimerkiksi yleiset yksilölliset tunnukset sopivat paremmin siirtoihin, rahapajoihin, polttamiseen ja vaihtamiseen.

Toisaalta verkkotunnuskohtaiset tunnukset ovat ihanteellisia pääyksiköille ja muille yhteisöille, jotka saavat usein päivityksiä. Käytät todennäköisesti Ethereum-osoitteen ja joidenkin muiden verkkotunnuskohtaisten tunnusten yhdistelmää. Useimmissa tapauksissa älykäs sopimus luo yksilölliset tunnukset ja kirjaa ne tapahtumiin. Jos näin ei ole, sinun on tutkittava älykästä sopimusta ja tunnistettava, mikä tekee entiteettistäsi ainutlaatuisen, ja käytettävä näitä tietoja tunnuksen luomiseen.

Lisähuomautuksena toHex() – ja toHexString() -menetelmät – joita käytetään yleisesti tunnusten luomiseen osoitteista tai hajautuksista – palauttavat pienen merkkijonon. Tämä tarkoittaa, että kun teet kyselyn alikaaviosta entiteeteille, annettavan ID-merkkijonon tulisi olla pientä, koska kysely on kirjainkoon mukainen.

Lisätietoja alikaavion kehittämisestä saat käymällä kaavion virallinen dokumentaatio . Lisätietoja löytyy myös projektin GitHub-arkistosta . Kaaviossa on myös aktiivinen ja kasvava yhteisö, joka on valmis auttamaan ja vastaamaan esiin tuleviin kysymyksiin. Kehotamme kaikkia, jotka ovat kiinnostuneita kehittämään omia alikaavioitaan, liittymään Graphin Discord-palvelimeen .

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *