ORM Consept Cover
Ana Sayfa Slider Eğitim Genel Son Dakika

Object-Relational Mapping Nedir?

Object-Relational Mapping Nedir?

Bu yazımda siz değerli teknoloji severlere aslında birçoğumuzun bir şekilde hayatına giren ilişkisel veri tabanları ve nesne yönelik programlama dilleri arasında köprü görevi gören bir kavramdan bahsedeceğim. Tarihte kısa bir yolculuğa çıkacağımız bu yazımızda kahveniz de hazırsa kahramanımız “ORM Kavramı” ile ilgili derlediğim bilgileri sizlere sunacağım.

İlişkisel veri tabanı sistemleri birçoğumuzun hayatında fark etmesek dahi çok önemli bir yer kaplamakta. Nitekim eğitim gördüğümüz okulun öğrencilerini kaydeden; alışveriş yaptığımız sitenin müşterilerini, ürünlerini ve daha nicelerini kaydeden devasa veri tabanı sistemleriyle örülü bir dünyada yaşıyoruz. Yıllar ilerledikçe, kullanılan veriler daha büyük ve çok daha karmaşık hal almaya başlayınca temel SQL komutları ile işin üstesinden gelmek epey zorlaştı. Bu noktada gözünüzde bir model oluşması açısından MySQL’in Reverse Engineer özelliğini kullanarak aldığım “küçük” bir ilişkisel veri tabanı modelini aşağıya ekliyorum. Bu basit yapıdaki veri tabanına bir veri eklemek için yazacağınız SQL kodlarını lütfen bir düşünün. Hangi verinin, hangi veri ile nasıl eşleştiğini belirtmeniz; bu etkileşimin yönünü seçmeniz ve daha onlarca işlem için yazacağınız belki de yüzlerce satır SQL kodu ve muhtemelen arada yapılacak küçük bir hatayı hayal edin!

Complex Database

Oracle isimli şirket, ilişkisel veri tabanlarındaki bu karmaşayı fark etmiş ve yıllar 1994’ü gösterdiğinde ilk nesne yönelik programlama dili olan Smalltalk için TopLink isimli ilk ORM sağlayıcıyı piyasaya sürmüştü. Tabi ki ilklerin buluşması tesadüf değildi ve burada çok önemli bir bağ vardı!

Yazıya devam etmeden önce “Tamam iyi, güzel de ORM nedir?” dediğinizi duyar gibiyim. Bu noktada merakınızı gideriyor ve kahramanımızı sahneye davet ediyorum. ORM, Object-Relational Mapping anlamına gelen kelimelerin kısaltmasıdır. Nesne yönelik programlama dilleri (Object Oriented Programming Languages) ile ilişkisel veri tabanı sistemlerini (Relational Database Systems) birbirine bağlayan, eşleyen (Mapping) kavramın adıdır (Object-Relational Mapping). Nesne yönelik programlama dillerinin yükselişte olduğu bu dönemde Oracle mantıklı bir hareket ile “neden ilişkisel veriler ile nesneleri birbirine bağlamıyoruz ki?” diye sormuş ve bunun sonucunda bizlere ORM kavramını kazandırmıştır.

ORM kavramı en temelde ilişkisel verilerin aynı zamanda bir “nesne” olarak kullanılmasıyla elde edilmiştir. Günümüzde veri tabanı tablolarının, nesne yönelik dillerde birer sınıf olarak kullanılması fikri birçok kolaylığı bize kazandırmıştır.
Bu kolaylıklardan bazıları ise;

  • Veri tablolarımıza kolay erişim, veriler arasındaki ilişkilerin ve yönünün OOP dil üzerinden tek satırda belirlenmesi.
  • Çoklu işlem diye adlandırabileceğimiz “Cascading” operasyonlarına kolay şekilde erişimi imkânı sunması. Böylelikle birbiri ile ilişkili veriler arasında tek komut ile zincirleme işlem yapılması.
  • En önemli artısı ise ORM ile birlikte SQL komutlarına olan ihtiyacımızın neredeyse tamamen ortadan kalkmasıdır!

ORM sağlayıcımız arka planda belirli standartlara uyarak yazılan satırları SQL diline otomatik olarak çeviriyor ve bunu için gerekli olan execution işlemlerini veri tabanında gerçekleştiriyor. Çoğu zaman bize sadece tek bir satır kod yazmak düşüyor! Harika öyle değil mi? Tekrar gözünüzde canlanması için aşağıya Java’da bulunan Hibernate Framework’ten bir örnek eklemek istiyorum.

İlk olarak ilişkisel veri tabanındaki tabloları, kullandığımız nesne yönelik programlama dilinde sınıflara dönüştürüyoruz ve bunları veri tabanındaki tablo/sütunlar ile eşliyoruz.

