Hiyerarşik (kök düğüm hariç her düğümün bir Parent ve 0 ya da daha çok Child düğümü sahip olduğu) data nın Relational Database lerde temsil edilmesi basit olsa da yönetilmesi ilk bakışta göründüğü kadar basit değil ; çünkü alt-üst ilişkisi, veriyi düz satırlar listesi olarak tutan Relational Database lerin doğasına aykırı.

Akla gelen ilk model , Adjacency List (yakınlık listesi) modeli : 

Category : Category_Id | Category_Name | Parent_Id 

Bu modelde , kök düğümün Parent_Id si NULL , diğer tüm düğümlerin Parent_Id si Parent düğümleri gösterir. Temsil edilmesi çok kolay bir modeldir ve yeni düğümler eklemek çok kolaydır; fakat tek bir genel geçer sorgu ile tüm ağaç yapısını ya da ağacın herhangi bir dalını elde etmek mümkün değildir.  Ağacı yönetmek için , SQL sorgusu dışında recursive fonksiyonlara ihtiyaç duyulur. ve defalarca sorgu çekmek gerekir. Büyük ölçekli bir projede hızlı cevap beklenen bir ortamda Adjacency List yöntemi çok yetersizdir ve ciddi bir darboğaz oluşturur

Tüm ağaç yapısını ya da ağacın bir dalını tek bir genel geçer SQL sorgusu ile alabileceğiniz bir model var : Nested Set Model (iç içe küme ler modeli). Joe Celko tarafından ortaya konulan bu modelde tablo yapısı aşağıdaki gibidir : 

nested category : Category_Id | Category_Name | lft | rgt

Nested set modelinde  her düğümün bir   sol (lft) ve sağ (rgt) değeri vardır. Bu değerlerin ne anlama geldiğini anlamak için aşağıdaki çizimden yardım alalım: 

Düğümlere sağ sol değerlerinin atanmasına kök düğümden; yani en dışarıdaki kümeden başlanır. Örnek çizimde en dış küme Clothing, daha sonra men's ve Women's, ve daha sonra men's içerisinde 1 ve women's içerisinde 3 küme şeklide devam ediyor. Soldan sağa numaralandırmayı yaptığımızda , en dıştaki küme (kök düğüm)  en küçük Sol ve en büyük Sağ değerine sahip olur! Ve bu durum tüm düğümler için geçerlidir; tüm düğümler, tüm alt (Child) düğümlerinden daha küçük Sol ve tüm alt düğümlerinden daha büyük Sağ değere sahiptir. Bu kural sayesinde tüm okuma işlemleri tek SQL sorgusu ile hallolur.

NESTED SET MODEL Örnek Sorgular

Aşağıdaki sorgu ile ismini verdiğimiz herhangi bir Category düğümünün altındaki tüm düğümleri çekebiliriz. Verdiğmiz düğümün sol ve sağ değerleri arasında kalan tüm düğümler, verdiğimiz düğümün alt düğümü demektir. 

[sql]SELECT node.* FROM nested_category AS node, nested_category AS parent WHERE node.lft BETWEEN parent.lft AND parent.rgt AND parent.name = 'CATEGORY ismi' ORDER BY node.lft;[/sql]

Aşağıdaki sorgu ile alt düğümü olmayan (leaf node) düğümleri alabiliriz.  sağ değeri sol değerinden bir fazla olan düğümler, alt düğümü olmayan düğümlerdir. 

[sql]SELECT name FROM nested_category WHERE rgt = lft + 1;[/sql]

Aşağıdaki sorgu ile kök düğümden verdiğimiz düğüme giden yolu (path) alabiliriz. 

[sql] SELECT parent.* FROM nested_category AS node, nested_category AS parent WHERE node.lft BETWEEN parent.lft AND parent.rgt AND node.name = 'Category İSMİ' ORDER BY node.lft; [/sql]

Aşağıdaki sorgu ile tüm düğümlerin derinlik bilgilerini alabiliriz.

[sql] SELECT node.name, (COUNT(parent.name) - 1) AS depth FROM nested_category AS node, nested_category AS parent WHERE node.lft BETWEEN parent.lft AND parent.rgt GROUP BY node.name ORDER BY node.lft; [/sql]

Sonuç

Nested set modelini, kendi sistemimizde bir Rol tabanlı erişim kontrolü yapısının alt-üst departman ilişkilerini yönetmek için kullandık. Kullanım şekli olarak %99+ oranda okuma yapacağımız için tüm ağaç yapısının tek sorguda elde edilmesi bizim için çok önemliydi ve Nested Set modeli bu ihtiyacı en iyi şekilde karşıladı. Bu sebeple yazımda  okuma sorgularına değindim. Düğüm ekleme , düğüm çıkarma ve düğüm taşıma gibi yönetim işlemler için  örnek sorgu ve açıklamaları buradan bulabilirsiniz.


Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.