Bagikan melalui


Hubungan entitas di penyusun API Data

Hubungan entitas memungkinkan kueri GraphQL melintasi entitas terkait, memungkinkan bentuk data yang kompleks dengan satu kueri. Contohnya:

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

Untuk mencapai hal ini, DAB harus diberi tahu bagaimana entitas terkait melalui relationships bagian dalam file konfigurasi.

Konfigurasi

Untuk menentukan hubungan antara entitas:

  • Gunakan objek relationships di dalam konfigurasi entitas.
  • target.entity Berikan nama.
  • Atur cardinality sebagai "one" atau "many".
  • Secara opsional tentukan source.fields dan target.fields.
  • Gunakan linking.object saat memodelkan hubungan banyak ke banyak tanpa mengekspos tabel gabungan.

Contoh 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"

Contoh konfigurasi

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

Satu-ke-Banyak

  • Gunakan kardinalitas "many".
  • Contoh: A Series memiliki banyak Books.
  • DAB dapat menyimpulkan kolom jika ada kunci asing.
dab update Series \
  --relationship books \
  --target.entity Book \
  --cardinality many

Banyak ke Satu

  • Gunakan kardinalitas "one".
  • Contoh: Book termasuk dalam Series.
dab update Book \
  --relationship series \
  --target.entity Series \
  --cardinality one

Banyak ke Banyak (objek penautan)

  • Gunakan tabel gabungan yang tidak diekspos di GraphQL.
  • Tentukan bidang penautan dari sumber ke target melalui tabel gabungan.
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"

Banyak-ke-Banyak (entitas gabungan eksplisit)

  • Mengekspos tabel gabungan sebagai objek GraphQL.
  • Tentukan hubungan pada ketiga entitas.
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"

Hubungan timbal balik

Untuk mengizinkan navigasi di kedua arah (misalnya, dari Book ke Author dan dari Author ke Book), tentukan hubungan kedua pada entitas target yang membalikkan bidang sumber dan target.

Contoh

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"

Ini dipasangkan dengan hubungan Book ke Author dan memungkinkan penelusuran simetris di GraphQL.

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

Dukungan GraphQL

  • Bidang terkait muncul sebagai objek berlapis.
  • Kardinalitas menentukan apakah daftar atau objek tunggal dikembalikan.
  • Nama dan bidang jenis GraphQL cocok dengan nama konfigurasi.

Keterbatasan

  • Hubungan mengharuskan entitas ada dalam file konfigurasi yang sama.
  • Hanya navigasi satu hop yang didukung.
  • Siklus dan bersarang dalam tidak dioptimalkan.
  • REST tidak mendukung hubungan (hanya GraphQL).