Condividi tramite


Gestire relazioni nell'API Fabric per GraphQL

Le relazioni trasformano l'API GraphQL dall'accesso semplice ai dati in un potente grafico che rispecchia il modo in cui le entità aziendali si connettono effettivamente. Invece di forzare i client a effettuare più invocazioni di andata e ritorno e a unire manualmente i dati, le relazioni consentono di recuperare dati profondamente annidati e correlati in una singola query, recuperando un cliente, i relativi ordini, i prodotti in quegli ordini e le categorie di prodotti contemporaneamente.

Senza relazioni, l'API restituirebbe dati isolati che i clienti devono unire da soli. Con le relazioni, queste connessioni vengono definite una sola volta nello schema e GraphQL gestisce automaticamente l'attraversamento. Ad esempio, una query che inizia da un prodotto può spostarsi tra gli ordini per trovare tutti i clienti che lo hanno acquistato o iniziare da un cliente per visualizzare tutti i prodotti che hanno mai ordinato, tutto in una singola richiesta efficiente.

L'API fabric per GraphQL supporta tre modelli di relazione che coprono tutti gli scenari di modellazione dei dati comuni:

  • Uno-a-uno (1:1): ogni record in un tipo è correlato esattamente a un record in un altro tipo (ad esempio: Product → ProductCategory, dove ogni prodotto ha una categoria)
  • Uno-a-molti (1:N): ogni record in un tipo è correlato a più record in un altro tipo (ad esempio: ProductCategory → Product, dove ogni categoria contiene molti prodotti)
  • Molti-a-molti (M:N): i record in entrambi i tipi possono essere correlati a più record nell'altro tipo (ad esempio: SalesOrderHeader ↔ Product, dove gli ordini contengono più prodotti e i prodotti compaiono in più ordini)

Modellando queste relazioni nello schema GraphQL, si crea un'API intuitiva che riflette il modello di dominio e semplifica notevolmente il codice dell'applicazione client.

Prerequisiti

Prima di creare relazioni, è necessario:

  • Almeno due tipi definiti nello schema dell'API GraphQL. Ad esempio, se si usano dati di esempio AdventureWorks, è possibile che siano presenti tipi come Product, ProductCategorySalesOrderHeader, e SalesOrderDetail già creati dalle tabelle lakehouse o warehouse. Se non si hanno ancora tipi, vedere Creare un'API per GraphQL in Fabric e aggiungere dati.

  • Campi corrispondenti (chiavi esterne) tra i tipi che si desidera correlare. Per una relazione uno-a-uno o uno-a-molti, è necessario un campo comune nei due tipi—ad esempio, ProductCategoryID presente sia in Product che in ProductCategory. Questi campi fungono da punti di connessione per la relazione.

  • Un tipo di collegamento (tabella di giunzione) per le relazioni molti-a-molti. Se si crea una relazione molti-a-molti, è necessario un terzo tipo che connette gli altri due. Ad esempio, per correlare SalesOrderHeader e Product in una relazione molti-a-molti, è necessario SalesOrderDetail come tipo di collegamento. Questo tipo di collegamento deve avere chiavi esterne che puntano a entrambi i tipi da correlare , ad esempio SalesOrderID e ProductID. Scopri di più sulle relazioni molti-a-molti.

Creare una nuova relazione uno-a-uno

Una relazione uno-a-uno connette due tipi in cui ogni record in un tipo è correlato esattamente a un record nell'altro tipo. Ciò è utile quando si dispone di dati correlati che potrebbero trovarsi nella stessa tabella, ma sono separati per motivi di organizzazione o prestazioni. Ad esempio, un Product oggetto può essere correlato esattamente a uno ProductCategory tramite un ProductCategoryID campo.

I passaggi seguenti illustrano come creare una relazione uno-a-uno:

  1. Nel riquadro Esplora schemi selezionare i puntini di sospensione accanto a un tipo e quindi selezionare l'opzione Gestisci relazioni . Appare la schermata Gestisci relazioni.

    Screenshot che mostra dove selezionare la nuova relazione nel riquadro Gestisci relazioni.

  2. Seleziona Nuova relazione. Per questo esempio viene creata una nuova relazione uno-a-uno tra il tipo Product e il tipo ProductCategory , in base al campo ProductCategoryID presente in entrambi i tipi. Selezionare Uno a uno per Cardinalità, selezionare i tipi Da e A e quindi selezionare i campi Da e A per questa relazione.

    Screenshot che mostra esempi di selezioni per i cinque campi obbligatori per una nuova relazione.