O-R Mapping Logic

Diğer tabloları da nesne yönelik dilimize eşlediğimizde artık işlemleri yapmaya başlayabiliriz. Bu noktadan itibaren tamamen OOP dilimizi kullanıyoruz ve SQL komutlarına neredeyse hiç ihtiyacımız kalmıyor.
Artık tablolar ile sınıflar eşlendiğine göre sınıflar ve nesneler üzerinden kodlamaya başlıyoruz.

OOP Logic

Burada tümüyle OOP dilini kullanarak, veri tabanı ile eşlenmiş nesneler oluşturuyoruz. Çeşitli dependency (bağımlılıkları) tanımlıyoruz ki böylece verilerimiz birbirleri ile “ilişkisel” hale gelebilsin.
Sıra sihirli dokunuşta! İşte tüm bu nesneleri veri tabanına aktarmak için gerekli olan Hibernate kodu!
orm magic
Evet, sadece tek bir satır kod ile yukarıda bulunan tam 4 adet nesneyi veri tabanına aktardık! Tahmin ediyorum bu kodları ORM kullanmadan yapmış olsaydık SQL ile yaklaşık 40, 50 belki daha fazla satır oldukça karmaşık kodlar yazmamız gerekecekti. Bu kodların içerisinde verilerin etkileşim türleri tanımlamak, CRUD operasyonlarını tekrar tekrar uygulamak ve daha birçok operasyon gerekecekti… Aşağıda Hibernate’in bizler için yapmış olduğu işleri özetleyen bir konsol çıktısı mevcut.

hibernate backstage

Bunun sonucunda oluşan veri tabanımızı aşağıya ekliyorum.database tables

Son olarak temel CRUD operasyonlarının Hibernate kodlarını ekliyorum ki ORM sağlayıcıların önemi bir kez daha ortaya çıksın.

basic CRUD operations of hibernate

Örnek ORM sağlayıcılar;

  • Java’da, Hibernate, TopLink for Java, Ebean, EclipseLink…
  • .NET için, Entity Framework, NHibernate…
  • Python’da, Django bu ORM sağlayıcılara en çok bilinen ve kullanılan örneklerdir.

Bu noktada JPA’den bahsetmeden yazıyı bitirmek istemiyorum. Nitekim onlarca hatta yüzlerce satır SQL kodunu tek bir komuta sığdıran kahraman ORM sağlayıcılarımızın işi hiç de kolay değil! ORM sağlayıcılar oldukça yüksek seviye bir dil ile kodlandığı ve oldukça kompleks soyutlamalar barındırdığı için yazılımcıların işini kolaylaştırmak adına bazı standartlar belirlenmiştir. 2006 yılında hayatımıza giren JPA yani Jakarta Persistence API (2019 yılında Java yerine Jakarta ismi kullanılmaya başlandı) bu standartlardan birisidir, diğer birçok dilde kullanılan ORM standardı JPA’den türetilerek oluşturulmuştur. Bu standart, kullandığımız ORM sağlayıcısına görevini nasıl yapması gerektiğini adım adım izah eder bu sayede ORM sağlayıcılar arasında bir değişiklik dahi yapsak aynı standart prosedürler uygulanacağı için program çalışmaya devam eder. Böylece SOLID prensiplerinden Open-Closed Principle sağlanmış olur.

Bugün back-end programlama için oldukça önemli olduğunu düşündüğüm bir kavramı sizlere paylaştım. Ne yazık ki yazımı bitirirken içimde bir burukluk ile buradan ayrılmaktayım. Böylesine güzel kurgulanmış ve içinde değil okyanuslar, gezegenler barındıran bu uçsuz bucaksız kavramın her detayını sizlerle paylaşmak isterdim. Kim bilir belki başka bir yazıda tekrar görüşürüz? Belki kaldığımız yerden devam eder ve teknolojinin sonsuzluğunda kayboluruz? O gün gelene dek araştırmaya, öğrenmeye, gelişmeye ve geliştirmeye devam!

Yazar, Deniz DEMİRKAN


Kaynakça

https://docs.jboss.org/hibernate/orm/5.6/quickstart/html_single/#preface

https://antoniogoncalves.org/2008/09/27/a-brief-history-of-object-relational-mapping/

https://maetl.net/talks/rise-and-fall-of-orm

https://www.udemy.com/course/spring-hibernate-tutorial/

https://en.wikipedia.org/wiki/List_of_object%E2%80%93relational_mapping_software

https://caylakyazilimci.com/post/object-relational-mapping-orm-nedir

https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping

https://coderanch.com/t/215015/databases/Difference-TopLink-Hibernate

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.