16 Aralık 2009 Çarşamba

SQL Sorgu Optimizasyonuna Yardımcı Araçlar

Sorgu optimizasyonu yaparken, her değişiklikten sonra performans bilgisini gözlemleme işlemini tekrarlamak gerekir. Bu gözlem, yapılan değişikliğin performansı iyi mi kötü etkilediğini belirlemeye yardımcı olur.
1. Elapsed Time
Bir sorgunun çalışmak için aldığı zaman uzunluğu ‘Elapsed Time’ olarak adlandırılır. Sorgunun tamamlanma süresini birçok şey etkileyebilir. Tamamlanma süresi en iyi değerlendirme ölçüsüdür, çünkü bu değere kullanıcının sorgu çalışırken bekleyeceği zamandır. Tamamlanma süresini görebileceğimiz ilk yer SQL Server Management Studio’ da sorgu penceresidir. Aşağıdaki gibi görülür.
image
Tamamlanma süresini görebileceğimiz diğer seçenek SET STATISTICS komutunu kullanmaktır. Aşağıda bu komut ile çalıştırılmış sorgu ve sonuç penceresi görünüyor. 

image
Yukarıdaki örnekte SELECT deyiminden önce ‘SET STATISTICS TIME ON’ komutunu kullandık. Sonuç penceresinde ‘Elapsed Time’ bilgisi yanı sıra ‘CPU Time’ bilgisi ve PRINT deyiminin değeri bulunuyor. ‘SET STATISTICS TIME ON’ deyimi, her deyimin parse, compile ve execute işlemlerinin aldığı zamanı görüntüler. Bu deyim az sayıda komut çalıştırılacağı zaman faydalıdır. Eğer çok sayıda satır çalıştırılıyorsa okunması zor bir sonuç elde edilebilir.
2. CPU Time
Bir diğer önemli performans ölçümü CPU miktarıdır. Tamamlanma süresini görüntülemek için de kullandığımız ‘SET STATISTICS TIME ON’ komutu ile her deyimin CPU zamanını da görüntüleyebiliriz. Bu CPU tüketimini ölçmek için ilk yöntemdir.
SQL Server CPU tüketimini ölçmek için kullanılan @@CPU_BUSY sistem değişkenini sunar. @@CPU_BUSY sistem değişkeni SQL Server başlatıldığından itibaren olan çalışmak için harcanan süreyi döndürür. Sonuç CPU zaman artışıdır ve tüm CPU için kümülatiftir, böylece aktif tamamlanma süresini aşabilir. @@TIMETICKS değişkeni ile çarpılarak mikro saniye birimine dönüştürülebilir.
Aşağıdaki örnekte döngülerin çalışma süreleri SQL Server CPU miktarının @CPU_BUSY kullanımı ile ölçen yöntem bulunuyor. @@CPU_BUSY değişkeni SQL Server start edildiğinden itibaren serverda sorgu çalıştıran tüm kullanıcıların ve sistem sorgularının CPU miktarını barındırır. Bu yüzden bu yöntem, sistemde bir komut çalıştırsak ve arka planda başka sorgu çalışmıyorsa doğru sonuç verir.
image
Yukarıdaki örnekte görüldüğü gibi 1 ve 2. döngü CPU miktarını milisaniye biriminden hesapladık. Bu sorguyu farklı zamanlarda her çalıştırdığımda farklı sonuçlar alabilirim. SQL Server’ da çalışan diğer işlemler bu metoda etki eder. Bu metot ile aktif CPU kullanımı hesabı çok doğru bir sonuç vermeyebilir ancak aktivitesi az olan bağımsız sistemlerde işe yarar bir yöntemdir.
SQL Server Profiler kullanarak CPU ölçümü yapmak daha kesin bir yöntemdir. Yukarıda çalıştırdığımız sorgunun Profiler görüntüsü aşağıda görüleceği gibi CPU kolonunda Harcanan CPU miktarı bulunur. CPU değerini görüntülemek için SQL: BatchCompleted eventi kullanarak çalıştırmak gerekir. SQL Profiler sabit olarak süreleri milisaniye olarak görüntüler. ‘Tools/Options’ menüsündeki bir seçenek ile mikro saniye olarak görüntülenecek şekilde değiştirilebilir. Bu metot ile örnek sorgumuzdaki her döngünün miktarını değil sorgunun bütünüyle tamamlandığı miktarı elde ederiz.
image
3. I/O Usage
Diğer performans ölçüleri gibi I/O miktarını da çeşitli TSQL deyimleriyle sorgulamak mümkündür. SQL Server’ da 2 çeşit I/O yolu vardır: Logical ve Physical I/O. Logical I/O hafızadaki tampon alandan işlem gören veriden sorumludur. Physical I/O, SQL Server’ ın depolama için kullandığı fiziksel diskten direk olarak veri erişimi ile ilişkili giriş/çıkışlardır. Fiziksel I/O, işlemler daha uzun zaman aldığı için daha maliyetlidir. I/O genel olarak SQL deyiminin performansına tek başına etki eder yani maliyetlidir. Buna göre sorgu tasarlarken oluşacak result set üreten physical ve logical I/O operasyonlarının sayısını küçültmek gerekir.
TSQL deyimleriyle I/O miktarını görüntülemenin ilk yolu, ‘SET STATISTICS IO ON’ deyimini kullanarak I/O istatistiklerini açmaktır. SQL deyiminin sonucuyla birlikte bu bağlantı süresince SQL deyimine karar vermek için kullanılan I/O sayısını çıktı olarak döndürecektir.
image
Yukarıdaki örnek sorguyu çalıştırdığımızda Logical Read 34 Physical Read 3 olarak gerçekleşti. Şimdi aynı sorguyu ikinci kez çalıştırıp aşağıdaki sonuca bakalım:
image
Yukarıda çıkan sonuca göre sorgu ikinci kez çalıştığında TSQL deyiminin sonucunda Logical Read 34 Physical Read 0 olarak görünüyor. Çünkü bu sorgun verileri tutan database pageleri zaten buffer pooldadır. Performans arttırmak için yapılan testlerde tekrarlayan işlemler yapıyorsak, bu I/O miktarını buffer pooldan okuması işlemini ortadan kaldırmalıyız. Bunun için de “DBCC DROPCLEANBUFFERS” komutunu sorgularımızdan önce çalıştırmalıyız. Bu işlem sorguların SQL Server stop start işlemi yapmadan temiz buffer pool ile çalışmasına imkan sağlar.
Serap PARLAK

