Varlık İlişkileri
GraphQL sorguları, ilgili nesneler ve bunların alanları arasında geçiş yapabilir, böylece yalnızca bir sorguyla şöyle bir şey yazabilirsiniz:
{
books
{
items {
id
title
authors {
items {
first_name
last_name
}
}
}
}
}
Kitapları ve yazarlarını almak için.
Bu özelliğin çalışmasına izin vermek için, Veri API oluşturucusunun iki nesnenin birbiriyle nasıl ilişkili olduğunu bilmesi gerekir. relationships
Yapılandırma dosyasındaki bölümü, bu özelliğin doğru ve verimli çalışmasını sağlamak için gerekli meta verileri sağlar.
İlişki Yapılandırma
Veri API oluşturucusu ile hangi veritabanını kullanırsanız kullanın, Data API builder'a bir nesnenin başka bir nesneyle ilişkili olduğunu açıkça söylemeniz gerekir. İki varlık arasında kurulabilecek üç ilişki türü vardır:
Bire Çok İlişkisi
Bire çok ilişkisi, bir nesnenin ilgili nesnelerin listesine erişmesine olanak tanır. Örneğin, bir kitap serisi bu serideki tüm kitaplara erişim izni verebilir:
{
series {
items {
name
books {
items {
title
}
}
}
}
}
Temel alınan iki veritabanı nesnesi arasındaki ilişkiyi destekleyen Yabancı Anahtarlar varsa, yalnızca Data API oluşturucusunun bu tür bir ilişkiyi ortaya çıkarmak istediğinizi söylemeniz gerekir. DAB CLI ile:
dab update Series --relationship books --target.entity Book --cardinality many
Varlığı güncelleştiren series
- örnekte kullanılan:
"Series": {
"source": "dbo.series",
...
"relationships": {
"books": {
"target.entity": "Book",
"cardinality": "many"
}
}
...
}
öğesinin relationships
altına yeni bir anahtar eklenir: books
. öğesi, GraphQL alanı için nesneden series
içinde target.entity
Book
tanımlanan nesneye gitmek için kullanılan adı tanımlar. Bu durumda. Bu, yapılandırma dosyasında adlı Book
bir varlık olması gerektiği anlamına gelir.
cardinality
özelliği, Data API builder'a her seride çok sayıda kitap olabileceğini bildirir, bu nedenle oluşturulan GraphQL alanı öğelerin listesini döndürür.
Tek ihtiyacınız olan bu mülk. Başlangıçta, Veri API oluşturucusu tanımlı ilişkiyi sürdürmek için kullanılması gereken veritabanı alanlarını otomatik olarak algılar.
Veritabanı ilişkisini sürdüren bir Yabancı Anahtar kısıtlamanız yoksa, Veri API oluşturucusu hangi alanların kullanıldığını otomatik olarak çözemez. Veri API'si oluşturucusunun iki varlıkla hangi alanları ilişkilendireceğini söylemek için bunları el ile belirtmeniz gerekir. Cli ile şunları kullanarak dab update
belirtebilirsiniz:
dab update Series --relationship books --target.entity Book --cardinality many --relationship.fields "id:series_id"
seçeneği relationship.fields
, güncelleştirilmekteSeries
olan varlıktan () hangi alanların kullanılacağını ve bir varlıktan diğerine veri bağlamak için hedef varlıktan ()Book
hangi alanların kullanılacağını tanımlamanızı sağlar.
Önceki örnekte, varlığın id
veritabanı alanı Series
varlığın veritabanı alanıyla series_id
Book
eşleştirilir.
Yapılandırma şu bilgileri de içerir:
"Series": {
"source": "dbo.series",
...
"relationships": {
"books": {
"cardinality": "many",
"target.entity": "Book",
"source.fields": ["id"],
"target.fields": ["series_id"]
}
}
...
}
Çoka Bir İlişki
Çoka bir ilişki, iki önemli farka sahip Bire Çok ilişkisine benzer:
- olarak
cardinality
ayarlanırone
- oluşturulan GraphQL alanı liste değil skaler değer döndürür
Daha önce kullanılan Kitap Serisi örneklerinin ardından, bir kitap yalnızca bir seride olabilir, bu nedenle ilişki aşağıdaki DAB CLI komutu kullanılarak oluşturulur:
dab update Book --relationship series --target.entity Series --cardinality one
Bu yapılandırmayı oluşturan:
"Book": {
"source": "dbo.books",
...
"relationships": {
"series": {
"target.entity": "Series",
"cardinality": "one"
}
}
}
Bu da aşağıdaki örneğe benzer bir GraphQL sorgusuna izin verir:
{
books {
items {
id
title
series {
name
}
}
}
}
Her kitabın ait olduğu seriyi de döndürdüğü yer.
Çoka Çok İlişkisi
Çoka çok ilişkiler, birlikte çalışan Bire Çok ve Çoka Bir ilişkilerin bir çifti olarak görülebilir. Bir yazar kesinlikle birden fazla kitap yazabilir (Bire Çok ilişkisi), ancak aynı kitap üzerinde birden fazla yazarın çalışabileceği de doğrudur (Çoka Bir ilişki).
Veri API'sinin oluşturucusu bu ilişki türünü yerel olarak destekler:
- Bire Çok/Çoka Bir ilişkileri kullanma.
- Bağlama nesnesi kullanma.
Bire Çok/Çoka Bir ilişkileri kullanma
Teliflerin bir kitabın yazarları arasında nasıl bölündüğünü takip etmek için büyük olasılıkla bir iş gereksinimi vardır. Bu gereksinimi bir yazarı bir araya getiren özel bir varlık uygulamak için bir kitap ve atanan telif hakları gereklidir. Bu nedenle üç varlık gereklidir:
authors
, yazarların biyografik ayrıntılarını temsil eder.books
, başlık ve Uluslararası Standart Kitap Numarası (ISBN) gibi kitap verilerini temsil etmek için.books_authors
hem bir kitapla hem de yazarıyla ilgili verileri temsil etmek için, örneğin, yazarın belirli bir kitap için aldığı telif yüzdesi.
Üç varlık aşağıdaki diyagram aracılığıyla görselleştirilebilir.
Görünürde iki yönlü ilişki vardır:
- ile arasında
authors
Bire Çok/Çoka Bir ilişkisibooks_authors
- ile arasında
books
Bire Çok/Çoka Bir ilişkisibooks_authors
Böyle bir senaryoyu DAB ile düzgün bir şekilde işlemek için tek gereken yapılandırma dosyasında ilgili varlıkları ve eşlemeleri oluşturmaktır. ve Author
varlığının Book
yapılandırma dosyasında zaten olduğunu varsayarsak:
dab add BookAuthor --source dbo.books_authors --permissions "anonymous:*"
Yeni varlığı eklemek için komutunu çalıştırın dab update
:
dab update Book --relationship authors --target.entity BookAuthor --cardinality many --relationship.fields "id:book_id"
dab update Author --relationship books --target.entity BookAuthor --cardinality many --relationship.fields "id:author_id"
İlişkileri yeni oluşturulan BookAuthor
varlığa eklemek için yeniden çalıştırın dab update
:
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"
ve varlıklarından BookAuthor
ilişkileri eklemek için Book
Author
. Sağlanan yapılandırmayla DAB, aşağıdaki örneğe benzer iç içe sorguları işleyebilir:
{
authors {
items {
first_name
last_name
books {
items {
book {
id
title
}
royalties_percentage
}
}
}
}
}
Tüm yazarları, ilgili telif haklarıyla birlikte yazdıkları kitabı iade etmek istediğiniz yer.
Bağlama nesnesi kullanma
Önceki bölümde açıklanan işlem, Çoka Çok ilişkilerinde yer alan tüm varlıklara GraphQL aracılığıyla erişilmesi gerekiyorsa harika çalışır. Bu senaryo her zaman böyle değildir. Örneğin telif haklarınızı izlemeniz gerekmiyorsa varlık BookAuthor
son kullanıcıya herhangi bir değer getirmez. Varlık yalnızca kitapları yazarlarıyla ilişkilendirmek için kullanılmıştır. İlişkisel veritabanlarında Çoka Çok ilişkileri, Çoka Çok ilişkisine katılan tabloları birbirine bağlayan bu üçüncü tablo kullanılarak oluşturulur:
Diyagramda, yazarları kendi kitaplarıyla ve kitaplarıyla yazarlarıyla ilişkilendiren adlı books_authors
bir tablo olduğunu görebilirsiniz. Bu bağlantı tablosunun son kullanıcıya açık olması gerekmez. Bağlama tablosu yalnızca Çoka Çok ilişkisinin var olmasını sağlayan bir yapıttır, ancak Veri API'sinin oluşturucusunun düzgün bir şekilde kullanabilmesi için var olduğunu bilmesi gerekir.
DAB CLI, Çoka Çok ilişkisini oluşturmak ve ayrıca bağlama nesnesini yapılandırmak için kullanılabilir (önceki bölümde oluşturulan tüm ilişkileri kaldırdığınızdan ve yalnızca ve Author
varlığıyla Book
başlayıp aralarında yapılandırılmış bir ilişki olmadığından emin olun):
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"
Bu, JSON yapılandırma dosyasını şu örnekteki gibi güncelleştirir:
"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" ]
}
}
}
Yapılandırma, DAB'ye varlığa kitabın yazarlarına erişim izni veren bir authors
alan Book
eklemek istediğinizi söylüyor. authors
olabilir many
, bu nedenle GraphQL sorgusu alana eriştiğinde authors
yazar listesi döndürülür. Bu ilişki, kitaplardan yazarlara nasıl gidileceği tanımlar: Kitaplardan yazarlarına gitmek için kullanılan veritabanı alanları, daha önce bu makalede açıklanan Bire Çok veya Çoka Bir ilişkisine benzer şekilde, kitap için ve target.fields
yazarlar için alanında tanımlanırsource.fields
.
Bu ilişki Çoka Çok ilişkisi olduğundan iki varlık arasında doğrudan bağlantı yoktur ve bu nedenle kullanılması linking.object
gerekir. Örnekte, veritabanı tablosu dbo.books_authors
bağlama nesnesi olarak kullanılır. Bağlama nesnesinin kitapları yazarlarına nasıl bağlayabildiği ve linking.target.fields
özelliklerinde linking.source.fields
tanımlanır. İlki DAB'ye kaynak varlığın ( öğesinin Book
) beğenme nesnesine nasıl bağlanıp ikincisinde de bağlama nesnesinin örnekteki hedef varlığa Author
nasıl bağlanacaklarını söyler.
Sağlanan bilgilerin nasıl kullanıldığını anlamak için bu örnek eşdeğer sorguyu kullanabilirsiniz:
select *
from dbo.books as b
inner join dbo.books_authors as ba on b.id = ba.book_id
inner join dbo.authors a on ba.author_id = a.id
Sağlanan yapılandırmayla DAB, GraphQL'i şu örnekte olduğu gibi anlayabilir:
{
books {
items {
id
title
authors {
items {
first_name
last_name
}
}
}
}
}
Kitapları ve yazarlarını almak istediğiniz yer.
uygulamasından öğesine Author
gezintiye izin vermek için Book
, aşağıdaki komutu kullanarak yapılandırma güncelleştirilerek aynı ilkeler uygulanabilir:
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, arka planda bağlama nesnesini dbo.books_authors
kullanarak varlık ile Book
varlık arasında Author
Çoka Çok ilişkisini tanımlar.