Edgedb Computed Links
[en] Read in English 2023-04-12
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.
Bu yapı, edgedb’nin yüksek performanslı ve verimli veritabanı motoru sayesinde, büyük ve karmaşık veri modellerinde de kullanılabilir.
Örneğin, bir e-ticaret web sitesi için, bir siparişin birden fazla ürünü olabilir ve her bir ürünün stok seviyesi, priceı ve diğer özellikleri farklı olabilir. Bu durumda, sipariş ve ürünler arasında bir bağlantı kurmak için bir Computed Link kullanılabilir.
Tablo A, Order
adıyla bir tablo olabilir ve siparişlerin numarası, tarihi, müşteri bilgileri ve diğer özelliklerini içerebilir. Tablo B ise Product
adıyla bir tablo olabilir ve ürünlerin adı, stok seviyesi, fiyatı ve diğer özelliklerini içerebilir.
Bunun için, bir Computed Link kullanarak her bir siparişin birden fazla ürününe bağlanabilirsiniz. Örneğin, order_id
alanını ve
product_id
alanını kullanarak bir Computed Link tanımlayabilirsiniz. Bu link, siparişler tablosundaki her bir siparişin ürünler tablosundaki ilgili ürüne bağlanmasını sağlayacaktır.
Aşağıdaki örnek, Edgedb dilinde bu Computed Link yapısının nasıl oluşturulacağını göstermektedir:
type Order {
required property order_id -> str;
required property created_at -> datetime;
required link customers -> Customer;
multi link products := (
WITH
order := (SELECT Order FILTER .order_id = <str>$self.order_id),
order_product := (SELECT OrderProduct FILTER .order_id = order.order_id)
SELECT Product FILTER .product_id = order_product.product_id
);
}
type Product {
required property product_id -> str;
required property name -> str;
required property price -> decimal;
required property stock_level -> int16;
}
type OrderProduct {
required link order -> Order;
required link product -> Product;
}
Bu örnekte, Order ve Product adında iki ayrı tablo tanımlanmıştır. Order tablosunda, “products” adında bir Computed Link tanımlanmıştır. Bu link, Order
tablosundaki her bir siparişin Product
tablosundaki ilgili ürüne bağlanmasını sağlar.
Computed Link yapısında, multi link
kullanılarak birden çok ilişki belirtilir. Bu örnekte, “multi link products” ifadesiyle her bir siparişin birden fazla ürüne bağlanması sağlanır.
Computed Link’in WITH
ifadesi içinde yer alan sorgu, ilişkili nesnelerin belirlenmesinde kullanılır. Bu örnekte, her bir siparişin ürünlerini belirlemek için order
adıyla bir değişken oluşturulmuş ve daha sonra bu değişken kullanılarak
order_product
adlı bir başka değişken oluşturulmuştur. Bu sorgu, belirtilen siparişin ürünlerini içeren OrderProduct
nesnelerini filtrelemek için kullanılmaktadır.
Computed Link, sonrasında SELECT
ifadesi ile birlikte kullanılarak, ilişkili nesnelerin belirlenmesinde kullanılır. Bu örnekte, Computed Link, SELECT Product
ifadesiyle ilişkili ürünleri seçmek için kullanılmıştır.
Order
ve Product
tabloları arasında bir Computed Link kullanılarak her bir siparişin birden fazla ürüne bağlanması sağlanmıştır. Bu bağlantı, verilerin tutarlılığını sağlamak, sorgulama işlemlerini kolaylaştırmak ve veri modelinin daha esnek olmasını sağlamak için oldukça yararlıdır.
Yukarıdaki örnekteki tabloları ve Computed Link’i kullanarak bir sorgu örneği yazalım. Sorgulama işlemi, her bir siparişin numarasını ve o siparişe ait ürünlerin isimlerini ve pricelarını listelemek olacaktır.
SELECT
s.order_id,
ARRAY_AGG(u.name) AS product_name,
ARRAY_AGG(u.price) AS product_price
FROM
Order s
LEFT JOIN OrderProduct su ON s.order_id = su.order.order_id
LEFT JOIN Product u ON su.product.product_id = u.product_id
GROUP BY
s.order_id;
Bu sorgu, Order ve OrderProduct tablolarını birleştirerek, her bir siparişin ürünlerini belirlemek için Computed Link’i kullanmaktadır. Sonuç olarak, her bir siparişin numarası ve o siparişe ait ürünlerin isimleri ve fiyatları listelenmektedir.
LEFT JOIN
ifadesi kullanılarak, bazı siparişlerin henüz ürünleri olmadığı durumlarda bile sonuçlar görüntülenebilir. GROUP BY
ifadesi ise her bir siparişin ürünleri birleştirildiğinde, her bir sipariş için yalnızca bir satır oluşturulmasını sağlar.