Cluster ve clustering nedir? Cluster oluşturmanın faydaları nelerdir? (Bölüm I)

Cluster, basit anlamda benzer bir amaç için belirli bir konfigürasyon yapılarak aynı görevi birlikte ya da yedekli çalışmasını sağlayan servistir. Cluster farklı amaçlarla oluşturulabilir fakat son kullanıcı tarafından her zaman tek bir bilgisayar gibi gözükecektir. Bir cluster oluşturmak için en azından iki adet sunucuya ihtiyaç vardır ve bir cluster içindeki her bir sunucu “node” olarak adlandırılır. İhtiyaç olan hizmete göre çeşitli sayıda nodelar bir araya gelerek clusterları oluşturmaktadır. Bir cluster oluşturmak için gerekli sebepler daha fazla performans ihtiyacı, yüksek erişilebilirlik (high availability) ya da her ikisi birlikte olabilir.
Şimdi cluster çeşitlerini çok fazla ayrıntıya girmeden biraz daha yakından inceleyelim.
Yüksek erişilebilirlik (High-availability) clusterları
Bu tip cluster yapısında öncelik erişilebilirliği arttırmadır. Bunu tek bir sunucunun görevini herhangi bir donanım yada yazılım problemi oluştuğunda diğer bir sunucunun otomatik olarak devralması olarak özetleyebiliriz. Böylece özellikle kritik önem içeren hizmetler (örn: veritabanı yada web servisleri) kesintisiz yada min. kesinti süresiyle hizmet vermeye devam edecektir. Cluster içindeki arızalı sunucuya müdahale edilip tekrar cluster ortamına dahil edilebilmesi sırasında hizmet kesintisiz olarak devam edecektir. Bu özelliği failover olarak adlandırıyoruz.

