Condividi tramite


Relazioni di entità in Generatore API dati

Le relazioni di entità consentono alle query GraphQL di attraversare le entità correlate, abilitando forme di dati complesse con una singola query. Per esempio:

{
  books {
    items {
      id
      title
      authors {
        items {
          first_name
          last_name
        }
      }
    }
  }
}

A tale scopo, daB deve essere indicato come le entità sono correlate tramite la relationships sezione nel file di configurazione.

Configurazione

Per definire una relazione tra entità:

  • Usare l'oggetto relationships all'interno della configurazione dell'entità.
  • Specificare il target.entity nome.
  • Impostare cardinality su "one" o "many".
  • Facoltativamente, specificare source.fields e target.fields.
  • Usare linking.object durante la modellazione di relazioni molti-a-molti senza esporre la tabella di associazione.

Esempio di CLI

dab update Book \
  --relationship authors \
  --target.entity Author \
  --cardinality many \
  --relationship.fields "id:id" \
  --linking.object "dbo.books_authors" \
  --linking.source.fields "book_id" \
  --linking.target.fields "author_id"

Esempio di configurazione

"Book": {
  "source": "dbo.books",
  "relationships": {
    "authors": {
      "cardinality": "many",
      "target.entity": "Author",
      "source.fields": [ "id" ],
      "target.fields": [ "id" ],
      "linking.object": "dbo.books_authors",
      "linking.source.fields": [ "book_id" ],
      "linking.target.fields": [ "author_id" ]
    }
  }
}

Uno-a-molti

  • Usare la cardinalità "many".
  • Esempio: un Series ha molti Books.
  • DAB può dedurre campi se esiste una chiave esterna.
dab update Series \
  --relationship books \
  --target.entity Book \
  --cardinality many

Molti-a-Uno

  • Usare la cardinalità "one".
  • Esempio: un Book oggetto appartiene a un Seriesoggetto .
dab update Book \
  --relationship series \
  --target.entity Series \
  --cardinality one

Molti-a-Molti (oggetto di collegamento)

  • Utilizzare una tabella di unione che non è esposta in GraphQL.
  • Definire il collegamento dei campi dall'origine alla destinazione tramite la tabella join.
dab update Author \
  --relationship books \
  --target.entity Book \
  --cardinality many \
  --relationship.fields "id:id" \
  --linking.object "dbo.books_authors" \
  --linking.source.fields "author_id" \
  --linking.target.fields "book_id"

Molti-a-Molti (entità di collegamento esplicito)

  • Esporre la tabella di unione come oggetto GraphQL.
  • Definire le relazioni in tutte e tre le entità.
dab add BookAuthor \
  --source dbo.books_authors \
  --permissions "anonymous:*"

dab update BookAuthor \
  --relationship book \
  --target.entity Book \
  --cardinality one \
  --relationship.fields "book_id:id"

dab update BookAuthor \
  --relationship author \
  --target.entity Author \
  --cardinality one \
  --relationship.fields "author_id:id"

Relazioni reciproche

Per consentire lo spostamento in entrambe le direzioni (ad esempio, da Book a Author e da Author a Book), definire una seconda relazione sull'entità di destinazione che inverte i campi di origine e di destinazione.

Esempio

dab update Author \
  --relationship books \
  --target.entity Book \
  --cardinality many \
  --relationship.fields "id:id" \
  --linking.object "dbo.books_authors" \
  --linking.source.fields "author_id" \
  --linking.target.fields "book_id"

Questa relazione tra Book e Author abilita l'attraversamento simmetrico in GraphQL:

{
  authors {
    items {
      first_name
      books {
        items {
          title
        }
      }
    }
  }
}

Supporto di GraphQL

  • I campi correlati vengono visualizzati come oggetti annidati.
  • La cardinalità determina se viene restituito un elenco o un singolo oggetto.
  • I nomi dei tipi GraphQL e i campi corrispondono ai nomi di configurazione.

Limitazioni

  • Le relazioni richiedono che le entità esistano nello stesso file di configurazione.
  • È supportata solo la navigazione a un hop.
  • I cicli e il profondo annidamento non sono ottimizzati.
  • REST non supporta le relazioni (solo GraphQL).