12 Mart 2017 Pazar

ER-R ŞEMASI VE ORM

      İlk olarak blog yazıma veritabanı nedir sorusu ile başlamak istiyorum. Veri tabanı ( Database), birbirleriyle ilişkisi olan verilerin tutulduğu, kullanım amacına uygun olarak düzenlenmiş veriler topluluğunun mantıksal ve fiziksel olarak tanımlarının olduğu ve bunların sayısal ortamlarda saklandığı ve gerektiğinde tekrar bir erişime olanak sağlayan, büyük boyutlarda veriler barındıran bilgi depolarıdır. Veri tabanları gerçekte var olan ve birbirleriyle ilişkileri olan nesneleri ve ilişkilerini modeller. Veri tabanı; banka, üniversite, okul, seyahat şirketi, hastane vb kuruluşların çalışıp işleyebilmesi için gereken uygulama programlarının kullandığı operasyonel çok çeşitli verilerin toplamıdır. Ticari bir şirket için müşteri bilgileri, satış bilgileri, ürün bilgileri, ödeme bilgileri, vb., okul için öğrenci bilgileri, açılan dersler, okula kaydedilmiş öğrenciler, öğretmen bilgileri, sınav tarihleri, sınav sonuçları vb., hastane için hasta bilgileri, doktor bilgileri, teşhis-tedavi bilgileri, mali bilgiler vb. kullanılan çok çeşitli operasyonel verilere örnek olarak verilebilir. Belirli bir konu hakkında toplanmış veriler bir veritabanı programı altında toplanırlar. Bu verilerden istenildiğinde; toplanan bilgilerin tümü veya istenilen özelliklere uyanları görüntülenebilir, yazdırılabilir ve hatta bu bilgilerden yeni bilgiler üretilerek bunlar çeşitli amaçla kullanılabilir.
      Biraz daha detaylandıracak olursak;
Veri tabanının tanımlanması: Veri tabanını oluşturan verilerin tip ve uzunluklarının belirlenmesidir.
 Veri tabanının oluşturulması: Veri için yer belirlenmesi ve saklama ortamına verilerin yüklenmesini ifade eder.
 Veri tabanı üzerinde işlem yapmak: Belirli bir veri üzerinde sorgulama yapma, meydana gelen değişiklikleri yansıtmak için veri tabanının güncellenmesi ve rapor üretilmesi gibi işlemleri temsil eder.
 Verinin bakım ve sürekliliği: Veri tabanına yeni kayıt eklemek, eskileri çağırmak ve gerekli düzenleme, düzeltme ve silme işlemlerini yapmak gibi işlemlerin gerçekleştirilmesini ifade eder. Veri tabanı yönetim sistemi aynı zamanda verinin geri çağrılabilmesini de sağlar.
Veri tabanını genişletme: Kayıtlara yeni veri eklemek ve yeni kayıtlar oluşturmak gibi işlemleri ifade eder.

VERİ MODELİ
 Bir veri modeli, verinin hangi kurallara göre yapılandırıldığını belirler.
 Varlık ilişki Veri Modeli(Entity-Relationship model): Vİ ya da ER modeli olarak isimlendirilen bu model 1976 yılında geliştirilmiĢtir. Bugüne kadar varlık-ilişki modeline dayalı bir VTYS geliştirilmemiştir. Buna rağmen burada varlık ilişki modelinin verilmesinin temel sebebi, VTYS‟den bağımsız veri çözümlemesinde ve semantik veri modellemede en çok kullanılan model olmasıdır. Bu model kullanılarak önce;
 - VTYS‟den bağımsız olarak veriler çözümlenir,
- Veri modellemesi yapılır,
 - Veriler ve veriler arasındaki ilişkilerin anlamları ve özellikleri incelenerek E-R çizelgeleri oluşturulur,
- Kullanılacak VTYS belirlenir ve daha sonra E-R çizelgeleri bu sistemin veri modellerine dönüştürülerek veri tabanı şemaları oluşturulur.

