Ders 14 / 14
İlişkisel ve İlişkisel Olmayan Seçimi
İlişkisel olmayan veri modeli ailelerinin neyi bırakıp neyi verdiği, belge saklamanın ölçülen ödünleşimi, şema esnekliği yanılgısı ve seçimin karar ölçütleri.
İçindekiler
Önceki ders ilişkisel veritabanının verdiği sözleri adlandırdı. Aynı adlandırma bir karşılaştırmayı mümkün kılar: bu sözlerin bir bölümünden vazgeçen sistemler vardır ve karşılığında başka şeyler sunarlar. Bu dersin sorusu şudur: hangi veri ve hangi erişim biçimi ilişkisel modeli gerektirir, hangi durumda başka bir veri modeli daha uygundur, ve bu karar hangi ölçütlerle verilir?
Vazgeçilen Nedir
İlişkisel model dört şey verir: veriden bağımsız bildirimsel sorgu, şemada uygulanan kısıtlar, keyfî birleştirme, ve işlem güvenceleri. İlişkisel olmayan sistemler bunların bir bölümünü bırakır. Bırakma nedeni genellikle üçünden biridir: veriyi birden çok makineye dağıtmak, tek bir erişim biçimini çok ucuza indirmek, ya da şemanın önceden bilinmediği bir alanı karşılamak.
Karar bu yüzden “hangisi daha iyi” sorusu değildir. Soru şudur: bu iş, bırakılan güvencelerden hangisine ihtiyaç duyuyor?
Veri Modeli Aileleri
Anahtar–değer deposu (key-value store) tek bir erişim biçimini destekler: anahtarla getir, anahtarla yaz. Değerin içi sistem için anlamsızdır, dolayısıyla içine göre sorgu yapılamaz. Oturum durumu ve önbellek gibi işlerde yerindedir.
Belge deposu (document store) değeri yapılandırılmış bir belge olarak tutar ve içindeki alanlara göre sorguya izin verir. Doğal birimi birleşik kayıttır (aggregate): birlikte okunan ve birlikte yazılan veri tek belgede durur.
Sütun ailesi deposu (wide-column store) satırları anahtara göre bölümler ve her satırda seyrek, çok sayıda sütun tutar. Çok büyük yazma hacimlerini dağıtmaya yönelir.
Çizge veritabanı (graph database) düğüm ve kenarları birinci sınıf nesne yapar. Uzun yollar boyunca dolaşmayı — “bu üyenin ödünç aldığı kitapları alan üyelerin başka ne aldığı” gibi — ilişkisel birleştirme zincirinden ucuza getirir.
Arama dizini (search index) metni sözcüklerine ayırıp ters dizin kurar; alaka sırasına göre sonuç döndürür. Kataloğun serbest metin araması buna örnektir.
Zaman serisi deposu (time series store) zaman damgalı ölçümleri sıkıştırarak saklar ve aralık sorgularına göre düzenlenir.
Bu aileler birbirini dışlamaz; birçok ilişkisel motor belge, metin arama ve çizge sorgulamayı kendi içinde sunar. Hangi yeteneğin hangi motorda bulunduğu değişir, ve bu yüzden karar ürün adıyla değil gereksinimle verilir.
Belge Saklamanın Ödünleşimi
Belge yaklaşımının kazancı ve bedeli aynı yerden gelir: veri, tek bir okuma biçimine göre bir araya getirilmiştir.
sqlite3 :memory: <<'SQL' .headers on .mode box .nullvalue (bos) CREATE TABLE uye_belge (uye_no INTEGER PRIMARY KEY, belge TEXT NOT NULL); INSERT INTO uye_belge VALUES (41, '{"ad":"Ayse Demir","odunc":[{"isbn":"975-01"},{"isbn":"975-02"}]}'), (52, '{"ad":"Mert Kaya","odunc":[{"isbn":"975-01"}]}'), (63, '{"odunc":[]}'); SELECT uye_no, belge ->> '$.ad' AS ad, json_array_length(belge, '$.odunc') AS odunc_sayisi FROM uye_belge ORDER BY uye_no; SELECT o.value ->> '$.isbn' AS isbn, COUNT(*) AS kez FROM uye_belge u, json_each(u.belge, '$.odunc') o GROUP BY isbn ORDER BY isbn; SQL
┌────────┬────────────┬──────────────┐ │ uye_no │ ad │ odunc_sayisi │ ├────────┼────────────┼──────────────┤ │ 41 │ Ayse Demir │ 2 │ │ 52 │ Mert Kaya │ 1 │ │ 63 │ (bos) │ 0 │ └────────┴────────────┴──────────────┘ ┌────────┬─────┐ │ isbn │ kez │ ├────────┼─────┤ │ 975-01 │ 2 │ │ 975-02 │ 1 │ └────────┴─────┘
Belge alanlarına erişen işleçlerin adı ve yazılışı motora göre değişir; burada gösterilen davranış her yerde aynıdır.
Üç sonuç okunabilir. Birincisi kazanç: bir üyenin adı ve ödünç listesi tek satırdan gelir,
hiçbir birleştirme yoktur. İkincisi bedel: “hangi kitap kaç kez alındı” sorusu bütün
belgeleri açmayı ve içlerindeki dizileri düzleştirmeyi gerektirir. Belge sınırının dışına
çıkan her soru pahalıdır. Üçüncüsü kayıp: 63 numaralı üyenin belgesinde ad alanı hiç
yoktur ve bu ekleme hatasız geçmiştir. NOT NULL yazılabilecek bir yer bulunmadığı için
kural, belgeyi yazan her programa geri dönmüştür.
Şema Esnekliği Yanılgısı
Belge yaklaşımının en sık dile getirilen üstünlüğü şema esnekliğidir: yeni bir alan eklemek şema değişikliği gerektirmez. Bu doğrudur, ama eksik ifade edilmiştir.
Şema ortadan kalkmaz; yer değiştirir. Yazma anında şemada (schema-on-write) yapı veritabanında tanımlıdır ve her yazma ona uymak zorundadır. Okuma anında şemada (schema-on-read) yapı, belgeyi okuyan kodun beklentisinde durur. Alanın adı değiştiğinde ya da tipi farklılaştığında sorun kaybolmaz; yazma anında bir hata olarak görünmek yerine, okuma anında bir davranış farkı olarak ortaya çıkar. Üstelik depoda artık her iki biçimden belgeler vardır ve okuyan kodun ikisini de karşılaması gerekir.
Ölçüt şudur: yapı gerçekten öngörülemez ve üzerinde kısıt aranmıyorsa esneklik kazançtır. Yapı bilinebiliyorsa, onu şemaya yazmamak yalnızca doğrulamayı ertelemektir.
Ölçek ve Dağıtım
Veriyi birden çok makineye dağıtmak — veri bölümleme (partitioning) — ilişkisel modelin iki yeteneğini zorlar. Birleştirme, parçaları farklı makinelerde duran iki bağıntı arasında ağ üzerinden yapılır. İşlem güvenceleri, birden çok makineyi kapsadığında ek eşgüdüm ve gecikme gerektirir.
İlişkisel olmayan sistemlerin bir bölümü bu iki yeteneği baştan sınırlayarak dağıtımı ucuzlatır: birleştirme sunulmaz, işlem tek bir birleşik kayıtla sınırlanır, ve okumanın en son yazmayı görmesi güvence altına alınmaz — buna sonunda tutarlılık (eventual consistency) denir.
Burada dikkat edilecek nokta sıralamadır. Dağıtım, veri tek makineye sığmadığında ya da tek makinenin dayanabileceğinden çok istek geldiğinde gerekir. Bu eşiğe ulaşmadan dağıtımın maliyetini üstlenmek, hiçbir karşılığı olmayan bir kayıptır.
Karar Ölçütleri
Beş soru, kararın çoğunu belirler.
- Veri şekli. Varlıklar arasında çoka çok ilişkiler var mı, yoksa veri doğal olarak bağımsız birleşik kayıtlara ayrılıyor mu? Çoka çok ilişki yoğunsa ilişkisel model kazanır.
- Erişim biçimi. Sorgular önceden biliniyor ve hep aynı anahtardan mı geliyor, yoksa sonradan tanımlanan keyfî sorular mı sorulacak? İkincisi bildirimsel sorgu gerektirir.
- Kısıt gereksinimi. Birden çok varlığı kapsayan değişmezler var mı? “Bir nüsha aynı anda tek üyede olabilir” kuralı, belge sınırının dışına taşan bir kısıttır.
- Tutarlılık gereksinimi. Okumanın en son yazmayı görmesi zorunlu mu? Ödünç verme gişesinde zorunludur; katalog önerilerinde değildir.
- Şema kararlılığı. Yapı biliniyor ve nadiren mi değişiyor, yoksa alan başına öngörülemez mi?
Yanıtlar tek bir sisteme işaret etmeyebilir. Çoklu depo (polyglot persistence), farklı işler için farklı depolar kullanmaktır: kayıtların ilişkisel motorda, serbest metin aramanın arama dizininde tutulması gibi. Bedeli belirgindir — iki depo arasındaki tutarlılık artık uygulamanın sorumluluğundadır, ve bu sorumluluk kursun ilk dersindeki dosya sorununun daha büyük ölçekte geri dönüşüdür. Bu yüzden yaygın sıralama şudur: kayıt sistemi ilişkisel motorda tutulur, ikincil depolar ondan türetilir.
Özet
- İlişkisel olmayan sistemler bildirimsel sorgu, şema kısıtları, keyfî birleştirme ve işlem güvencelerinden bir bölümünü dağıtım ya da tek bir erişim biçiminin ucuzluğu için bırakır.
- Belge saklama, birleşik kayıt içindeki okumayı birleştirmesiz yapar; belge sınırının dışına çıkan soru bütün belgeleri açmayı gerektirir.
- Şema esnekliği şemayı ortadan kaldırmaz, onu okuyan koda taşır; doğrulama silinmez, ertelenir.
- Dağıtım birleştirmeyi ve işlem güvencelerini pahalılaştırır; eşiğe ulaşmadan üstlenilen dağıtım karşılıksız maliyettir.
- Seçim veri şekli, erişim biçimi, kısıt ve tutarlılık gereksinimi ile şema kararlılığı üzerinden yapılır; çoklu depo kullanılıyorsa kayıt sistemi tek olmalıdır.
Kurs Kapanışı
Bu kurs, veriyi dosyada tutmanın sorunlarıyla başladı ve ilişkisel modelin bu sorunlara verdiği yanıtı adım adım kurdu. Bağıntının küme kuramından gelen tanımı, satır sırasının neden veriye ait olmadığını ve tablonun bağıntı gibi davranmasının neden şemada istendiğini açıkladı. Anahtarlar satırı ayırt etme kuralını, bütünlük kısıtları bu kuralın motor tarafından uygulanmasını verdi. Boş değer, doğru–yanlış ikilisini üçe çıkararak sorgu yazımının sessiz tuzaklarını açtı. Veri tipleri, bir sütunun ne tutacağının gösterimden ayrı bir karar olduğunu gösterdi.
İkinci konu tekrarın kaynağını biçimselleştirdi. İşlevsel bağımlılık, anahtar kavramının genel hâli olarak tanımlandı; normal formlar, sol tarafı anahtar olmayan bağımlılıkları basamak basamak eledi. Denormalizasyon ters yöndeki kararı ölçüye bağladı, şema tasarım kalıpları da tekrar eden durumların yerleşik karşılıklarını ve karşı kalıplarını verdi.
Üçüncü konu şemayı iş yüküyle buluşturdu: işlem ile çözümleme yüklerinin zıt gereksinimleri, ACID güvencelerinin tanımı ve sınırları, ve ilişkisel modelin ne zaman doğru seçim olduğu.
Kurs boyunca kasıtlı olarak açık bırakılan bir boşluk var. Her derste sorgular yazıldı ama
sorgu dilinin kendisi hiç öğretilmedi; SELECT deyiminin bölümleri, koşulların yazılışı,
birleştirme türleri, gruplama ve sıralama — hepsi örnek içinde kullanıldı, kural olarak
tanımlanmadı. Boş değerlerle çalışmanın araçları, ödünç geçmişini özetleyen toplama
işlevleri, veriyi değiştiren deyimlerin ayrıntısı da aynı biçimde bekliyor.
SQL Temelleri kursu bu boşluğu doldurur. Burada kurulan modelin — bağıntıların, anahtarların, kısıtların ve boş değerin — üzerine, o modeli sorgulayan dili sistemli biçimde kurar. Kütüphane şeması orada da sürer: bu kursta tasarlanan tablolar, orada yazılacak her sorgunun konusu olacaktır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.