İlişkisel Veritabanları, ORM ve Doctrine

Preview:

DESCRIPTION

PHPKonf. 22 Şubat 2014 - Bahçeşehir Üniversitesi

Citation preview

İlişkisel Veritabanları, ORMve Doctrine

İlişkisel Veritabanı Nedir?

Verilerin satır ve sütunlardan oluşan tablolarda standart bir yapıda saklandığı, yüksek veri tutarlılığına sahip veritabanlarıdır. !İlişkisel veritabanı, veritabanlarının ilişkisi değil veritabanı içerisindeki nesnelerin ilişkili olmasıdır.

ID ad soyad eklenme_tarihi1 Muhittin Özer 2014-02-22 09:30:002 Ali Emre Çakmakoğlu 2014-02-22 09:35:403 Alpcan Aydın 2014-02-22 12:15:234 Aybars Cengaver 2014-02-22 13:55:095 Rasim Canser Yanbakan 2014-02-22 16:10:00

İlişkisel Veritabanı Örnekleri

Diğer Veritabanı Yapıları

• Hiyerarşik Veritabanları: Ağaç-Dal mimarisinde geliştirilmiş veritabanlarıdır.

• Çok Boyutlu Veritabanları: Verileri kategorize eden boyutları ve ölçümleri taşıyan veritabanlarıdır.

• Yapılanmış Bellek (Anahtar Değer Depoları): Sabit bir veri düzeni olmayan, anahtar ve değer taşıyan veritabanlarıdır.

İlişkisel Veritabanı Kavramları

• Nesne (Entity): Veritabanında tutulan her bir veri modelidir.

• Özellik (Attribute): Veritabanı nesnelerine ait verilerdir.

• Anahtar (Key): Veritabanı nesnelerinin ayırıcı özellikleridir.

• Birincil Anahtar (Primary Key): Her bir nesne için benzersiz olan tanımlayıcı anahtardır.

İlişkisel Veritabanı Kavramları

• İlişki (Relation): Veritabanı nesnelerinin birbirleri ile olan ilişkilerinin tanımlanmasıdır.

• Yabancı Anahtar (Foreign Key): Veritabanı nesnelerinin birbirleri ile olan ilişkilerinde bu ilişkinin kurulmasını sağlayan ve ilişkili olunan nesnede ilişki kurulan nesnenin birincil anahtarının değerini taşıyan özelliktir.

İlişki Türleri

One-to-One İlişki

• Her iki tabloda da bir nesneye karşılık yalnızca bir nesne ile ilişki kurulabilir.

• En güzel örnek: Evlilik :)

Not: Bu örnekte Medeni Kanun baz alınmıştır :)

One-to-Many İlişki

• Bu ilişki türünde ise elimizdeki nesne ile ilişkili olan nesneden birden fazla olabilmektedir.

• Örnek: Üye-Sipariş

Many-to-One İlişki

• Bu ilişki türü ise One-to-Many ilişkinin tam tersidir. Yani ilişkili olan nesne gibi bir çok nesne karşı tarafta aynı nesne ile ilişkili olabilir.

• Örnek: Aynı örnek'te bu sefer Sipariş - Üye ilişkisini ele alabiliriz.

Many-to-One ve One-to-Many İlişki Örnekleri

• Üniversite - Fakülte

• Fakülte - Bölüm

• Marka - Model

• Kategori - Kategori (Alt Kategori Yapısı)

• İl - İlçe

Many-to-Many İlişki

• Eğer nesneler birbirleri ile karşılıklı olarak birden fazla nesne ile ilişkili olabiliyorsa bu ilişki türü Many-to-Many ilişki olmaktadır.

• Örnek: Haber - Kategori

Many-to-Many İlişki Örnekleri

• Öğrenci - Ders

• Ürün - Mağaza

• Oyuncu - Film

• Spor Kulübü - Branş

• Üye - Üye (Takip Ettikleri, Takip Edenler)

ORM

Object Relational Mapping

ORM Nedir?

• ORM kavramı ilişkisel veritabanlarında bulunan nesnelerin, özelliklerinin ve ilişkilerinin yazılım tarafında tanımlanarak bu kavramların yazılım tarafında da karşılıklarının oluşturulması (veritabanının haritalanması) işlemini ifade eder.

• CRUD işlemleri için veritabanı sorgusu yazmanıza gerek kalmaz. Bu işlemleri sizin yerinize ORM gerçekleştirir.

ORM'nin Avantajları

• OOP Kullanmaya Zorlar

• Geliştirme Hızı

• Standart Kodlar

• Veritabanından Bağımsız Bir Yazılım

• Sizin İş Yükünüzü Hafifletir

ORM'nin Avantajları

• Sorgu Yazmaktan Kurtarır (Güvenlik açığı vermenizi engeller)

• Test Edilebilir Kod