Varlık ve Varlık Kümesi Varlık: Var olan ve benzerlerinden ayırt edilebilen her nesneye varlık (entity) adı verilir. Varlık bağımsızdır ve tek başına tanımlanabilir. Bir veri tabanı uygulaması hakkında tanımlayıcı bilgi saklanabilen her şey varlık olarak kabul edilir. Bir varlık, ev, araba gibi bir nesne yada futbol maçı, tatil, satış gibi olaylar vb olabilir.
Örnek: Bir öğrenci, bir kitap, Veri Tabanı Yönetim Sistemleri Dersi, Burak birer varlıktır.

 Varlık Kümesi: Aynı türden benzer varlıkların oluşturduğu kümeye ise varlık kümesi (entity set) adı verilmektedir. Varlık kümeleri iç içe, kesişen yada ayrık kümeler olabilir.
Örnek: Öğrenciler, kız öğrenciler, Bilgisayar Programlama Bölümü Öğrencileri, yurtta kalan öğrenciler, renkler, dersler, yıllar, tarihler, satış miktarlar vb… varlık kümesi örnekleri olarak sayılabilir.


 Nitelik: Bir varlık kümesinde varlıkların özelliklerini göstermek ve varlıkları birbirinden ayırt etmek için nitelikler(attributes) kullanılır. Gerçek dünyada varlıkların çok sayıda özellikleri olabilir. Ancak veri modellemede, bu özelliklerin uygulamalarda gerekli olan küçük bir kısmı alınarak soyut bir modelleme yapılır.(Sicil no, adı, soyadı, adres vb..)

İlişki: Varlıklar arasındaki bağıntıya ilişki (relationship) adı verilir.
 • İkili ilişki: – bir öğrenci ile bir ders (öğrenci dersi alır)
 – bir firma ile bir malzeme (firma malzemeyi üretir)
 • Üçlü ilişki: – Bir işçi, bir ürün ve bir makine (işçi bu ürünü üretirken bu makineyi kullandığı için)


Yapılar: Soyutlama, küme ve ilişki veri yapılarının temel unsurlarıdır. Detayları gizleme ve genel üzerinde yoğunlaşma yeteneği olan soyutlama veriyi yapılandırma ve görüntüleme işlemini yapar ve veri kategorilerini elde etmek için kullanılır. Yapılar düzgün şekilde tanımlanmış veri gruplarıdır. Kendisi de aynı zamanda bir küme olan ilişki, iki nesne arasındaki ilişkiyi gösteren bir tip olarak kümelerin toplanmasını ifade eder. Örneğin, ÖĞRENCİ ve OKUL arasında bir NOT iliŞkisi vardır. Veri yapısı oluşturulurken, verideki nesneler ve onlar arasındaki ilişkiler tablo ile temsil edilir. Veri tabanında uygulanabilecek genel kayıt ilişkilendirme tipleri şu şekilde sıralanabilir:
Bire bir ilişkiler ( One-to-one relationships): Aralarında ilişki olan iki tablo arasında, tablolardan birindeki asıl anahtar alanın kayıt değerinin, diğer tablodaki sadece bir kayıtta karşılığının olması durumunu gösteren ilişki tipidir.



      Örnek: Bir öğrencinin doğum yeri bilgisinin doğum yerleri tablosunda bir şehre karşılık gelmesi gibi.

Tekil çoklu ilişkiler ( One-to-many relationships): Aralarında bir ilişki bulunan iki tablo arasında, anahtar alanının kayıt değerinin, diğer tablodaki birden fazla kayıtta karşılığının olması durumunu gösteren ilişki tipidir.





 Örnek: Bir öğrencinin birden fazla almış olduğu derse ve bu derse ait vize, final ve sınav sonuçları gibi. Bir öğrenciye karşılık birden fazla ders notu. Bir yazar birden çok kitap yazmış olabilir. Ancak her kitap mutlaka bir yazar tarafından yazılmıştır.
Çoğul tekli ilişkiler ( Many-to-one relationships): Aralarında bir ilişki olan iki tablo arasında, tablolardan birindeki bir kaydın değerinin, asıl anahtar alanının olduğu diğer tabloda, birden fazla kayıtta karşılığının bulunması durumunu gösteren ilişki tipidir.