Nota

È possibile selezionare più campi nei selettori di campo Da e A. Questa funzionalità consente di creare relazioni che includono più campi.

  1. Selezionare Crea relazione. L'elenco di relazioni ora mostra la relazione appena creata.

  2. Selezionare la X nell'angolo superiore destro per chiudere la schermata Gestisci relazioni .

Relazioni uno-a-molti (1:N) e molti-a-molti (M:N)

Anche se le relazioni uno-a-uno sono semplici, le relazioni uno-a-molti e molti-a-molti gestiscono modelli di dati più complessi comuni nelle applicazioni reali. Il processo di creazione di queste relazioni è simile a uno a uno, ma la selezione della cardinalità determina il modo in cui GraphQL interpreta ed espone la relazione.

Relazioni uno-a-molti (1:N)

Una relazione uno-a-molti connette un record singolo di un tipo a più record di un altro tipo. Ad esempio, un singolo ProductCategory contiene molti Product record, ma ognuno Product appartiene a una sola categoria.

Per creare una relazione uno-a-molti tra ProductCategory e Product, selezionare Uno-a-molti come cardinalità. Seguire gli stessi passaggi di per le relazioni uno-a-uno, ma l'impostazione di cardinalità indica a GraphQL che una categoria è correlata a molti prodotti.

Relazioni molti-a-molti (M:N)

Una relazione molti a molti connette record in cui entrambe le parti possono avere più record correlati. Ad esempio, un SalesOrderHeader può contenere più Product record e ognuno Product può essere visualizzato in più ordini. Queste relazioni richiedono un tipo di collegamento (tabella di giunzione) per archiviare le connessioni tra i due tipi principali.

Per creare una relazione molti-a-molti tra SalesOrderHeader e Product, è necessario il tipo di link SalesOrderDetail. Questo tipo di collegamento contiene chiavi esterne che puntano ai due tipi che si desidera mettere in relazione.