Yine görüyoruz ki cluster ortamında ne kadar çok node olur ise sağlanılan hizmette ya da serviste kesinti olabilme ihtimalinin de o denli düşeceğidir. Bu cluster yapısında en yaygın olan konfigürasyon iki node ile oluşturulan clusterdır. Aktif-pasif şekilde çalışır. Bu demektir ki bir sunucu sürekli hizmet sağlarken diğeri pasif bir biçimde birinci sunucuda oluşabilecek olası bir soruna karşı arka planda beklemektedir.
Bir sunucunun sürekli bir şekilde pasif halde beklemesi pahalı bir çözüm gibi görülebilir fakat olası bir hizmet kaybında ne kadar sürede sunucu tekrar devreye alınabilir ve bu süre kaybı ilgili kuruluşta yaratacağı maddi ve müşteri gözünde itibar kayıpları ne olacaktır, bunların değerlendirmesi dikkatli bir biçimde yapılmalıdır.
Yük dağıtımlı clusterlar (Load-Balancing clusters)
Bu tarz clusterlarda ise yine birden fazla sunucu belirli bir servis ya da hizmeti oluşan işlem yükünü ortak bir biçimde paylaşarak kullanırlar. Örneğin özellikle microsoft server işletim sistemlerinin desteklediği webserverlar üzerinde kullanılan NLB (network load balancing) örnek olarak gösterilebilir. Burada aynı web hizmetini veren birden fazla sunucu NLB ile sanal bir ip adresi oluşturularak ortak bir havuzda toplanır ve bu ortak ip adresine gelen tüm web istekleri NLB tarafından havuzdaki sunuculara yönlendirilir.
Sıradaki isteğin havuzda bulunan hangi sunucuya ileteceğine NLB karar verir. Web sunucumuz şu anda tüm isteklere karşılık verebilecek kadar güçlüde olsa sonuçta bir tek fiziksel bileşeni temsil ettiğinden oluşabilecek herhangi bir problemde web hizmeti dağılımı hem de failover yapabilmeniz hizmet kalitenizi büyük oranda arttıracaktır. Burada yine sunuculardan birinin devre dışı kalmasını, son kullanıcılarınız fark etmeyecektir.
Diğer cluster türleri
Yukarıda açıklamış olduğumuz cluster yapılarına benzer fakat farklı amaçlar için oluşturulan cluster yapıları da dünyada mevcuttur. Örneğin Formula 1 ya da uçak firmalarının özel simülasyon programlarının yüksek ihtiyaçlarını karşılamak için oluşturduğu cluster yapıları da bulunmaktadır. Ya da daha insani amaçlar için (kanser, aids vb tedavileri) ortak bir merkezde kurulan ve sizin bilgisayarınıza bir client yazılım indirerek çok büyük bir araştırmanın üzerinde işlem yapılmasına ihtiyaç duyulan küçük parçalarını bilgisayarınıza çekerek gerekli hesaplamalar tamamlandıktan sonra tekrar ana merkeze gönderen clusterları da bu yelpazeye ekleyebiliriz. Buradaki amaç bu şekilde dünyanın her yanında ev bilgisayarlarından bir cluster oluşturarak işlem gücü çok yüksek bir süper bilgisayar oluşturmaktır.
Clustering farklı mimariler ve işletim sistemlerinde mümkün olan bir hizmettir fakat bu makalede Microsoft Server ailesi üzerinde clustering yapısına değineceğiz.
Windows server 2008 clustering ile gelen yenilikler
Windows server 2008 ile birlikte cluster yapısında ve kurulumunda önceki işletim sistemlerine göre birçok yenilik ve farklılık gözümüze çarpmakta. Bunlardan ilki artık cluster hizmetinin windows server 2003’te olduğu gibi hazır kurulu şekilde gelmediği. Sunucumuz üzerinde cluster kurmak istiyorsak bunu add feature sihirbazından eklememiz gerektiğidir. Ayrıca cluster hizmetinin yeni kurulum dizini windows klasörü altında cluster dizini olarak değiştirilmiştir.
Diğer yeni bir özellik ise gelişmiş cluster kurulum sihirbazı olarak adlandırılabilir. Bu sihirbaz sayesinde kurulum öncesi işlemci, ağ yapısı, disk konfigürasyonları vb donanım uyumluluğunu test edebilir, clusterınızı oluştururken adım adım nodelar ekleyebilir ve önceden konfigürasyonunu tamamladığınız diskleri kullanmak istediğiniz hizmet yada servis için ekleyebilirsiniz. Aynı zamanda yine bu sihirbaz ile gerek kurulum öncesi gerekse kurulum tamamlandıktan sonra clusterınız hakkında yapılan testlerin sonucunu görebilir microsoftun önerdiği çözümleri ya da tavsiyeleri görebilirsiniz.
Burada alacağınız hata mesajlarının tümü cluster kurulumuna engel olmayacaktır fakat gerçekleştirdiğiniz çözüm Microsoft tarafından önerilmeyebilir. Bir örnek vermek gerekirse eğer cluster için hazırlamış olduğunuz nodelarda sadece tek ethernet kartı mevcutsa bu çift ethernet kartı ile kurulması yönünde uyarı gelecek fakat kuruluma devam edilebilecektir.
Ayrıca güvenliğin arttırılması adına windows server 2008 cluster nodeları server 2003 ve öncesi işletim sistemlerinden oluşan bir cluster içerisine dahil olamamaktadır. 2003 server işletim sistemlerinden oluşan clusterlar server 2008 cluster management içerisindeki migration tool ile server 2008’e güncellenebilmektedir.
Yine ek bir güvenlik özelliği olarak cluster servisi artık domain admin hesabı değil local admin hesabı üzerinden çalışmaktadır. Authentication işlemi ise active directory üzerinde oluşturulan sanal cluster bilgisayar hesapları ile NTLM yerine Kerberos üzerinden denetlenmektedir. Burada özellikle varolan domain controllerınız server 2003 ise çeşitli problemlere karşılaşabilirsiniz. Yazının ikinci kısmı olan kurulum ve konfigürasyon makalesinde özellikle R2 versiyonuda dahil tecrübe edindiğimiz sorunları ve çözümleri sizlerle paylaşacağız.
Server 2003’ten bu yana eklenen yeni bir özellik ise 2003’te bir cluster maksimum 8 node destekleyebilirken server 2008 x64 platformunda bunun 16node a çıkarılmış olmasıdır. Bu özellik, tahmin edebileceğiniz üzere büyük ölçekli kurumsal çözümler için hayati bir önem taşımaktadır.
Yine server 2008 ile artık Windows clusterlar için IPv6 desteği eklenmiştir.
Cluster içerisinde nodeların birbirleriyle habeleşmesini sağlayan heartbeat interface’in haberleşme yapısı broadcastten unicast’e çevrilmiştir. Bu da nodeların farklı ip bloklarında olabilmesini sağlamaktadır. Ayrıca DHCP üzerinden IP adresi alabilme opsiyonu eklenmiştir. Fakat şahsi görüşüm yinede hiçbir sunucunuzu çok özel bir konfigürasyon nedeniniz olmadıktan sonra static ip olucak şekilde configure etmenizdir. Ayrıca heartbeat interface için alive check değeri değiştirilebilir hale gelmiştir bu şekilde bu değer arttırılarak daha yavaş bağlantılar üzerinde bulunan sitelardaki cluster yapılarında da nodeların fail duruma düşmemesi sağlanabilir.
Server 2008 ile gelen bir sürpriz bir değişiklik de artık cluster üzerinde fiziksel disk kullanamamanız. En azından bir adet SAN (Fiber,SAS,iSCSI) diski eklemeniz zorunludur. Bu disk ise clusterın bilgilerinin tutulduğu eski adı quorum yeni adı ile witness disk olarak adlandırılmaktadır. Tavsiye edilen boyut 512Mb-1Gb dır. Ayrıca bir sql server cluster ortamı yaratmak istiyorsak bunun için yine ilgili boyuttaki data disklerininse sql kurulum öncesinde ayarlanması ve server 2008 içerisindeki iscsi initiator kısayolundan server üzerine eklenmesi gerekmektedir. Ayrıca depolama alanında server 2008le birlikte gelen GPT partition tablolama desteği ile 2 terabyte a kadar partition desteği gelmekte.
Referanslar
  • Microsoft clustering white paper