İlişkisel Veri Modelleri: ilişkiler ve onların temsilleri olan tablolardan oluşan ilişkisel veri modeli ilk olarak 1970 yılında Codd tarafından ortaya atılmıştır. İlişkisel veri modellerinde kullanılan tek yapılandırma aracı ilişkidir.
Aşağıdaki örneklerde büyük harflerle yazılan ifadeler ilişki isimlerini, parantez içindeki ifadeler de tanım kümesini göstermektedir.
ÜNIVERSİTE (üniversiteKodu, üniversiteAdi, Adres)
 OGRETIMELEMANI(OgrKodu, OgrAdi, OgrSoyadi, Bolum, Brans) OGRENCI(OgrenciNo,OgrenciAdi, OgrenciSoyadi,Bolum, Adres)
 DERSLER(DersKodu, DersinAdi, Kredisi, Yariyil)
 OGRENCINOTLAR(OgrenciNo, DersKodu,Vize, Final)
Universite
 UniversiteKodu    UniversiteAdi         Adres
      2300                 Fırat Üniversitesi    Elazığ
      0600                ODTU                      Ankara
      3400                Fatih Üniversitesi     istanbul
Kaynak:https://cms.inonu.edu.tr/uploads/contentfile/125/files/vtys.pdf


ORM nedir?

ORM, Object Relational Mapping anlamına gelmektedir.  O/R Mapping olarakta yazılabilir.  ORM nedir diye bir soru soracak olursak şöyle bir cevap verebiliriz: “İlişkisel veritabanı (RDBMS) ile nesneye yönelik programlanın (OO) arasında bir tür köprü özelliği gören ve ilişkisel veritabanındaki bilgilerimizi yönetmek için, nesne modellerimizi kullandığımız bir tekniktir/metodtur”. Basite indirgemek istersek: “Nesnelerimizi ilişkisel veritabanındaki tablomuza bağlayan ve veri alış-verişini bizim için yapan bir tekniktir/metodtur”. ORM tekniği belli bir programlama diline bağlı değildir ve her OO dilinde yazılabilir/kullanılabilir.
Günümüzde kullanılan popüler programlama dillerinde yazılmış bir çok ORM kütüphaneleri vardır. Bunlara çoğu zaman ORM araçları (ORM Tools) deniyor. Yazımın ilerleyen bölümlerinde Java dünyasında kullanılan popüler ORM araçlarına bir göz atacağız.

ORM kullanmanın (dez)avantajları nelerdir

ORM kullanmanın bir çok avantajı olduğu gibi bazı dezavantajları da var. Bunları altta kısaca sıralamaya çalıştım. Bu noktaların detaylarını ve karşılaştırmalarını yazımın ilerleyen bölümlerinde okuyabilirsiniz.
Avantajları:
  • Nesneye yönelik bir programlama metodu sunuyor
  • Yazılan kodun veritabanı çeşidiyle bağımlılığı yok (Oracle, SQL Server, MySQL vs)
  • SQL/JDBC bilmenize/yazmanıza gerek kalmadan çok kısa bir zamanda ve de çok daha az kod ile veritabanına bağlı bir uygulama yapabilirsiniz
  • ORM araçlarının çoğu Open Source (Açık kaynak kodlu – yani bedava)
  • ORM araçları, programcılara bir çok kolaylık sağlıyor ve içinde barındırdığı ek desteklerle bir çok sık görülen sorunlara çözüm sunuyor. (polymorphism, caching, transaksiyon, vs)
  • Sektör içinde kullanılan Java ürünlerinin çoğunda popüler ORM araçları için ekler mevcuttur (Spring, Eclipse, vs)
  • Otomatik kod üretmek ve ya SQL üretmek için bir çok ürün mevcuttur
  • Çok daha iyi test edilebilir kod yazmamızı sağlar

Dezavantajları:
  • Performans sorunları
  • Bilgi alış-verişi sırasında kontrolün yüzde yüz sizin elinizde olmaması (Üretilen SQL bazen çok farklı olabilir)
  • Kullanılan ORM aracını öğrenmek için harcanan zaman

Popüler ORM aracları hangileridir?

Sektörde kullanılan en popüler Java ORM araçlarından bazılarını şöyle sıralayabiliriz:
  1. Hibernate
