Welcome to My Blog 👋

Java, Spring Framework, Microservices, Docker, Kubernetes, AWS and Others 🚀
Follow Me
Showing posts with label ilişkisel veritabanı. Show all posts
Showing posts with label ilişkisel veritabanı. Show all posts

İlişkisel veritabanının temelini tablolar ve bu tablolar arasındaki ilişkiler oluşturur. Bu yüzden ilişkisel veritabanında ilişkileri anlamak çok önemlidir. Bu yazımızda ilişkisel veritabanında kullanılan ilişki türlerinden bahsedeceğiz. İlişkisel veritabanında üç tip ilişki türü vardır.
  • Bire bir
  • Bire çok
  • Çoka çok
İlişkisel veritabanındaki ilişkilere geçmeden önce bilinmesi gereken çok önemli iki kavram vardır.
  • Birincil Anahtar (Primary Key): Tablolarda benzersiz kayıtlar elde etmemizi sağlayan sütuna verilen addır.
  • İkincil Anahtar (Foreign Key): Bir tabloda benzersiz kayıt oluşturmayı sağlayan sütunun diğer tabloda bir sütun olarak bulunmasına denir.


Bire Bir İlişki Türü

Eğer bir tablodaki verinin diğer tabloda ilişkili olduğu veri bir tane ise bu iki tabloda bire bir ilişki var demektir. Örnek verecek olursak kişiler tablosunun ilişkili olduğu kimlik bilgileri tablosu arasında bire bir ilişki vardır. Burada dikkat edilmesi gereken her kimlik bilgisi için de bir kişinin olması gerektiğidir. Yani bir kişinin kimlik bilgileri bir tane olmalı ve her kimlik bilgisi için bir kişi olmalıdır. Bu durumda iki tablo arasında bire bir ilişki kurulur. 
SQL'de ise bu ilişkiler iki tablonun primary key bilgileri karşılaştırılarak kurulur. Yani örnek verecek olursak kişiler tablosundaki kisi_id ile kimlik bilgileri tablosundaki kisi_id bilgileri aynı olan kayıtlar ilişkilidir denilebilir.

Bire Çok İlişki Türü

Eğer bir tablodaki verinin diğer tabloda ilişkili olduğu veri birden çok ise bire çok ilişki var demektir. Örnek verecek olursak kişiler tablosunun ilişkili olduğu araç bilgileri tablosu arasında bire çok ilişki vardır. Yani bir kişinin araç bilgileri birden çok olabilir, kişinin birden çok aracı bulunabilir. Burada dikkat etmemiz gereken ikinci konu ise araç tablosunun kişi tablosu ile ilişkisidir. Yani her aracında bir sahibinin olması gerektiğidir. Eğer bir aracın birden çok sahibi olsaydı burada bire çok ilişki olacaktı. Çünkü hem bir kişinin birden çok arabası olabiliyor olacaktı hem de her arabanın birden çok sahibi olacaktı. Ancak bir arabanın bir sahibinin olacağını düşündüğümüz için burada bire çok ilişki vardır. Bu yüzden bu iki tablo arasında bire çok ilişki kurmamız gerekir.
SQL'de ise bu ilişkiler birinci tablonun primary key bilgisi ile ikinci tablonun foreing key bilgisi arasında karşılaştırma yapılarak kurulur. Yani örnek verecek olursak kişiler tablosundaki kisi_id bilgisi ile araçlar tablosuna ekleyeceğimiz kisi_id adlı foreing key bilgisi karşılaştırılarak ilişkili kayıtlar bulunur.

Çoka Çok İlişki