Bora ENGİN

10 Aralık 2009 Perşembe

JOIN Türüne Göre SQL Optimizer Çalışma Mantığı

SQL Optimizer, Joinler için 3 farklı yöntem kullanmaktadır:
1. Nested Loop : Bir tablonun (outer table) tüm satırlarını döner ve her satır için diğer tablonun(inner table) satırlarını dönerek eşleştirmeye çalışır. Kayıt sayıları az olduğunda en iyi performansı verir. Right ve Full Outer Join bu yöntemi kullanmaz. Input tablonun büyüklüğü çarpı Output tablonun büyüklüğü maliyetle orantılıdır. Algoritma mantığı aşağıdaki gibidir:
for each row R1 in the outer table
    for each row R2 in the inner table
        if R1 joins with R2
            return (R1, R2)
2. Merge Join : Aynı anda iki tablonun birer satırını okuyup karşılaştırarak eş zamanlı çalışır. Ancak iki tablonun join keylerinin sıralı olması zorunludur. “T1.a = T2.b” şeklinde bağlandıysa t1 in a, t2 nin de b kolonuna göre sıralı olması gerekmektedir. Tüm join tiplerini destekler. Kayıt sayısıyla maliyeti orantılıdır. Büyük kayıtlar için iyi sonuç verir. Input tablonun büyüklüğü maliyetle orantılıdır. Algoritma mantığı aşağıdaki gibidir:

get first row R1 from input 1
get first row R2 from input 2
while not at the end of either input
    begin
        if R1 joins with R2
            begin
                return (R1, R2)
                get next row R2 from input 2
            end
        else if R1 < R2
            get next row R1 from input 1
        else
            get next row R2 from input 2
    end
3. Hash Join : Diğer iki çalışma şeklinden daha maliyetlidir. Sıralı olmayan büyük verilerde kullanılır. İlk tablonun tüm satırlarını okur, hash anahtarı yaratır ve bellekte yarattığı hash tabloya yazar. Sonra diğer tablonun satırlarını dönerek, her satır için hash anahtarı yaratır ve hash tablodaki değerlerle karşılaştırır. En maliyetli join türüdür. Algoritma mantığı aşağıdaki gibidir:
for each row R1 in the build table
    begin
        calculate hash value on R1 join key(s)
        insert R1 into the appropriate hash bucket
    end
