Veri API'si oluşturucusunda varlık ilişkileri

Varlık ilişkileri, GraphQL sorgularının ilgili varlıklar arasında geçiş yapmalarına olanak tanıyarak karmaşık veri şekillerini tek bir sorguyla etkinleştirir. Örneğin:

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

Bu davranışı elde etmek için, DAB'ye yapılandırma dosyasındaki bölüm aracılığıyla varlıkların relationships nasıl ilişkili olduğu anlatılmalıdır.

Konfigürasyon

Varlıklar arasında ilişki tanımlamak için:

  • Varlık yapılandırması içindeki relationships nesnesini kullanın.
  • Adı giriniz target.entity.
  • cardinality değerini "one" veya "many" olarak ayarlayın.
  • İsterseniz source.fields ve target.fields belirtebilirsiniz.
  • linking.object birleştirme tablosunu göstermeden çoka çok ilişkileri modellerken kullanın.

CLI örneği

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"

Yapılandırma örneği

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

Birden Çoka

  • Kardinalitesini "many"kullanın.
  • Örnek: A'da Series çok sayıda Booksvardır.
  • DAB, yabancı anahtar varsa alanları tahmin edebilir.
dab update Series \
  --relationship books \
  --target.entity Book \
  --cardinality many

Çoktan Bire

  • Kardinalitesini "one"kullanın.
  • Örnek: A Book , bir Seriesöğesine aittir.
dab update Book \
  --relationship series \
  --target.entity Series \
  --cardinality one

Çoktan Çoka (ilişkilendirme nesnesi)

  • GraphQL'de sunulmamış bir birleştirme tablosu kullanın.
  • Birleştirme tablosu aracılığıyla kaynaktan hedefe bağlantı alanları tanımlayın.
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"

Çoktan Çoka (açık birleştirme öğesi)

  • Birleştirme tablosunu GraphQL nesnesi olarak kullanıma sunma.
  • Üç varlıkta da ilişkileri tanımlayın.
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"

Karşılıklı ilişkiler

Her iki yönde de gezintiye izin vermek için (örneğin, Book öğesinden Author öğesine ve Author öğesinden Book öğesine), hedef varlıkta kaynak ve hedef alanları tersine çeviren ikinci bir ilişki tanımlayın.

Example

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"

Bu yapılandırma, Book ile Author ilişkisi arasında eşleştirilir ve GraphQL'de simetrik dolaşmayı etkinleştirir:

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

GraphQL desteği

  • İlgili alanlar iç içe nesneler olarak görünür.
  • Kardinalite, bir listenin mi yoksa tek bir nesnenin mi döndürüleceğini belirler.
  • GraphQL tür adları ve alanları yapılandırma adlarıyla eşleşmektedir.

Sınırlamalar

  • İlişkiler, varlıkların aynı yapılandırma dosyasında mevcut olmasını gerektirir.
  • Yalnızca tek atlamalı gezinti desteklenir.
  • Döngüler ve derin iç içe geçmeler optimize edilmemiştir.
  • REST ilişkileri desteklemez (yalnızca GraphQL).