iStandaarden / iWlz_RequestForChange

0 stars 0 forks source link

RFC24069 Pagination aan GraphQL schema toevoegen #69

Open rvanrest opened 3 months ago

rvanrest commented 3 months ago

eDocs volgnummer

No response

Korte probleem omschrijving

Wanneer het resultaat van een query groot is (veel data, lijsten) is het met de huidige specificatie niet mogelijk om deze vooraf te beperken. Dit heeft gevolgen voor performance (veel data ophalen en over de lijn) en de raadpleger heeft er geen controle over.

Korte omschrijving voorgestelde oplossing

Pagination toevoegen.

Deze techniek maakt het mogelijk om grote resultaat datasets op te splitsen in beheersbare delen of pagina's.

RFC gevolgen voor het onderdeel/de onderdelen

Koppelvlak specificatie, Autorisatie (policy/query)

Welk ander onderdeel?

No response

Betrokken partij RFC

Zorginstituut

Andere betrokken partij

No response

Indiener RFC

Zorginstituut

Andere organisatie / contactpersoon

VECOZO

Analyse - Waarom pagineren

Door het toevoegen van pagination krijgt de raadpleger controle over het de hoeveelheid op te vragen data. Vooral wanneer er veel data wordt verwacht geeft dit voordelen voor performance en voorspelde resultaten. De data kan op basis van gebruikersinput opgeknipt worden in 'pages'.

Belangrijke redenen om paginering aan je GraphQL-implementatie toe te voegen:

1. Verbeterde Prestatie en Efficiëntie

2. Geoptimaliseerd Geheugen- en Netwerkgebruik

3. Betere Gebruikerservaring

4. Betere Controle Over Gegevensstroom

5. Beheer van Veranderlijke Data

6. Schaalbaarheid

7. Compliantie en Beveiliging

Methoden voor paginering in GraphQL

Er zijn twee meest voorkomende methoden:

Hoewel offset-gebaseerde paginering van de twee de eenvoudigst te implementeren methode is, is de meest gebruikte methode de cursor-gebaseerde paginering. Op basis van een startregel (offset) en een aantal (limit) worden er vanaf de startregel het aantal opgegeven regels teruggegeven.

De belangrijkste argumenten tegen offset-gebaseerde paginering zijn dat de server bij een groot aantal records de volledige data moet raadplegen om het startpunt te vinden en dat er bij mutaties (verwijderen/toevoegen) in de onderliggende data het resultaat onvoorspelbaar maakt.

Cursor-gebaseerde paginering is efficiënter en betrouwbaarder. In plaats van een offset te gebruiken, wordt een unieke identificatie (cursor) gebruikt die naar een specifieke locatie in de dataset wijst. Deze methode is sneller en zorgt voor consistentie tussen verzoeken, zelfs als de gegevens veranderen.

Relay Pagination is een methode die gebruik maakt van cursor-gebaseerde paginering om efficiënt met grote datasets om te gaan en dynamische gegevensveranderingen te ondersteunen.

Relay Paginering in GraphQL

Relay maakt gebruik van een specifiek patroon voor het omgaan met paginering, bekend als het Connection en Edge model. Dit model definieert hoe de paginering moet worden uitgevoerd en welke velden moeten worden gebruikt.

Connection Model

Het Connection model in Relay introduceert twee belangrijke concepten:

  1. Edges: Dit vertegenwoordigt de verbindingen tussen nodes (datapunten) en bevat de data (node) en de cursor (cursor) die aangeeft waar in de lijst de data zich bevindt.
  2. PageInfo: Dit is een object dat metadata bevat over de paginering, zoals of er meer pagina's zijn om op te halen (hasNextPage) en wat de cursor van het laatste item in de huidige pagina is (endCursor).

Voorbeeld van een Relay-paginering in GraphQL-query:

    query {
      users(first: 5, after: "cursor123") {
        edges {
          node {
            id
            name
          }
          cursor
        }

        pageInfo {
          endCursor
          hasNextPage
        }
      }
    }

Velden in Relay Paginering

Voorbeeld van Relay Paginering GraphQL-schema:

type Query {
  users(first: Int, after: String): UserConnection
}

type UserConnection {
  edges: [UserEdge]
  pageInfo: PageInfo
}

type UserEdge {
  node: User
  cursor: String
}

type PageInfo {
  hasNextPage: Boolean
  endCursor: String
}

type User {
  id: ID
  name: String
}

In dit schema:

Wijzigingsvoorstel

Op dit moment is er geen concrete noodzaak om paginering toe te passen in het Netwerkmodel iWlz. De huidige query-specificaties gaan altijd uit van het opvragen via één specifiek ID waaraan een beperkt aantal records teruggegeven zal worden.

Maar met de NVS in gedachten blijft dit hoogstwaarschijnlijk niet de enige wijze waarop data geraadpleegd zal worden en zullen er ook grotere datasets opgevraagd worden met meer records als resultaat. Dan is paginering een waardevolle toevoeging aan de GraphQL implementatie.

Paginering maakt nu nog geen onderdeel uit van de GraphQL implementatie van het Netwerkmodel iWlz. Voor het toevoegen van paginering zullen de huidige GraphQL-specificaties maar waarschijnlijk ook de geimplementeerde resolvers aangepast moeten worden. Server en client moeten paginering ook ondersteunen.

Maar omdat het gebruik van GraphQL nu nog beperkt is, is de aanpassing ook ook voor een beperkte groep.

Het voorstel is daarom om paginering bij de eerste mogelijkheid toe te voegen aan de GraphQL implmentatie van het Netwerkmodel iWlz om de impact van deze wijziging kleiner te houden dan wanneer het volledig iWlz ketenlandschap en met de recente ontwikkeling om het netwerkmodel breder in te zetten dan het domein iWlz, zelfs daarbuiten.

Gezien het gedrag in de datasets die als dynamische gecategoriseerd kunnen worden is het voorstel om Cursor-Based Pagination toe te passen en specifiek de [Relay-techniek]()

Meer informatie:

Uitwerking wijzigingsvoorstel per onderdeel

ERD

geen wijzigingen

Regels

mogelijk regels of afspraken opstellen voor cursor-type en limit

Proces

geen wijzigingen

Gegevens

geen functionele, wel technische (zie koppelvlak)

Koppelvlak

De huidige GraphQL koppelvlakken moeten aangepast worden voor paginering.

Overige

Geschikt maken Server en Client.

Overweging wijzigingsvoorstel(len)

Oplossing Voordeel / Nadeel Overweging
1. .. Voordeel:
Nadeel:
#. Niets doen Voordeel: geen wijziging nodig
Nadeel: probleem blijft aanwezig

...

Conclusie

None

Gekozen oplossing

No response

Publicatiemoment

No response

Implementatiemoment

No response