2001 yılında Gavin King tarafından yazıldı ve şu an yazılım yönetimi JBoss şirketi tarafından yapılmaktadır. [2] Tamamen açık kaynak kodludur ve Java sektöründe en çok kullanılan ORM aracıdır. LPGL v2.1 lisansını kullanmaktadır. HQL adında (Hibernate Query Language) kendine has bir nesnesel veri çekme diline sahiptir. Criteria API içerisindeki sınıfları sayesinde bir çok işlemi SQL yazmadan yapmamıza olanak sağlamaktadır. Sınıfları, ilişkisel veritabanındaki tablolara bağlamak için hem XML hem de Anotasyon kullanır. Tüm veritabanları ile sorunsuz çalışmaktadır. JSR 220 (Enterprise Java Beans 3.0) [3] ve JSR 317 (Java Persistence 2.0)  [4] spesifikasyonlarıyla tam uyumludur. Bunların yanında polymorphism, caching, otomatik transaksiyon yönetimi, lazy load etme gibi önemli özellikleri vardır.
  1. Apache OpenJPA
JSR 220 (Enterprise Java Beans 3.0) spesifikasyonunun bir implementasyonlarından biridir. [1] Yazılımı Apache Software Foundation şirketi tarafından devam ettirilmektedir ve Apache 2.0 lisansıyla birlikte açık kaynak kodludur. JSR 220 spesifikasyonun sunduğu tüm özelliklere sahiptir. Tüm Apache serverleri ile tam uyum göstermektedir. Hibernate kadar popüler olmasada bir çok kesim tarafından kullanılmaktadır. Websphere şirketinin tercih ettiği ve kullandığı bir yazılımdır.
  1. Toplink
Oracle şirketinin liderliğinde devam eden bir ORM aracıdır. [5] Sektörün en ileri derecede olan ORM araçlarının başında gelmektedir. Ne yazıkki açık kaynak kodlu değildir. Deneme amaçlı download edilebilir. Bu ORM aracının en dikkat çeken özelliklerinden biri hem veritabanıyla hem de XML kaynaklarıyla çalışabilmesidir. Bunun yanında tüm veritabanları ve application serverlerle uyumlu çalışabilmektedir.
Toplink ürünü altında Toplink Essentials adında bir ORM aracı vardır ve JSR 220 (Enterprise Java Beans 3.0) spesifikasyonu ile tam uyumludur. Bu araç tamamen açık kaynak kodludur. Fakat Toplink Essentials, Toplink içerisindeki tüm özelliklere sahip değildir.
  1. EclipseLink
Eclipse Foundation şirketine bağlı olan bir ORM aracıdır ve açık kaynak kodludur. [7] Eclipse Public License ve Eclipse Distribution License lisanslarını kullanmaktadır. Oracle Toplink ürününün ortaya çıkması Oracle şirketinin Toplink ürününün 11g versiyonunu bu projeye bağışlamasıyla başlamıştır. Aslında EclipseLink bir ORM aracından çok daha geniştir. JPA, JAXB, JCA, SDO ve OSGI  standartlarını desteklemektedir. EclipseLink kullanarak veritabanlarınının yanında web servisleri, object XML baglantıları ve kurumsal bilgi servisleriyle (EIS) bilgi alışverişi yapılabilir.
  1. Apache Cayenne
Apache Software Foundation şirketinin çıkardığı bir ORM aracıdır. [8] Apache License 2.0 lisansını kullanmaktadır.  ORM aracından beklenen tüm özelliklere sahiptir ve  sektörde iyi bir yere gelmek için emin adımlarla devam etmektedir.
  1. IBatis
Açık kaynak kodludur ve Apache License 2.0 lisansına sahiptir. [6] (IBatis tam olarak bir ORM aracı sayılmasa da belirtmek istedim.) IBatis bir nesne-veri aktarma aracıdır. Kullanımı çok basittir. Genellikle hazır olan bir veritabanından birebir bilgi çekmek ve bu bilgileri otomatik olarak nesnelere yazdırmak için kullanılır. Veritabanındaki tablolara bağlantı için yazılan SQL leri XML dosyaları içinde barındırıyor.
  1. Spring Jdbc Template
Spring kütüphanesinin bir parçası olmakla beraber aynen IBatis gibi ORM aracı olmayıp veri alış-verişinde çok büyük kolaylıklar sağlamaktadır. Tamamen açık kaynak kodludur. [9]

