Freigeben über


Entitätsbeziehungen im Daten-API-Generator

Entitätsbeziehungen ermöglichen GraphQL-Abfragen das Durchlaufen verwandter Entitäten, wodurch komplexe Daten-Shapes mit einer einzelnen Abfrage ermöglicht werden. Beispiel:

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

Um dies zu erreichen, muss DAB angewiesen werden, wie Entitäten über den relationships Abschnitt in der Konfigurationsdatei verknüpft sind.

Konfiguration

So definieren Sie eine Beziehung zwischen Entitäten:

  • Verwenden Sie das relationships Objekt innerhalb der Entitätskonfiguration.
  • Geben Sie den target.entity Namen an.
  • Festlegen cardinality als "one" oder "many".
  • Optional angeben source.fields und target.fields.
  • Verwenden Sie linking.object beim Modellieren von m:n-Beziehungen, ohne die Verknüpfungstabelle freizugeben.

CLI-Beispiel

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"

Konfigurationsbeispiel

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

Eine zu Vielen

  • Verwenden Sie die Kardinalität "many".
  • Beispiel: A Series hat viele Books.
  • DAB kann Felder ableiten, wenn ein Fremdschlüssel vorhanden ist.
dab update Series \
  --relationship books \
  --target.entity Book \
  --cardinality many

n:1

  • Verwenden Sie Kardinalität "one".
  • Beispiel: A Book gehört zu einem Series.
dab update Book \
  --relationship series \
  --target.entity Series \
  --cardinality one

Many-to-Many (Verknüpfungsobjekt)

  • Verwenden Sie eine Verknüpfungstabelle, die in GraphQL nicht verfügbar gemacht wird.
  • Definieren Sie verknüpfungsfelder von Quelle zu Ziel über die Verknüpfungstabelle.
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"

Many-to-Many (explizite Verknüpfungsentität)

  • Machen Sie die Verknüpfungstabelle als GraphQL-Objekt verfügbar.
  • Definieren Sie Beziehungen für alle drei Entitäten.
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"

Gegenseitige Beziehungen

Um die Navigation in beide Richtungen zuzulassen (z. B. von Book zu Author und von Author zu Book), definieren Sie eine zweite Beziehung für die Zielentität, die die Quell- und Zielfelder umkehrt.

Beispiel

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"

Dies paart sich mit der Book-Beziehung Author und ermöglicht die symmetrische Durchquerung in GraphQL.

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

GraphQL-Unterstützung

  • Verwandte Felder werden als geschachtelte Objekte angezeigt.
  • Kardinalität bestimmt, ob eine Liste oder ein einzelnes Objekt zurückgegeben wird.
  • GraphQL-Typnamen und -Felder entsprechen Konfigurationsnamen.

Einschränkungen

  • Beziehungen erfordern, dass Entitäten in derselben Konfigurationsdatei vorhanden sind.
  • Nur eine einzelne Sprungnavigation wird unterstützt.
  • Zyklen und tiefe Schachtelungen sind nicht optimiert.
  • REST unterstützt keine Beziehungen (nur GraphQL).