İlişkisel veritabanında olmasını istemediğimiz ilişki türüdür. Bu ilişki türü normalizasyon ile bire çok ilişkilere dönüştürülür. Bu ilişki türü eğer birinci tablodaki bir verinin ikinci tabloda ilişkili olduğu birden çok veri varsa ve aynı şekilde ikinci tablodaki bir verinin de birinci tabloda ilişkili olduğu birden çok veri varsa ortaya çıkar. Örnek verecek olursak kişi tablosu ile adres tablosudur. Bir kişinin birden çok adresi olabileceği gibi bir adreste de birden çok kişi yaşayabilir.
SQL'de bu ilişki iki tablo arasına bir tablo ekleyerek gerçekleştirilir. Bu şekilde çoka çok ilişki iki adet bire çok ilişkiye dönüştürülür. Örnek verecek olursak kişiler tablosundaki kişi_id bilgisi ile adres tablosundaki adres_id bilgileri ayrı bir tabloda da tutulur. Bu şekilde kişiler ve adres tabloları arasında doğrudan bir ilişki olmaz bu iki tabloda araya eklediğimiz tablo ile ilişkili olur. Araya eklediğimiz tabloya adres kaydı dersek kişiler tablosundaki bir kişinin birden çok adres kaydı olacaktır ancak her adres kaydı sadece bir kişi ile ilişkili olacaktır. Aynı şekilde adres tablosu ile adres kaydı tablosu arasında da bire çok ilişki olur. Adres tablosundaki her adresin birden çok adres kaydı olabileceği gibi adres kaydı tablosundaki her adres kaydı bilgisinin bir adresi olacaktır. Bu örnekte bir kişinin adres bilgisine erişmek istediğimizde önce o kişinin adres kaydı bilgilerini bulmamız gerekir. Daha sonra her adres kaydı bilgisi için adres bilgisini bulabiliriz. Bu şekilde bir kişinin adres bilgilerini getirebiliriz. Aynı şekilde her adres için o adresin adres kayıt bilgilerini getirebiliriz. Daha sonra her adres kaydı bilgisinin ilişkili olduğu kişi bilgilerini getirerek o adreste yaşayan kişileri bulabiliriz.


Java ORM Framework'leri

  • Hibernate
  • JPA
  • OpenJPA
  • Toplink
  • EclipseLink
  • Apache Cayenne
  • MyBattis

.Net ORM Framework'leri

  • Entity Framework
  • Nhibernate
  • .Net Persistence
  • BBADataObjects-
  • DataObjects.NET
  • DotNorm
  • FastObjects.NET
  • Norm
  • OJB.NET

PHP ORM Framework'leri

  • Propel
  • Doctrine
  • PHP-Activerecord
  • PdoMap
  • RedBean


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

ORM Kullanmanın 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

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’de Mapping Nedir?

Mapping, ORM’de veritabanı ile nesnelerimiz arasındaki bağı kuran yapımızdır. Hangi nesnenin (sınıfın) hangi tabloyla bağlanacağını, bağlanan tablolarda hangi property’nin (özelliğin ya da değişkenin) tablonun hangi alanıyla bağlanacağını, tablonun özelliklerini (ID’sinin ne olduğu, ID’sinin autoincrement olup olmadığı vb.) bilgilerin tanımlandığı yapımızdır. Kimi ORM frameworkleri bu işlemi yazılımcının yapmasını istese de (Hibernate, Nhibernate) kimi frameworkler bu işlemleri kendisi gerçekleştirmekte, istediği taktirde yazılımcının mapping’de düzenleme yapmasına izin vermektedir (Entity Framework).
Aşağıdaki şekilde, Orm’nin yapısı daha net anlaşılmaktadır.

ORM Aracı Kullanımında Önemli 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.

Sonuç

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 : http://www.barisdere.com/

Veritabanı Nedir?
Birbiriyle ilişkili verilerin tutulduğu, kullanım amacına uygun olarak düzenlenmiş veriler topluluğunun, mantıksal ve fiziksel olarak tanımların bulunduğu bilgi depolarıdır.

Veritabanı Yönetim Sistemi Nedir?
  • Yeni bir veritabanı oluşturmak
  • Veritabanını düzenlemek
  • Veritabanını kullanmak
  • Veritabanını geliştirmek
  • Veritabanının bakımını yapmak
için çeşitli karmaşık işlemlerin gerçekleştirildiği bir yazılım sistemidir.

Veritabanı Yönetim Sistemleri Veri Modeline Göre Dörde Ayrılır
  • Hiyerarşik
  • Ağ
  • İlişkisel
  • Nesneye Yönelik

Veritabanı Modellemeleri
  • E-R Modeli
        Gerçek kayıttaki nesneler ve aralarındaki ilişkiyi gösteren modelleme tekniğidir.

  • R Modeli
        Kayıtlar tablolar halinde gösterilir.

Veritabanında İlişki Türleri 

  • (1:1) İlişki
         İki tablo arasında bir özelliğe karşılık gelen tek bir özelliğin olduğu ilişkidir.

  • (1:N) İlişki
         İki tablo arasında 1 özelliğin N özelliği olurken N özelliğin 1 özelliği olan ilişkidir.

  • (M:N) İlişki
         İki tablo arasında M özellik için 1 özellik ve 1 özellik için N özellik olan ilişkidir.

ORM Yapısı
ORM, veritabanında oluşturulan her bir nesneye (tabloya) karşılık uygulama tarafında bir nesne oluşturma işidir. Bu işlem bazı Frameworklerde ara yazılımlar sayesinde (ORM Tools), bazı frameworklerde ise elle gerçekleştirilmektedir.