Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
As relações de entidade permitem que as consultas GraphQL percorram entidades relacionadas, permitindo formas de dados complexas com uma única consulta. Por exemplo:
{
books {
items {
id
title
authors {
items {
first_name
last_name
}
}
}
}
}
Para isso, o DAB deve ser informado de como as entidades estão relacionadas por meio da relationships seção no arquivo de configuração.
Configuração
Para definir uma relação entre entidades:
- Use o
relationshipsobjeto dentro da configuração da entidade. - Forneça o
target.entitynome. - Definir
cardinalitycomo"one"ou"many". - Opcionalmente, especifique
source.fieldsetarget.fields. - Use
linking.objectao modelar relações muitos para muitos sem expor a tabela de junção.
Exemplo da 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
Seriestem muitosBooks. - O DAB poderá inferir campos se houver uma chave estrangeira.
dab update Series \
--relationship books \
--target.entity Book \
--cardinality many
Muitos-para-Um
- Use cardinalidade
"one". - Exemplo: A
Bookpertence a umSeries.
dab update Book \
--relationship series \
--target.entity Series \
--cardinality one
Muitos-para-Muitos (objeto de ligação)
- Use uma tabela de junção que não seja exposta no GraphQL.
- Defina a vinculação de campos da origem para o destino por meio 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)
- Exponha 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), defina um segundo relacionamento na entidade de destino que inverte os campos de origem e 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"
Isso emparelha com a relação Book para Author e habilita a travessia simétrica no GraphQL.
{
authors {
items {
first_name
books {
items {
title
}
}
}
}
}
Suporte ao GraphQL
- Os campos relacionados aparecem como objetos aninhados.
- A cardinalidade determina se uma lista ou um único objeto é retornado.
- Os nomes de tipo e os campos do GraphQL correspondem aos nomes de configuração.
Limitações
- As relações exigem que as entidades existam no mesmo arquivo de configuração.
- Há suporte apenas para navegação de um único salto.
- Ciclos e aninhamento profundo não são otimizados.
- REST não dá suporte a relações (somente GraphQL).