Partilhar via


Relações de entidade no Data API builder

As relações de entidade permitem que consultas GraphQL percorram entidades relacionadas, possibilitando formas complexas de dados com uma única consulta. Por exemplo:

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

Para alcançar este comportamento, o DAB deve ser informado sobre como as entidades estão relacionadas através da relationships secção no ficheiro de configuração.

Configuração

Para definir uma relação entre entidades:

  • Use o relationships objeto dentro da configuração da entidade.
  • Dê o target.entity nome.
  • Defina cardinality como "one" ou "many".
  • Opcionalmente, especificar source.fields e target.fields.
  • Use linking.object ao modelar relações muitos-para-muitos sem expor a tabela de junção.

Exemplo de 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"

Exemplo de configuração

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

Um para Muitos

  • Use cardinalidade "many".
  • Exemplo: A Series tem muitos Books.
  • O DAB pode inferir campos se existir uma chave estrangeira.
dab update Series \
  --relationship books \
  --target.entity Book \
  --cardinality many

Muitos para Um

  • Use cardinalidade "one".
  • Exemplo: A Book pertence a um Series.
dab update Book \
  --relationship series \
  --target.entity Series \
  --cardinality one

Muitos-para-Muitos (objeto de associação)

  • Usa uma tabela de junção que não esteja exposta no GraphQL.
  • Defina campos de ligação da origem ao destino através da tabela de junção.
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"

Muitos-para-Muitos (entidade de junção explícita)

  • Expõe a tabela de junção como um objeto GraphQL.
  • Defina relações em todas as três entidades.
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"

Relações recíprocas

Para permitir a navegação em ambas as direções (por exemplo, de Book para Author e de Author para Book), definam uma segunda relação na entidade-alvo que inverte os campos de origem e de destino.

Exemplo

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"

Esta configuração emparelha-se com a relação Book a Author e permite a travessia simétrica em GraphQL.

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

Suporte a GraphQL

  • Campos relacionados aparecem como objetos aninhados.
  • A cardinalidade determina se uma lista ou um único objeto é devolvido.
  • Os nomes e campos dos tipos GraphQL correspondem aos nomes das configurações.

Limitações

  • As relações exigem que existam entidades no mesmo ficheiro de configuração.
  • Apenas é suportada a navegação de um só salto.
  • Os ciclos e o aninhamento profundo não estão otimizados.
  • O REST não suporta relações (apenas GraphQL).