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 dieses Verhalten 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 offenzulegen.

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 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 zur 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"

Diese Konfiguration passt zur Book bis Author Beziehung und ermöglicht das symmetrische Traversal 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.
  • Es wird nur eine Ein-Hop-Navigation unterstützt.
  • Zyklen und tiefe Schachtelungen sind nicht optimiert.
  • REST unterstützt keine Beziehungen (nur GraphQL).