Delen via


Entiteitsrelaties in Data API Builder

Met entiteitsrelaties kunnen GraphQL-query's gerelateerde entiteiten doorlopen, waardoor complexe gegevensshapes met één query kunnen worden ingeschakeld. Voorbeeld:

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

Hiervoor moet DAB worden verteld hoe entiteiten zijn gerelateerd via de relationships sectie in het configuratiebestand.

Configuratie

Een relatie tussen entiteiten definiëren:

  • Gebruik het relationships object in de entiteitsconfiguratie.
  • Geef de target.entity naam op.
  • Instellen cardinality als "one" of "many".
  • Optioneel opgeven source.fields en target.fields.
  • Gebruik linking.object bij het modelleren van veel-op-veel-relaties zonder de koppelings tabel weer te geven.

CLI-voorbeeld

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"

Configuratievoorbeeld

"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" ]
    }
  }
}

Een-op-veel

  • Kardinaliteit "many"gebruiken.
  • Voorbeeld: A Series heeft veel Books.
  • DAB kan velden afleiden als er een vreemde sleutel bestaat.
dab update Series \
  --relationship books \
  --target.entity Book \
  --cardinality many

Veel-op-een

  • Kardinaliteit "one"gebruiken.
  • Voorbeeld: Een Book behoort tot één Series.
dab update Book \
  --relationship series \
  --target.entity Series \
  --cardinality one

Veel-op-veel (object voor koppeling)

  • Gebruik een koppeltabel die niet zichtbaar is in GraphQL.
  • Definieer het koppelen van velden van bron naar doel via de join-tabel.
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"

Veel-op-veel (expliciete join-entiteit)

  • De jointabel beschikbaar maken als een GraphQL-object.
  • Relaties voor alle drie de entiteiten definiëren.
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"

Wederzijdse relaties

Als u navigatie in beide richtingen wilt toestaan (bijvoorbeeld van Book naar Author en van Author naar Book), definieer dan een tweede relatie op de doelentiteit die de bron- en doelvelden omkeert.

Voorbeeld

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"

Dit koppelt aan de Book naar Author relatie en maakt symmetrische doorkruising in GraphQL mogelijk.

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

GraphQL-ondersteuning

  • Gerelateerde velden worden weergegeven als geneste objecten.
  • Kardinaliteit bepaalt of een lijst of één object wordt geretourneerd.
  • GraphQL-typenamen en -velden komen overeen met configuratienamen.

Beperkingen

  • Voor relaties moeten entiteiten bestaan in hetzelfde configuratiebestand.
  • Er wordt slechts één hopnavigatie ondersteund.
  • Cycli en diepe nesting zijn niet geoptimaliseerd.
  • REST biedt geen ondersteuning voor relaties (alleen GraphQL).