Per creare la relazione molti-a-molti:

  1. Nel riquadro Esplora schemi selezionare i puntini di sospensione accanto a un tipo e quindi selezionare l'opzione Gestisci relazioni . Appare la schermata Gestisci relazioni.
  2. Seleziona Nuova relazione.
  3. Cardinalità: Selezionare Molti a Molti e vengono visualizzati i campi aggiuntivi per il collegamento. Screenshot della finestra di dialogo per una nuova relazione molti-a-molti.
  4. Da tipo: selezionare SalesOrderHeader (uno dei lati della relazione)
  5. Tipo di collegamento: selezionare SalesOrderDetail (la tabella di giunzione che connette gli ordini ai prodotti)
  6. Da campi: selezionare SalesOrderID (il campo in SalesOrderHeader che collega al tipo di collegamento)
  7. Collegamento da campi: selezionare SalesOrderID (il campo corrispondente in SalesOrderDetail che si connette a SalesOrderHeader)
  8. Per digitare: selezionare Product (l'altro lato della relazione)
  9. Campo/i di destinazione: selezionare ProductID (il campo in Product che collega al tipo di associazione)
  10. Collegamento a campi: selezionare ProductID (il campo corrispondente in SalesOrderDetail che si connette al prodotto)

Il concetto chiave: il tipo di collegamento (SalesOrderDetail) ha due chiavi esterne, una che punta a ciascuno dei tipi che si desidera correlare. I campi "Collegamento da campi"" e "Collegamento a campi"" sono entrambi campi nel tipo di collegamento, mentre "Da campi"" e "A campi"sono inclusi nei tipi correlati.

Considerazioni per le relazioni molti-a-molti

Quando si crea una relazione molti-a-molti, ciò che GraphQL genera automaticamente dipende dal fatto che la tipologia di collegamento contenga eventuali campi extra oltre le due chiavi esterne.

Regola generale:

  • Se il tipo di collegamento include campi aggiuntivi oltre le chiavi esterne (più comuni), GraphQL crea quattro relazioni uno-a-molti che espongono il tipo di collegamento. In questo modo è possibile accedere a tali campi aggiuntivi nelle query e spostarsi tra tipi in entrambe le direzioni.
  • Se il tipo di collegamento ha solo le due chiavi esterne (meno comuni), GraphQL crea solo la relazione molti-a-molti diretta. È possibile eseguire query direttamente tra i due tipi principali senza fare riferimento al tipo di collegamento.

Collegamento del tipo con campi aggiuntivi (scenario tipico)

Nella maggior parte degli scenari reali, il tipo di associazione include campi in aggiunta alle due chiavi esterne. Le tabelle di giunzione in genere archiviano informazioni sulla relazione stessa, non solo sui record correlati, ma sui dettagli su come sono correlati.

Quando si crea la relazione molti-a-molti, l'API genera quattro relazioni visualizzate nell'elenco delle relazioni. Perché quattro? Poiché è necessario uno spostamento bidirezionale tra tutti e tre i tipi.

Ad esempio, se SalesOrderDetail contiene campi aggiuntivi come OrderQty, UnitPrice o UnitPriceDiscount(oltre a SalesOrderID e ProductID), queste quattro relazioni verranno visualizzate nel portale:

  • SalesOrderHeaderSalesOrderDetail (uno-a-molti): partire da un ordine ed elencare tutti i relativi articoli per vedere quantità e prezzi
  • SalesOrderDetailSalesOrderHeader (molti-a-uno): iniziare da un elemento e navigare indietro per vedere l'ordine a cui appartiene
  • ProdottoSalesOrderDetail (uno-a-molti): partire da un prodotto e vedere tutti gli ordini in cui appare con le relative quantità
  • SalesOrderDetailProduct (molti-a-uno): iniziare da una riga di dettaglio e navigare per vedere quale prodotto è stato ordinato

Queste quattro relazioni offrono la massima flessibilità per iniziare da qualsiasi tipo (SalesOrderHeader, Product o SalesOrderDetail) e passare a qualsiasi altro tipo, accedendo ai campi aggiuntivi come OrderQty e UnitPrice che esistono solo nel tipo di collegamento.

Tipo di collegamento esclusivamente con chiavi esterne

Se SalesOrderDetail contiene soloSalesOrderID e ProductID (nessun altro campo), l'API crea due relazioni uno-a-molti che verranno visualizzate nel portale:

  • SalesOrderHeaderSalesOrderDetail (uno-a-molti)
  • ProductSalesOrderDetail (uno-a-molti)

In questo scenario, le query possono spostarsi direttamente dagli ordini ai prodotti (e viceversa) senza fare riferimento in modo esplicito al tipo di collegamento nelle query GraphQL. Il tipo di collegamento esiste ma non aggiunge valore perché non contiene dati aggiuntivi.

Eliminazione di una relazione

È possibile rimuovere le relazioni che non sono più necessarie o sono state create in modo non corretto. L'eliminazione di una relazione non elimina i tipi stessi, ma rimuove solo la connessione tra di esse.

Per eliminare una relazione:

  1. Nel riquadro Esplora schemi selezionare i puntini di sospensione accanto a un tipo con relazioni e quindi selezionare Gestisci relazioni. Viene visualizzata la schermata Gestisci relazioni che mostra tutte le relazioni per il tipo selezionato.

  2. Selezionare la casella di controllo accanto a ogni relazione da eliminare. È possibile selezionare più relazioni per eliminarle in una singola operazione.

  3. Selezionare Elimina dalla barra degli strumenti.

  4. Confermare l'eliminazione quando richiesto. La relazione viene rimossa dallo schema GraphQL.

Suggerimento

Se hai creato una relazione molti-a-molti e desideri rimuoverla, ricorda che dovrai eliminare tutte e quattro le relazioni create (o due relazioni se il tipo di collegamento include solo chiavi esterne). Ogni relazione viene visualizzata come voce separata nell'elenco delle relazioni.