for each row R2 in the probe table
    begin
        calculate hash value on R2 join key(s)
        for each row R1 in the corresponding hash bucket
            if R1 joins with R2
                return (R1, R2)
    end
View içerisindeki sorgularda INNER JOIN kullandığımızda, SQL optimizer “Hash Join” yapmaya karar verir. Büyük ve sıralı olmayan bir data olduğundan bu yöntemi seçer. Left join yaptığımızda ise Optimizer, Nested Loop yapmaya karar verir ve bu çok daha hızlı çalışmaktadır. Bilişim dünyasında her durumun tek bir doğrusu olmaması burada da geçerlidir. Çözüm olarak;  indeksleri düzenleyerek dataları sıralı hale getirebilir veya uygulamanın ihtiyacına göre LEFT JOIN kullanabiliriz.
Serap PARLAK

9 Aralık 2009 Çarşamba

Aynı SQL Veritabanını Birden Fazla Sunucuda Kullanma

Zaman zaman gerek performans açısından, gerekse farklı nedenlerle aynı veritabanına farklı sql sunuculardan erişme ihtiyacı doğar. Burada karşımıza farklı seçenekler çıkar. Bunlara kısaca bakacak olursak:
1. Mirroring
2 (principal, mirror) veya 3 sunucu ile (principal, mirror, witness) kurulur. Principal ve mirror sunucular sql standard veya enterprise edition olmalıdır. Witness olan sunucu ise sql express edition bile olabilir. Ancak witness sunucu varsa yüksek bulunurluk olabilir. Üç farklı şekilde kurulabilir:
  1. Yüksek bulunurluk (witness sunucu ile senkron veritabanı)
  2. Yüksek koruma (witness sunucu kullanmadan senkron veritabanı)
  3. Yüksek performans (witness sunucu kullanmadan asenkron veritabanı)