ORM aracı seçiminde dikkat edilmesi gerekenler nelerdir?

Öncelikle şunu belirtmek gerekir ki, ORM aracı kullanmak kesinlikle mecburi bir şey değildir. Uygulamanızı JDBC ve SQL ile de yazmayı seçebilirsiniz. Fakat ORM aracı kullanmazsanız yukarıda belirtilen avantajlardan yararlanamayacaksınız ve JDBC ile programlamanın getirdiği zorlukları, kendiniz çözmek zorunda kalacaksınız. Ama yine de, ORM aracı kullanmamak ta avantajlı olabilir. Peki ne zaman kullanıp kullanmayacağımızı nasil bilebileceğiz. Altta, değişik bakış açıları ile bu soruya cevap vermeye çalıştım.
  • Uygulamanızın büyüklüğü
    • Küçük uygulamalar: Şayet yazdığınız uygulama içerisinde veritabanı ile çalışacak bölüm çok basit ise, ORM aracı kullanmamayı tercih edebilirsiniz. Ya da çok basit bir ORM aracı seçebilirsiniz IBatis veya Spring JDBC template gibi. Tabiki bunu ORM araçları hakkında tecrübeniz olmadığını düşünerek yazıyorum.
    • Büyük uygulamalar: Eğer uygulamanız küçük değilse, kesinlikle bir ORM aracı kullanmanızı tavsiye ediyorum. ORM araçlarının sunduğu tüm olanaklara emin olun ihtiyacınız olacaktır. Sadece, hangi ORM aracını seçmeniz gerektiğini düşünmeniz gerekecek. Bunu da, uygulamanızın gereksinimlerine ve ORM araçlarının sunduğu özelliklere bakarak yapmanız çok doğru olacaktır. Mesela uygulamanız distributed bir ortamda çalışacaksa caching/clustering desteği sağlayan bir ORM aracı seçmeniz uygun olacaktır.
  • Uygulamanızın performansı
    • ORM araçlarının kullanımında, duyduğumuz en büyük sorunların başında performans sorunları yer alıyor. Tabiki bunun değişik nedenleri olabilir. En sık rastlanan nedenlerinden biri, kontrolün yüzde yüz bizim elimizde olmamasıdır ve bu nedenle de bazı durumlarda istemediğimiz ve performanslı olmayan SQL üretilmesidir. Karmaşık nesne modelleriyle çalışırken, veri saklama/silme ya da alma işlemi sırasında ORM aracı tarafından üretilen SQL ler her zaman performanslı değildir. Bunları çok iyi analiz edip, gereken değişiklikleri yapmamız gerekebilir.
    • Bir başka neden ise ORM aracının yanlış kullanılmasıdır. Bunun en büyük örneklerinden biri, Lazy loading özelliğinin doğru kullanılmamasıdır. Lazy loading, bazı bilgilerin veri çekme sırasında değilde, gerektiği zaman alınmasını belirten bir seçenektir. Eğer lazy loading seçeneğini doğru kullanmazsanız, her seferinde istemediğiniz bir çok bilgiyi veritabanından çekmiş olacaksınız. Tabiki bu da performansın düşmesine sebep olacaktır.
    • Tabiki bazen de ORM aracı içerisinde çözülemeyen performans sorununu, JDBC kullanıp çözmekten başka seçenek kalmayabilir. Böylelikle tam istediğiniz gibi bir SQL yazabilirsiniz. Fakat ORM aracı ile JDBC aynı anda kullanıyorsanız, caching ve nesne durumlarında sorun olup olmamasına dikkat edin. Mesela ORM aracı içinde bulunan bir nesne, sizin tarafınızdan JDBC ile değiştirilmiş olabilir.
    • Uygulamamızın dışında, veritabanınızın doğru tasarlanmış olup olmaması da performans için çok büyük bir önem taşıyor. Örneğin, indexlerin nerelerde kullanıp kullanılmadığına bir göz atın. Veya veritabanı makineninizin özellikleride önemli olabilir. Bağlantı havuzunuzdaki özelliklere de bakabilirsiniz.
  • Projenin bitmesi gereken zaman birimi