• Ekstra Araçlar Sağlar (Dil Desteği, Tree Yapısı, Slug Yapısı, Soft-Delete vb.)

• Event (Listener) Desteği

ORM'nin Dezavantajları

• Performans

• Efektif Olmayan SQL sorguları

• Öğrenme Süreci

• Modelleme Hataları

• Kullanım Hataları

PHP İle Yazılan ORM Kütüphaneleri

Sensio Labs tarafından geliştirilen ORM, DBAL ve ODM gibi veritabanı çözümleri sunan PHP kütüphanesidir.

Neden Doctrine Kullanmalıyım?

• 2006’dan beri geliştirilen stabil bir ORM kütüphanesidir.

• Esnek ve güçlü nesne haritalama ve sorgu özelliklerine sahiptir.

• En basit seviyeden en karmaşık sistemlere kadar her seviyede çözümler sunabilmektedir.

• Birçok framework ile olan entegrasyon kolaylığı.

Neden Doctrine Kullanmalıyım?

• Büyük bir kitle tarafından kullanılması ve geliştiriliyor olmasından dolayı geniş destek ağına sahip olması

ORM Kütüphanesi Soru SayısıDoctrine / Doctrine2 4569 / 6045

Propel 829Eloquent 937

DataMapper 882RedBean 140

php.activerecord 120

Doctrine Kurulumu

• Arşiv (zip, tar.gz vs) dosyası olarak indirmek

• PEAR Paketi olarak kurmak:

• pear channel-discover pear.doctrine-project.org

• pear install doctrine/DoctrineORM-2.3.5

• Composer paket yöneticisi ile kurmak:

• doctrine/orm

Entity Kavramı

• Entity’ler veritabanında tutulacak her bir nesnenin Doctrine tarafında karşılığıdır. 4 farklı şekilde entity yapısı tanımlanabilir:

• Annotation

• XML

• YAML

• PHP Kodu

Entity Manager ve CRUD İşlemleri

• EntityManager sınıfı Doctrine’in komuta merkezidir.

Repository Kavramı

• Repository sınıfları veritabanından nesneleri sorgulamak için kullanılan sınıflardır.

• Repository ifadesinin Türkçe karşılığı depodur.

Repository Genişletme

Doctrine'i Projemize Dahil Etmek

Uygulamalı Anlatım

Query Builder Kullanımı

• Bazen EntityRepository metodları bize istediğimiz verileri sunamayabilir.

• Query Builder, bizi böyle durumlarda SQL yada DQL sorguları yazmaktan kurtaran bir Doctrine sınıfıdır.

DQL Kullanımı

• Query Builder kullanımının yetersiz kaldığı yada performans kaybına neden olduğu durumlar için Doctrine bize DQL söz dizimi ile sorgu imkanı sağlıyor.

• SQL söz dizimi ile birebir aynı olan ama tablo yerine Doctrine nesneleri ve sütunlar yerine bu nesnelerin özelliklerinin kullanıldığı bir yapısı vardır.

Doğal SQL Sorguları Yazmak

• SQL'in gücünü kullanmak istediğinizde Doctrine doğal SQL sorguları da yazmanıza olanak sağlıyor.

• View, Stored Procedure vb SQL özelliklerini kullanmak istediğiniz zaman bu seçenek en çok ihtiyacınız olan yöntem olacaktır.

Doctrine Event Sistemi (Lifecycle Events)

• Doctrine kendi event sistemine LifeCycle Events ismini veriyor.

• Veritabanında yapılan işlemlerle alakalı tüm sürece bu event'ler sayesinde dahil olabilirsiniz.

• 2 Farklı yöntem vardır:

• Entity Dosyası içerisinde tanımlanan metodlar

• Listener Class'ı oluşturularak

Doctrine'de Ön Tanımlı Event'ler

• preRemove – Silme işleminden önce

• postRemove – Silme işleminden sonra

• prePersist – Yeni kayıt eklemeden önce

• postPersist – Yeni kayıt ekledikten sonra

• preUpdate – Herhangi bir kayıt güncellenmeden önce

• postUpdate – Herhangi bir kayıt güncellendikten sonra

Doctrine'de Ön Tanımlı Event'ler

• postLoad – Veri tabanından kayıtlar çekildikten sonra

• loadClassMetadata – Entity tanımalamaları (metadata’lar) okunduktan sonra

• preFlush – Biriktirilen işlemler veritabanına uygulanmadan önce

• onFlush – Biriktirilen işlemler hesaplanıp sorgu çalıştırılmaya hazır olduğunda

• postFlush – Biriktirilen işlemler veritabanına uygulandıktan sonra

• onClear – Veritabanına uygulanmak üzere biriktirilen işlemler temizlendiğinde

Sonuç

Soru & Cevap

Teşekkürler

twitter.com/muhittinfacebook.com/muhittinozer

github.com/muhittinmuhittin@muhittinozer.com