Поделиться через


Связи сущностей в построителе API данных

Связи сущностей позволяют запросам GraphQL проходить по связанным сущностям, что позволяет создавать сложные фигуры данных с помощью одного запроса. Рассмотрим пример.

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

Чтобы добиться этого, DAB необходимо указать, как сущности связаны с помощью relationships раздела в файле конфигурации.

Конфигурация

Чтобы определить связь между сущностями, выполните следующие действия.

  • Используйте объект relationships внутри конфигурации сущности.
  • target.entity Укажите имя.
  • Установите cardinality как "one" или "many".
  • При необходимости укажите source.fields и target.fields.
  • Используйте linking.object при моделировании связей "многие ко многим", не отображая таблицу соединений.

Пример интерфейса командной строки

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"

Пример конфигурации

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

Один ко многим

  • Используйте кратность "many".
  • Пример: Один Series имеет много Books.
  • DAB может выводить поля, если существует внешний ключ.
dab update Series \
  --relationship books \
  --target.entity Book \
  --cardinality many

Много к одному

  • Используйте кардинальность "one".
  • Пример: A Book принадлежит одному Series.
dab update Book \
  --relationship series \
  --target.entity Series \
  --cardinality one

Многие-ко-многим (связывающий объект)

  • Используйте таблицу соединения, которая не предоставляется в GraphQL.
  • Определите привязку полей из источника к целевому объекту через таблицу соединения.
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"

"Многие ко многим" (явная сущность соединения)

  • Предоставление таблицы соединения в виде объекта GraphQL.
  • Определите связи для всех трех сущностей.
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"

Взаимные отношения

Чтобы разрешить навигацию в обоих направлениях (например, от Book до Author и от Author до Book), определите вторую связь в целевой сущности, которая изменяет исходные и целевые поля.

Пример

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"

Это образует пару с отношением Book к Author и позволяет симметричный обход в GraphQL.

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

Поддержка GraphQL

  • Связанные поля отображаются как вложенные объекты.
  • Кратность определяет, возвращается ли список или один объект.
  • Имена типов GraphQL и поля соответствуют именам конфигурации.

Ограничения

  • Связи требуют, чтобы сущности существовали в одном файле конфигурации.
  • Поддерживается только однохоповая навигация.
  • Циклы и глубокое вложение не оптимизированы.
  • REST не поддерживает связи (только GraphQL).