Edgedb İlişkiler
2023-04-12
Edgedb’de iki tablo arasında ilişki kurmak için link
anahtar kelimesi kullanılır. Linkler, bir objenin başka bir objeyle ilişkilendirilmesine izin verir.
Örneğin, bir User
tablosu ve bir Article
tablosu varsa, Article
tablosundaki her bir Article, bir User
ya atfedilebilir. Bu durumda, User
ve Article
tabloları arasında bir ilişki kurabiliriz.
İlk olarak, User
tablosunda bir id
özelliği tanımlarız. Bu özellik, kullanıcının benzersiz bir kimliğini temsil eder.
type User {
required property id -> uuid;
property name -> str;
}
Ardından, Article
tablosunda bir author
özelliği tanımlarız. Bu özellik, User
tablosunda bir Userya atıfta bulunur.
type Article {
required property id -> uuid;
property title -> str;
required link author -> User;
}
Bu örnekte, Article
objesi için bir author
linki tanımladık. Bu link, User
objesiyle ilişkilendirilir. required
anahtar kelimesi, her bir Articlenin bir authorla ilişkilendirilmesi gerektiğini belirtir.
İlişki kurulduktan sonra, Article
tablosundaki her bir Article, User
tablosundaki bir Userya atfedilebilir. Ayrıca, User
tablosundaki her bir kullanıcının many Articlesi olabilir. Bu şekilde, iki tablo arasında bir ilişki kurulmuş olur.
İlişki kurulduktan sonra, bu ilişkiyi kullanarak bir kullanıcının makalelerini bulabiliriz. Örneğin, User
tablosundaki bir kullanıcının ID’sini kullanarak, o kullanıcının yazdığı tüm makaleleri bulabiliriz.
SELECT Article
FILTER .author = <User_ID>
Bu sorgu, Article
tablosundaki tüm makaleleri seçer ve sadece belirli bir kullanıcının yazdığı makaleleri filtreler. User_ID
değişkeni, aranacak User’ın benzersiz kimliğini temsil eder.
Edgedb’de, multi link
olarak adlandırılan bir özellik, bir tablo ve diğer tablolar arasındaki çoklu ilişkileri tanımlamak için kullanılır. Multi link, bir tablo sütununda birden fazla öğe içeren listeleri temsil etmek için kullanılır.
Örneğin, bir blog sitesi tasarımı üzerinde çalışıyorsanız, blog yazıları ve yorumlar arasındaki ilişkiyi multi link kullanarak tanımlayabilirsiniz.
# Blog yazıları tablosu
type BlogPost {
required property id -> uuid
required property title -> str
required property content -> str
required link author -> User
multi link comments -> Comment
}
# Yorumlar tablosu
type Comment {
required property id -> uuid
required property content -> str
required link author -> User
required link post -> BlogPost
}
# Kullanıcılar tablosu
type User {
required property id -> uuid
required property name -> str
required property email -> str
}
Bu kodda, BlogPost
tablosunda comments
adında bir multi link tanımlıyoruz. Bu multi link, Comment
tablosuna bağlıdır ve her bir BlogPost
kaydıyla birçok Comment
kaydı bağlayabilir.
Ayrıca, Comment
tablosunda post
adında bir link tanımlıyoruz. Bu link, BlogPost
tablosuna bağlıdır ve her bir Comment
kaydını ilgili BlogPost
kaydına bağlar.
Böylece, her bir blog yazısı için ilişkili olan tüm yorumları kolayca bulabiliriz. Ayrıca, bir kullanıcının tüm yorumlarını da bulmak için User
tablosundaki id
ile author
alanını eşleştirebiliriz.
Tablo tasarımımızı kullanarak örnek bir ekleme, güncelleme ve sorgulama sorgusu şu şekilde olabilir:
INSERT BlogPost {
id := <rastgele bir UUID>,
title := 'İlk Blog Yazısı',
content := 'Bu bir deneme blog yazısıdır.',
author := (SELECT User FILTER .name = 'John Smith'),
comments := {}
};
Bu sorgu, BlogPost
tablosuna yeni bir kayıt ekler. id
, title
, content
ve author
alanları zorunlu olduğundan, bunların değerleri belirtilmiştir. comments
alanı ise boş bir küme olarak tanımlanmıştır, çünkü henüz herhangi bir yorum eklenmemiştir.
INSERT Comment {
id := <rastgele bir UUID>,
content := 'İlk yazı',
author := (SELECT User FILTER .name = 'Ali Veli'),
post := (SELECT BlogPost FILTER .title = 'İlk Blog Yazısı'),
};
Bu sorgu, Comment
tablosuna yeni bir kayıt ekler. id
, content
, author
ve post
alanları zorunlu olduğundan, bunların değerleri belirtilmiştir. author
alanı, yorumu ekleyen kullanıcıyı belirtirken post
alanı, yorumun hangi blog yazısına yapıldığını belirtir.
UPDATE BlogPost
FILTER .title = 'İlk Blog Yazısı'
SET {
content := 'Yazı güncellendi.',
};
Bu sorgu, BlogPost
tablosunda title
alanı ‘İlk Blog Yazısı’ olan kaydı bulur ve content
alanını ‘Yazı güncellendi.’ olarak günceller.
SELECT BlogPost {
title,
content,
author: {
name
},
comments: {
content,
author: {
name
},
},
}
FILTER .title = 'İlk Blog Yazısı';
Bu sorgu, BlogPost
tablosunda title
alanı ‘İlk Blog Yazısı’ olan kaydı bulur ve ilgili bilgileri döndürür. author
alanı,
User
tablosunda ilgili kullanıcının adını içerirken, comments
alanı ilgili blog yazısına ilişkili tüm yorumları içerir. Her yorumda, content
alanı ve yorumu yazan kullanıcının name
alanı yer almaktadır.
İlişki kurarken, linklerin kullanımı çok önemlidir. Linkler, birçok farklı senaryoda kullanılabilir ve veritabanı tasarımında esneklik sağlar.
Ayrıca, linkler sayesinde iki tablo arasındaki ilişki güncellendiğinde, tüm ilgili kayıtlar otomatik olarak güncellenir. Örneğin, bir kullanıcının adını güncellediğimizde, tüm Articlelerde bu kullanıcının adı otomatik olarak güncellenir. Bu, veritabanının tutarlılığını sağlamak için önemlidir.
Bununla birlikte, linklerin kullanımı bazen performans sorunlarına neden olabilir. Özellikle, çok sayıda ilişki içeren büyük veritabanlarıyla çalışırken, linklerin kullanımı veritabanı sorgularının yavaşlamasına neden olabilir. Bu nedenle, Edgedb’de ilişkileri olabildiğince basit ve sınırlı sayıda link kullanarak tasarlamak önemlidir.