Bazen de ORM aracı seçimi, teknik olmayan nedenlerden dolayı etkilenebilir. Uygulamayı geliştirecek yazılım takımında, herhangi bir ORM aracı hakkında belli bir tecrübe yoksa, bu projeniz için büyük bir risk taşıyabilir. Yukarıda da yazdığım gibi yanlış kullanılan ORM araçları, yarardan fazla zarar getirebilir. Bu yuzden de seçilecek ORM aracına tam hakim olunmasında fayda var. ORM aracı kullanımı, başta basit işlemler için çok basit görünebilir. Fakat ilk karmaşık veri sorgusu işleminde çok zorluk çekebilir hatta bir select işlemi için günlerce uğraşabilirsiniz. Karmaşık nesne modellerinde veri sorgusu yazmak kolay bir şey değildir. Örnek vermek gerekirse, bir çok child ve sub-child barındıran bir nesne modeline, kriterli sayfalama (pagination) veri sorgusu yazma çok karmaşık işlemdir. Kısaca şunu söylemek isterimki, yeterli zamanınız veya tecrübeniz yoksa, maceraya atılmanızı ve yeni bir ORM aracı öğrenmenizi bizzat tecrübe etmiş biri olarak tavsiye etmem.

ORM araci kullaniminda onemli tavsiyeler

  • Lazy loading özelliğini iyi bir şekilde kullanın. Örnek olarak, her zaman çekilmesi gerekmeyen verileri lazy olarak çekin.
  • Caching mekanızmasını iyi anlayın ve gereksinimlere gore değiştirin.
  • Çok karmaşık ORM sınıf modelleri yapmaktan kaçının.
  • Şunu kabul etmek gerekir ki, ORM araçları her soruna çözüm sağlamıyor. Bu nedenle bazen normal SQL kullanmak ta olağan birşeydir.
  • Veritabanınızdaki tablo şemanızı en iyi şekilde tasarlayın ki, nesne modeliniz ona göre uygun ve performanslı çalışsın. Kötü tasarlanmış bir veritabanı şeması, hangi ORM aracı seçilirse seçilsin efektif şekilde çalışmaz. Tavsiyem veritabanınızı iyi bir DBA (DataBase Administrator) tarafından kontrol ettirmeniz.
  • Verileri çekerken mümkün olduğu sürece pagination (sayfalandırma) kullanmaya çalışın. Böylelikle tüm bilgileri bir anda almanıza gerek kalmamış olacak.
  • Transaksiyon, concurrency batch processing ve locking mekanızmalarını, yazılımınıza en uygun şekilde configure edin.
  • ORM aracı kullanırken iki tür yöntemle başlıyabilirsiniz. İlki önce veritabanı hazırlanıp ardından java sınıfları hazırlanır/üretirilir. İkincisi de önce java sınıfları hazırlanıp, ardından veritabanı tasarlanır/üretilir. Ben şahsen önce veritabanı hazırlayıp, sonra java kodlarını yazıyorum/üretiyorum. Veritabanı çok önemli olduğu için, kontrolün bende olmasını istiyorum. Java sınıflarını yazarken de, bazen otomatik kod üreten program kullanıyorum, bazen de tüm sınıfları kendim yazıyorum. Tavsiyem, polymorphism veya karmaşık modeller kullanmak istiyorsanız sınıfları kendiniz hazırlanamanızdır.

Sonuc

ORM araçları, proje geliştirmede çok büyük bir destek sağlamaktadır. Veritabanı işlemlerinin karmaşıklığını bizim için gizler ve veritabanindan bağımsız olarak nesne modelimize karşı çalışmamızı sağlar. Fakat yanlış kullanıldığında ise kabusumuz olabilir ve değişik sorunlarla karşılaşabiliriz. O yüzden de kullandığınız ORM aracının tüm inceliklerini ve püf noktalarını öğrenmek için gayret etmenizi tavsiye ederim. İnternette tüm popüler ORM araçları hakkında tonlarca dokümantasyon var ve bunun yanında da bir çok yazılımcı kendi tecrübelerini paylaşmaktadır. Bunları takip etmenizi şiddetle öneriyorum.

Kaynakça:http://www.barisdere.com/2010/12/orm-nedir-ve-ne-zaman-kullanmamaliyiz-2/

Hiç yorum yok:

Yorum Gönder