Vývoj subgrafu, část 2: Zpracování polí a identifikace entit

(ProtoFire.io)

(část 1 ) | Část 2

Tento příspěvek na blogu poskytuje praktická doporučení, jak efektivně používat pole a generovat ID entit, která jsou jedinečná a odkazovatelná.

V části 1 této série jsme poskytli přehled podgrafů, které vývojářům pomohou porozumět jejich základní struktuře. Kromě toho jsme také sdíleli naše přehledy pro mapování a agregaci dat.

Tentokrát probereme další dvě témata: zpracování polí a generování ID pro entity, které jsou jedinečné a snadno odkazovatelné. V rámci diskuse poskytneme naše doporučení, jak efektivně spravovat pole a správně pojmenovat entity.

Efektivní zpracování polí

Přidání polí k entitám je v určitých scénářích užitečné. Existují například případy, kdy potřebujeme modelovat seznam adres pro zdroj dat nebo sledovat historické změny pro konkrétní pole v čase.

Bez předchozí znalosti toho, jak pole fungují v podgrafech, bychom mohli uvažovat vytvoření pole typu pole na definici typu entity (v souboru schema.graphql) a inicializace prázdného pole vždy, když je vytvořena nová entita stejného typu. Když jsou do pole přidána nová data, můžeme je poslat a entitu uložit. I když to zní intuitivně, bohužel to nefunguje.

Ruční zpracování polí v podgrafech, konkrétně ve výše uvedeném scénáři, má několik upozornění. Kdykoli přistupujete k poli entity, ve skutečnosti získáte kopii pole. Pokud tedy přidáte nová data a entitu uložíte, nebude to fungovat tak, jak byste očekávali, protože jednoduše upravujete kopii pole, zatímco originál zůstane beze změny.

Za účelem aktualizace skutečné pole, můžeme umístit kopii pole do proměnné a poté upravit data. Dále můžeme nastavit proměnnou jako nové pole na entitě. Tímto způsobem je staré pole nahrazeno kopií. Tento proces aktualizace pole je uveden v následujícím kódu.

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

I když můžete pole aktualizovat výše popsaným způsobem, není to ideální řešení . Kromě toho, že je to nepohodlné, existuje další důvod, proč ručně nezpracovávat pole – dotazy na cestování v čase. (Přečtěte si část 1 série, kde se dozvíte více o dotazech cestování časem.)

Je možné provádět pouze dotazy cestování časem, protože podgrafy sledují všechny změny ve všech entitách, které představují všechny čas. Pokud existuje mnoho entit s poli pole, která jsou velká a často aktualizovaná, bude také nutné uložit kopie všech polí. To si vyžádá daň za výkon a místo na disku indexeru, který indexuje váš podgraf.

Aktuálně je hostovaná služba Graph jediným aktivním indexátorem, který je k dispozici. V budoucnu se může přidat více indexátorů přidáním decentralizované sítě The Graph. Tito noví indexátoři si budou moci vybrat, které podgrafy budou indexovány. Pokud je váš podgraf kvůli polím špatně optimalizován, pravděpodobně jej žádný indexer nevyzvedne.

K optimalizaci našich polí můžeme použít @derivedFrom anotace. Tato metoda umožňuje, aby bylo jakékoli pole pole definované v typu entity automaticky vyplněno všemi entitami zadaného typu propojenými s entitou, kterou definujeme. Následující příklad ukazuje použití anotace @derivedFrom.

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
}

Ve výše uvedeném příkladu máme uživatele s automaticky generovaným seznamem Position entit. Kdykoli náš podgraf obdrží dotaz s dotazem na pole pozic entity User, provede ji podgraf zpětně pro všechny entity typu Position propojeny s konkrétní User entitou v jejich user poli. Tímto způsobem jsou propojené entity ty, které mají ID řetězce jiných entit v jednom ze svých polí.

Pomocí anotace @derivedFrom můžeme definovat entitu zadejte, co chceme pro naše data pole, definujte pole použité při odvození pole a propojte jej s původní entitou prostřednictvím jejich ID. Výhodou je také možnost přidání dalších dat (např. Vytvoření nebo aktualizace metadat) k entitám představujícím data pole. Jelikož se jedná o plnohodnotné entity, můžeme je snadno aktualizovat načtením jejich ID namísto jejich vyhledávání v poli.

