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 Userya 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.



Bu gibi daha fazla gönderi...

Edgedb Computed Links

2023-04-12 | #edgedb #edgedb-links

Computed Links, iki nesne arasındaki ilişkileri tanımlamak için kullanılan bir yapıdır. Bu bağlantılar, ilişkilendirilmiş nesnelerin birbirine olan ilişkisini hesaplamak için tanımlanmış bir sorgu veya fonksiyon kullanarak oluşturulur. Bu yapı, veritabanında tutulan verilerin tutarlılığını sağlamak için oldukça yararlıdır. Computed Links, veriler arasında sıkı bir şekilde bağlantı kurmanın yanı sıra, veritabanında saklanan verilerin değiştirilmesi veya güncellenmesi durumunda bağlantıların otomatik olarak güncellenmesini sağlar. Ayrıca, sorgulama ve raporlama işlemlerini kolaylaştırmak için de kullanılabilir. Örneğin, bir Computed Link aracılığıyla iki nesne arasındaki ilişkiyi hesaplayarak, sorgulama işlemini daha verimli hale getirebilirsiniz.

Devamı 


Edgedb Exclusive Constraint

2023-04-12 | #edgedb #edgedb-constraints

Edgedb’de exclusive constraint (özel kısıtlama) terimi, belirli bir özelliğin benzersiz olmasını veya belirli bir aralıkta olmasını sağlayan bir kısıtlama türünü ifade eder. Örneğin, bir User objesinde email özelliğinin benzersiz olmasını sağlayan bir özel kısıtlama oluşturabilirsiniz. Böylece, her bir User’ın sadece bir kez kaydedilmesini sağlayabilirsiniz. Aşağıdaki örnekte, email özelliğinde benzersizlik sağlayan bir özel kısıtlama tanımlıyoruz: type User { required property id -> uuid; required property name -> str; exclusive constraint unique_email on (.

Devamı 


Edgedb Computed Properties

2023-04-12 | #edgedb #edgedb-properties

Computed properties (hesaplanmış özellikler), veri modellerinde kullanılan çok yararlı bir kavramdır. Hesaplanmış özellikler, veritabanında saklanmayan ancak sorgulama esnasında hesaplanan özelliklerdir. Bu özellikler, veritabanı yapılarını daha esnek hale getirir ve verilerinizi daha verimli bir şekilde depolamanıza olanak tanır. Edgedb, hesaplanmış özellikleri destekleyen modern bir veritabanı yönetim sistemidir. edgedb’de, hesaplanmış özellikleri tanımlamak için birkaç yöntem vardır. Bir hesaplanmış özellik tanımlamak için, property ifadesini kullanarak bir özellik oluşturabilirsiniz. Özellik oluştururken, expr anahtar kelimesini kullanarak hesaplanmış özellik için bir ifade belirleyebilirsiniz.

Devamı 