Mirror olan veritabanına erişilemez (aktif olmadığı sürece recovering statüsünde kalır Bir veritabanının sadece bir tane mirror kopyası olabilir. Mirror olan veritabanından sadece okuma yapmak için snapshot alınabilir. Özellikle uzak lokasyona mirror alınıyorsa uygun bir çözümdür.

2. Snapshot
Sadece snapshot alındığındaki anlık bilgiyi içerir. Boyut olarak daha ufaktır (commit edilmemiş transactionları içermez). Her snapshot alındığında veritabanının tamamı transfer edildiğinden, ufak veritabanı için uygundur. Sadece okuma yapılabilir.
3. Log Shipping
Kritik olmayan veritabanları için veri kurtarma çözümüdür. İki veya daha fazla sunucu ile kurulur (primary ve standby). Sunucular sql standard, enterprise, workgroup veya developer edition olabilir. Simple recovery ile çalışmaz. Full veya bulk-logged olmalıdır. Otomatik transfer işlemleri için her iki sunucuda da Sql Agent çalışıyor olmalıdır. Logların kopyalanması için okuma/yazma yetkisi olan ortak bir disk alanı olmalıdır. Sql Agent servisini çalıştıran kullanıcının bu ortak alana okuma/yazma erişimi olmalıdır. Standby veritabanından okuma yapılabilir.

image
Şekil 1. Log shipping
4. Merge Replication
Üç farklı replikasyon yönteminden (transaction, merge, snapshot) en çok kullanılanıdır. Veri çalışması olabilecek mobil uygulamalar veya dağıtık sunucu uygulamaları için kullanılır. Çakışan veriler, tanımlı kurallara göre birbirini ezebilir. Diğer yöntemlerden farklı olarak:
  1. Veriler dışındaki objeler de (kullanıcılar, yetkiler, vb) taşınır
  2. İki veri tabanına da yazma yapılabilir
Sonuç olarak, her yöntemin kendi içinde artıları ve eksileri olduğundan, uygulamanın ve bize sağlanan ortamın özelliklerine göre (sunucu sayısı, kullanıcı sayısı, lokasyonlar, okuma veya yazma yapılacağı vb) işimizi görecek en performanslı yöntem tercih edilmelidir.
Necmettin TÜRER

6 Aralık 2009 Pazar

UML ve Modelleme – Bölüm 4 (Class (Sınıf) Diyagramları)

Bir önceki makalemizde UML modellemede kullanılan ilk diyagram olan Use Case diyagramını incelemiştik. Bu makalemizde nesne tabanlı programlamada kullanılan sınıflar ve sınıfların arasındaki ilişkileri modelleyebileceğimiz diyagramlar olan Class(Sınıf) diyagramlarını inceleyeceğiz.
UML’de sınıflar, nesne tabanlı programlama mantığı ile tasarlanmıştır. Sınıf diyagramının amacı bir model içerisinde sınıfların tasvir edilmesidir. Nesne tabanlı uygulamada, sınıfların kendi özellikleri (üye değişkenler), işlevleri (üye fonksiyonlar) ve diğer sınıflarla ilişkileri bulunmaktadır. UML’de sınıf diyagramlarının genel gösterimi aşağıdaki gibidir.
image
Şekil 1. Class Diyagram
Şekil1’de görüldüğü üzere bir dikdörtgeni 3 parçaya bölüyoruz. En üst bölüm sınıf adını, orta kısım özellik listesini (üye değişkenler) ve en son kısım, işlev listesini (üye fonksiyonlar) göstermektedir. Çoğu diyagramlarda alt iki bölüm çıkarılır. Genelde tüm özellik ve işlevler gösterilmemektedir. Amaç, diyagramın sadece belirli kısımlarının (sınıf özelliklerinin ve işlevlerinin) gösterimini sağlamaktır. Bir sınıf diyagramında kullanılabilecek temel yapılar bunlar olmasına rağmen "constraints" ve "notes" dediğimiz elemanlar da mevcuttur. Notes(Notlar) genellikle işlevlerin ve özelliklerin hakkında bilgi veren opsiyonel kutucuklardır. Constraints (koşullar)'ler ise sınıfa ilişkin birtakım koşulların belirtildiği ve parentez içinde yazılan bilgilerdir.

image
Şekil 2. Örnek daire sınıfı
Şekil2’deki sınıf diyagramını incelerken +, - işaretleri görülmektedir. Sınıf diyagramında yer alan nitelik ve method isimlerinin önünde aşağıda sıralanan bezelemer (adornments) kullanılabilir.
  • Private (-); Nitelik yada metota sınıf dışında erişim engellenmiştir.
  • Protected (#); Nitelik yada metota erişim sınırlandırılmıştır.
  • Public (+); Nitelik yada metot genel kullanıma açıktır.
Sınıf diyagramları kendi başlarına bir şey ifade etmez ancak aralarındaki ilişkilerle birlikte incelendiklerinde anlamlıdır. UML içerisinde sınıflar arasında 4 farklı ilişki tanımlanabilir;
  1. Bağlantı İlişkisi (Association)
  2. Genelleme/Kalıtım İlişkisi (Generalization/Inheritance)
  3. Bağımlılık İlişkisi (Dependency) (Aggregation, Composition)
  4. Gerçekleştirim İlişkisi (Realization)
1. Bağıntı İlişkisi (Association Class)
Bağıntı ilişkisi, sınıf diyagramlarında en çok kullanılan ve en basit ilişki türüdür. Çoğu zaman referans tutma biçimindedir. İki nesne arasında varolan bağıntının çokluları (n:m), ilişki bağıntı sınıfı ile ifade edilebilir. Bağıntı ilişkisi iki nesne arasına çizilen düz çizgi ile belirtilir.  Bağıntı  ilişkileri için tanımlanmış bilgiler aşağıdaki gibidir;
  • Bağıntının Adı
  • Sınıfın bağıntıdaki rolü
  • Bağıntının çokluğu
Bağıntı adı, iki sınıf arasındaki ilişkinin küçük bir açıklamasıdır. Bu açıklama ile birlikte yön bilgisi de belirtilebilir.

image
Şekil 3. Bağıntı ilişkisinde bağıntı adı ve yönü
Sınıf diyagramlarında sınıflar arasında bire n ilişki kurulabilir. Bir sınıf, n tane başka bir sınıf ile ilişkiliyse buna bire-çok (1-n) ilişki denir.
image
Şekil 4. Bağıntı ilişkisinde çokluk gösterimi
Şekil4’de işçi-işveren ilişkisinde bir şirketin en az bir işçisi olduğu (1..*), bir işçinin ise 0 ya da herhangi bir sayıda(*) şirkette işçi olarak çalışmış olabileceği ifade edilmektedir. İki sınıf arasında yanlızca tek bir bağıntı çizilmesi gibi bir kısıt yoktur. En temel bağıntı ilişki tipleri aşağıdaki gibi listelenebilir;
  • Bire-bir
  • Bire-çok
  • Bire-bir veya daha fazla
  • Bire-sıfır veya bir
  • Bire-sınırlı aralık (mesela:bire-[0,20] aralığı)
  • Bire-n (UML de birden çok ifadesini kullanmak için '*' simgesi kullanılır.)
  • Bire-Beş yada Bire-sekiz
Diğer bir ilişki türü ise bir sınıfın kendisiyle kurduğu ilişkidir.Bu tür ilişkiler genellikle bir sınıfın sistemde birden fazla rolü varsa ortaya çıkar.Bu tür ilişkilere "reflexive associations" denir. Bu tür bir ilişki UML ile aşağıdaki gibi gösterilir (Manidar bir örnek:));
image
Şekil 5. Reflexive ilişki örneği
Şekil5’i inceleyecek olursak , patron bir eleman olmasına rağmen kendisi gibi eleman olan birden çok çalışandan sorumludur diyebiliriz.
2. Sınıflar Arasında Türetme (Inheritance) ve Genelleme (Generalization) İlişkisi
Nesne tabanlı programlama tekniğinin en önemli parçası türetme (inheritance) dir. Türetme yoluyla bir sınıf başka bir sınıfın var olan özelliklerini alarak, o sınıf türünden başka bir nesneymiş gibi kullanılabilir. Bir sınıfın işlevleri türetme yoluyla genişletilecekse, türetmenin yapılacağı sınıfa taban sınıf (base class), türetilmiş olan sınıfa da türemiş sınıf (derived class) denir. Şekilsel olarak türemiş sınıftan taban sınıfa bir ok olarak belirtilir.
image
Şekil 6. UML’de türetme örneği
UML 'de türetme Şekil 6’da gösterilmiştir. Türetme ağacında daire ve kare birer şekildir. Sınıflar arasındaki türetme işlemi ucu açık üçgen ve düz bir çizgiyle gösterilir. Bu durumda "Şekil" sınıfı ana sınıf (parent class), daire ve kare ise yavru (sub class) sınıflardır. Türetmeye sınıflar arası ilişki açısından baktığımızda türetmenin "is kind of" (bir çeşit) ilişkisinin olduğu görülür.
Nesneler arasında ortak özellikler varsa bunu her sınıfta belirtmenin yerine ortak özellikleri bir sınıfta toplayıp diğer sınıfları ondan türetip yeni özellikler ekleyerek organizasyonu daha etkin hale getirebiliriz. Tabi istersek ortak özelliklerin toplandığı sınıf ile gerçek nesneler oluşturmayı engelleyebiliriz. Bu tür sınıflara "abstract class" denir. Bir sınıfın "Abstract" olması için Sınıf ismini italik yazmamız gerekmektedir.
3. Bağımlılık İlişkisi (Dependency) (Aggregation, Composition)
3.1. İçerme (Aggregations) Bağıntı İlişkisi
Birden fazla parçadan oluşan sınıflar arasındaki ilişkiye "Aggregation" denir. Aggregation ilişkisini 'bütün parça' yukarıda olacak şekilde ve 'bütün parça'nın ucuna içi boş elmas yerleştirecek şekilde gösteririz. İçi boş elmas ile gösterilen ilişkilerde herbir parça ayrı bir sınıftır ve tek başlarına anlam ifade ederler.
image
Şekil 7. İçerim ilişki örneği
3.2. Oluşum (Composition) Bağıntı İlişkisi
Parça bütün arasında çok güçlü bir ilişki yoktur. Ama bazı durumlarda bütün nesneyi yarattığımızda parçalarının da yaratılmasını isteriz. Bu tür ilişkilerin gösterilmesine ise "COMPOSITE ASSOCATION" denir. Bu ilişki diğerine göre daha güçlüdür. Bu tür ilişkilerde bütün nesne yaratıldığında parçalar da anında yaratılır. Bazı durumlarda, takılacak parçalar duruma göre değişebilir.Bu durumda takılacak parçalar "constraint(koşul)" ile belirtilir.
image
Şekil 8. Oluşum ilişki örneği
Uygulamada oluşum ve içerim bağıntılarının kimi durumlarda birbirine karıştığı görülmektedir. Bunun nedeni, oluşum bağıntısınınaslında içerim nağıntısının daha güçlü bir biçimi olmasıdır. Her oluşum bağıntısı aslında aynı zamanda bir içerim bağıntısıdır. Belirleyici fark ise iki bağıntı türünün nesneleri birbirine bağlama gücü arasındaki farktır. İki bağıntı türü arasındaki farkları inceleyelim;
  • Oluşum bağıntısında her parça aynı anda sadece tek bir bütüne ait olabilir. Bu nedenle oluşum bağıntısında bütün tarafı çokluk değeri daima 1 olmak zorundadır. İçerim bağıntısında ise bir parçanın birden fazla bütün tarafından paylaşımı söz konusu olabilir.
  • Oluşum ilişkisinde parçanın yaşam süresi doğrudan bütünün yaşam süresine bağlıdırç Bütün nesnesi yaratılmadan parça nesnesi yaratılamaz ve bütün tarafındaki nesne silindiğinde parça nesnelerde onunla birlikte silinmelidir.
Aşağıda çeşitli bağıntı türlerinin bir arada kullanıldığı örnek bulunmaktadır.
image
Şekil 9. Genel bağıntı örneği
Yukarıdaki bağıntıda aşağıdaki ilişkiler yer almaktadır;
  • Her okulun sıfır ya da daha fazla öğrencisi yeralmaktadır.
  • Her okulda bir ya da daha fazla bölüm vardır.
  • Her bölüm tek bir okula bağlıdır.
  • Her bölüm bir ya da daha fazla sayıda ders açmaktadır.
  • Her bölüm bir ya da daha fazla öğretim üyesine sahiptir.
  • Her bölümün öğretim üyelerinden seçilmiş bir başkanı vardır.
  • Her öğretim üyesi bir ya da daha fazla bir bölümde görev yapmaktadır.
  • Her öğretim üyesi sıfır ya da daha fazla sayıda ders vermektedir.
  • Her ders bir ya da daha çok bölüm tarafından açılır.
  • Her dersi sıfır ya da daha fazla sayıda öğrenci almaktadır.
  • Her derse en az bir tane öğretim üyesi atanmıştır.
  • Her öğrenci bir ya da daha fazla sayıda okula kayıtlıdır.
  • Her öğrenci sıfır ya da daha fazla sayıda ders alabilir.
  • Her öğretim üyesi ya tekbir bölümün başkanıdır ya da hiçbir bölümün başkanı değildir.
4. Gerçekleştirim (Realization) İlişkisi
Gerçekleştirim lişkisi en çok kullanıcı arayüzlerinin (user interface) modellenmesinde kullanılır. Arayüz yanlızca method adlarını ve bunların parametrelerini içermektedir. Program yazarken, yanlızca arayüzlerin kullanılması ve arayüzü gerçekleştiren sınıfın diğer sınıflardan ayrı tutulması, yazılımın geliştirilmesi ve bakımında önemli kolaylık sağlar. Gerçekleştirim ilişkisi kesikli bir çizginin ucuna yerleştirilen içi boş bir üçgen ile gösterilir.
image
Şekil 10. Gerçekleştirim ilişkisi
Yukarıdaki örneği inceliyecek olursak; IHesapla adı verilen ve diğer sınıfların kullanımına açılmış arayüz sınıfı tanımlanmıştır. Bu sınıfta yer alan metotların gerçekleştirimi ise Hesapla sınıfı tarafından üstlenilmiş durumdadır. İyi yapılan bir tasarımda tüm sınıflar yanlızca arayüzde yer alan metotları kullanmalı, doğrudan Hesapla sınıfının metotları çağırılmamalıdır. Böylece Hesapla sınıfının gerçekleştirimi, uygulamamnın kalanını etkilemeksizin istendiği gibi değişebilir. Arayüzlerin diğer bir yararı arayüzün gerçekleştirimini yapan sınıfın kaynak kodunu, sınıfı kullanan diğer programcılar tarafından erişilmesi gereğini ortadan kaldırmasıdır. Bu nedenle arayüz sınıfları, kod gizliliğini sağlamak isteyen yazılım firmaları tarafından yaygın biçimde kullanılmaktadır.
Sınıf İlişkileri Özet Tablosu
No
İlişki
Örnek Gösterim
Açıklama
1 Bağıntı(Association) image İki sınıfın herhangi bir şekilde birbirleriyle iletişim kurmasıdır. Örneğin : Öğrenci ve Okul arasındaki ilişki
1.a Çokluk (Multiplicity) image İki sınıf arasındaki 1:n ilişkidir. Birden fazla öğrencinin okul ile olan ilişkisi olarak çıklanabilir. Şekildeki * işareti 1:n ilişkiyi göstermektedir.
1.b Yönlü Bağıntı (Directed Association) image Sınıflar arasındaki tek yönlü ilişkiyi gösterir. Ok işareti ile gösterilir.
1.c Dönüşlü Bağıntı(Reflexive Association) Belirgin bir çizimi yoktur. Bir sınıfın kendisiyle kurduğu ilişkidir.Bu tür ilişkiler genellikle bir sınıfın sistemde birden fazla rolü varsa ortaya çıkar
2 Kalıtım/Genelleme(Inheritance/Generalization) image Bu ilişki, bir nesnenin bir diğerinin özel bir türü olduğu gerçeğini modellemek için kullanılır.
3 İçerme(Aggregation) image İki sınıf arasındaki “sahiptir” veya içerir türünden bağıntıları modellemekte kullanılır.Bütün parça içi boş elmas ile gösterilir.
3.a Oluşum(Composition) image İçerme ilişkisinin farklı bir çeşitidir. Tüm bağıntılar içinde en güçlü olanıdır. Parça-bütün ilişkilerini modellemekte kullanılır.
4 Gerçekleştirim(Realization) image Kullanıcı arayüzlerinin modellemesinde kullanılır. Arayüz yanlızca method adlarını ve bunların parametrelerini içermektedir.
Bir sonraki makalemizde UML diyagramlarından State (Durum) diyagramlarını ayrıntılı inceleyeceğiz.
Referanslar
Neslihan ÇALIŞKANEL