Při zpracování polí s anotací @derivedFrom je jednodušší, stále je třeba si uvědomit některé úvahy.Nejprve to bude fungovat pouze s vztahy jedna k mnoha. Ve vztazích mnoho k mnoha stále potřebujeme jednu stranu rovnice pro ruční zpracování pole. Zadruhé nebudete mít přístup k datům pole, zatímco se indexuje podgraf, protože pole je při dotazování vyplněno.

Vytvoření pojmenování konvence pro ID entit

Všechny entity definované v souboru schema.graphql jsou identifikovány polem ID, které je deklarován jako ID! typ představovaný jako řetězec. Pole ID je důležité, protože se používá k načítání, vytváření a ukládání entit.

Protože pole ID je primárním prostředkem identifikace entity, mělo by být vždy jedinečné. To znamená, že zaručit jedinečnost ID není obtížné. Data přítomná během doby indexu lze kombinovat a generovat jedinečná ID. Příkladem toho je následující kód.

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

Tím, že vezmete hash transakce události (jedinečný pro různé transakce) a připojíte jej k indexu protokolu pro konkrétní událost (která identifikuje událost v rámci transakce), můžeme vygenerovat jedinečné složené ID. Tímto způsobem můžeme identifikovat konkrétní entitu mezi jinými entitami stejného typu za předpokladu, že je pro každou jednotlivou událost vytvořena pouze jedna entita. V případě potřeby můžeme také připojit více dat, abychom jednoznačně identifikovali libovolný počet entit vytvořených ve stejné události. Mohli bychom například nastavit počítadlo pro každé vytvoření entity a přidat hodnotu k nově vytvořené entitě.

I když je snadná metoda pro generování jedinečných ID pro naše entity pohodlná, měli bychom také usilovat o generování ID, která jsou předvídatelná a lze na ně odkazovat. Pokud máme entity související s částí naší domény, na kterou budou koncoví uživatelé pravděpodobně dotazováni prostřednictvím svého ID, můžeme vygenerovat ID odkazující na doménu, na které pracujeme.

Jako příklad zvažte scénář, kdy vytváříme entitu Account na podgrafu DEX. Tato Account entita uloží zůstatek uživatele a další informace. Pokud vytvoříme ID entity na základě hodnoty hash transakce, uživatel by mohl nejprve vyhledat transakci, která ji vytvořila, a znovu ji vytvořit, ale nebude to intuitivní. Lepší alternativou by bylo vytvořit ID na základě adresy Ethereum uživatele a v případě potřeby jej kombinovat s něčím jiným relevantním pro doménu. Tímto způsobem můžeme jednoznačně identifikovat konkrétní uživatelský účet z jiných účtů stejného uživatele.

Stručně řečeno, obecná jedinečná ID bez jakýchkoli údajů specifických pro doménu mohou být užitečné pro entity, které nebudou neustále aktualizovány. To je ideální pro entity vytvořené k uložení metadat pro události specifické pro doménu, které budou spotřebovány z odvozeného pole na hlavní entitě. Například obecná jedinečná ID jsou vhodnější pro převody, mincovny, vypalování a výměny.

Na druhou stranu ID pro konkrétní doménu jsou ideální pro hlavní entity a jakékoli jiné entity, které budou často aktualizovány. Pravděpodobně budete používat kombinaci adresy Etherea a některých dalších ID specifických pro doménu. Ve většině případů inteligentní smlouva vygeneruje jedinečná ID a zaznamená je do událostí. Pokud tomu tak není, budete si muset prostudovat chytrou smlouvu a zjistit, v čem je vaše entita jedinečná, a pomocí těchto údajů vygenerovat ID.

Jako vedlejší poznámku je třeba uvést a toHexString() – běžně používané ke generování ID z adres nebo hodnot hash – vrátí malý řetězec. To znamená, že když zadáváte dotaz na podgraf pro entity, zadaný řetězec ID by měl být malý, protože v dotazu se rozlišují velká a malá písmena.

Další informace o vývoji podgrafu najdete v oficiální dokumentace . Další podrobnosti najdete také v úložišti GitHub projektu. Graf má také aktivní a rostoucí komunitu připravenou pomoci a odpovídat na vznikající otázky. Doporučujeme všem zájemcům o vývoj vlastních podgrafů, aby se připojili k Graphs Discord serveru .

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *