NoSQL Veritabanları

Gamze Yılan
5 min readNov 30, 2020

--

NoSQL hakkında hiçbir şey bilmiyorsanız ve giriş yapmak istiyorsanız, bu yazı sizin için.

NoSQL Nedir?

Non-relational SQL (ilişkisel olmayan sorgulama dili, ilişkisel olmayan SQL)’in kısaltması olan NoSQL, veri depolamak ve yönetmek için kullanılan bir yöntemdir. İlişkisel veritabanlarının aksine NoSQL veriyi tablo halinde değil farklı şekillerde modeller. NoSQL veritabanları çoğunlukla big data ve gerçek zamanlı web uygulamaları için kullanılır. NoSQL veritabanlarının bir sorgulama dili olan SQL ile de çalışabileceğini vurgulamak için Not Only SQL şeklinde de bir açılımı vardır.

  • Not: İlişkisel veritabanlarına aşina değilseniz, devam etmeden önce ilişkisel veritabanlarına dair tanıtıcı yazımı deneyebilirsiniz.

Big Data Nedir?

Büyük miktarlardaki yapılandırılmış ve yapılandırılmamış, hala da büyümekte olan veri yığınına Big Data denir. Geçtiğimiz yüzyılda arama motorları ve sosyal medya sayesinde veri hacminde büyük bir artış gözlenmiş, bu da Big Data’nın doğuşuna sebebiyet vermiştir. Big Data öyle büyüktür ki geleneksel veri depolama yöntemleri, tablolar, ilişkisel veritabanlarının izin verdiği ilişki tanımlamaları yetersiz kalmaktadır.

NoSQL Veritabanı Türleri

NoSQL veritabanları çok çeşitlidir. En büyüklerinden bahsedelim.

  • Sütun yönelimli NoSQL veritabanları: İlişkisel veritabanları genellikle satır odaklıdır.

Arkadaşlarımızın isimlerini, yaşlarını, hobilerini ve mesleklerini içeren bir veritabanı düşünelim. Bu veriyi ilişkisel bir veritabanında depolarsak her bir obje, ya da bizim durumumuzda her bir arkadaşımız bir sütun olarak tutulacaktır. Bütün satır ve sütunlar tek ve büyük bir veritabanı halinde tutulacaktır. Ve bu listede bilgisayar mühendisi arkadaşlarımızı bulmak istersek her bir satır için her bir sütun tek tek kontrol edilecektir: önce isim, sonra yaş, sonra hobi ve en son meslek.

Ancak sütun yönelimli veritabanlarında arkadaşlarımızın isimleri, yaşları, hobileri ve mesleklerinin her biri yani her bir sütun ayrı bir veritabanı olacaktır. Sonrasında arkadaşlarımızın her biri birer id numarası sayesinde doğru yaşve hobi gibi özelliklere bağlanacaktır. Bu sayede bilgisayar mühendisi arkadaşlarımızı bulmak istersek tek tek her satırı taramamız gerekmeyecek, yapmamız gereken tek şey meslekler sütununa gidip bilgisayar mühendisi satırını bulduktan sonra bununla eşleşen id numaralarına gitmek olacaktır.

Sütun yönelimli veritabanları sayesinde sadece arama-getirme işlemi daha çabuk olmayıp aynı zamanda tüm bilgisayar mühendisi arkadaşlarımız için tek tek ayrı birer kutu içine, tekrar tekrar bilgisayar mühendisi yazmamıza gerek kalmaması dolayısı ile verimiz daha küçük olacak, daha az yer kaplayacaktır. Üstelik yeni sütunlar eklemek istersek eski sütunlar bundan ilişkisel veritabanlarında olduğu kadar etkilenmeyecektir.

Sütun yönelimli NoSQL veritabanlarına Apache HBase, Facebook Cassandra, Hypertable, ve Google BigTable verilebilir.

  • Anahtar-Değer NoSQL Veritabanları: Bu tür veritabanları her veriyi anahtar ve değer çifti halinde saklar. Arkadaşlarımıza dair yukarıda oluşturduğumuz veritabanını bu model ile oluştursaydık örneğin; isim, yaş, meslek, hobiler kelimeleri birer anahtar olurken Ali, 40, bilgisayar mühendisi, okçuluk gibi gerçek veriler bu anahtarların değerleri olacaktır. Hatta bütün bir anahtar-değer dizisini tek bir nesne içinde kalacak şekilde enkapsüle edip buna bir anahtar tanımlarsak, bu dizi de bir değer olacaktır.

Anahtar-değer veritabanlarına Redis, Voldemort, Riak, ve Amazon Dynamo örnek verilebilir.

  • Döküman NoSQL veritabanları: Döküman veritabaları sayesinde her bir nesneyi özelliklerine göre parçalamak yerine, önceden belirlediğimiz bir şemaya uygun bir şekilde bütün halde veritabanına yükleyebiliriz. Bunu programlama yaparken bir sınıf oluşturup daha sonra o sınıfın özelliklerine uygun nesneler tanımlamaya benzetebiliriz.

Örneğin bazı makaleleri ilişkisel bir veritabanında depolamak istediğimizi düşünelim. Bunun için makaleyi inceleyerek yazar ismi, tarih, başlık ve makalenin kendisi şeklinde bu makaleyi parçalamamız gerekir. Daha sonra bu özellikler için sütunlar oluşturulur ve her biri doğru sütuna denk gelecek şekilde tek tek girilir. Ancak döküman veritabanları ile yapmamız gereken tek şey yazar adı, tarih, başlık ve makalenin kendinin nerede olması gerektiğini belirten bir şema oluşturup bunu kaydettikten sonra makaleyi olduğu gibi yüklemek olacaktır. Sonrasında veritabanı hangi özelliğin hangi sütuna ait olduğunu otomatik olarak, parçalama ihtiyacı duymadan bilecektir.

Nesneleri parçalamadan ya da birleştirmeden tutabilme özelliği sayesinde bu veritabanları en kullanışlı olanlarıdır diyebiliriz. Döküman veritabanlarına MongoDB ve CouchDb örnek verilebilir.

  • Graf (Ağ) veritabanları: Graf ya da ağ veritabanları birbiriyle fazlaca bağlı verileri depolamak için kullanılır. Bu veritabanı sistemi nesneleri alır ve onları çizgiler kullanarak birbirine bağlar. Nesne türü milyonlarca olabilir: insanlar, şirketler, ürünler… Aradaki çizgi bu nesneler arasındaki ilişkiyi tutar ve çizginin kendisi de, yani bu ilişki de kendine ait bazı özelliklere sahip olabilir. Eğer bu ilişki yönlü bir ilişki ise bu çizgi bir ok olabilir.

Bu veritabalarına örnek olarak Facebook’un veritabanını düşünebiliriz. Siz, arkadaşarınız Derya ve Deniz, anneniz Sevim ve kızkardeşiniz Damla birer nesne olacaktır ve sizi onlara bağlayan birer çizgi olacaktır. Anneniz kızkardeşinizle de arkadaş olacağından onların arasında da bir çizgi olacaktır. Eğer Sevim’in anneniz olduğunu belirtmişseniz sizi ona bağlayan çizgi bir ok olacaktır. Bu ok üzerinde “annesi” yazarsa, okun ucu size doğru olacaktır. ODTÜ, siz ve Derya’nın beraber eğitim gördüğü üniversite, farklı türden bir nesne olacaktır ve üzerinde “öğrencisi” yazıp bu nesneyi işaret eden iki ok, sizi ve Derya’yı ODTÜ nesnesine bağlayacaktır. Böylelikle bütün sosyal çevreniz ve hayatınız bir ağ oluşturacaktır. Bu örnekte her bir nesne bir düğüm (node) ve aradaki her bir ilişki bir kenar (edge) olarak adlandırılır.

Bu türden veritabanları büyük miktarlarda, oldukça karmaşık veri ve nesne türleri tutabilir, bunlar kolaylıkla birbirine bağlanır ya da bağlantıs koparılır. Bu türden veritabanları ile tüm dünya git gide birbirine içten bağlanabileceğinden dolayı seçenekler sonsuzdur. Tablolar, null değerler ve doldurulacak kutucuklar olmadığından daha az hafıza alanı kaplanır. Bu veritabanı tipi ile pek çok şey basitçe, diğer nesne ve bağlantıları bozma riski oldukça düşük bir şekilde eklenebilir ya da değiştirilebilir. Bu sebeple her ne kadar ilişkisel veritabanları günümüzde daha yaygın kullanımda olsa da yakında bu durum ağ veritabanlarının lehine değişecektir.

İlişkisel Veritabanları vs NoSQL Veritabanları

Her ne kadar ilişkisel veritabanları çok daha sık kullanılsa da ve NoSQL veritabanları çok daha verimli olabilse de, birinin diğerinin yerini alması şu an için söz konusu değildir. Bazı durumlarda ilişkisel cebir kullanmak doğru iken bazı durumlarda NoSQL veritabanları çok daha kullanışlı olabilmektedir. İkisinin de kendi avantajları vardır ve biri diğerinden daha popüler olabilir, ancak herhangi biri yakın zamanda ortadan kalkmayacaktır.

Big Data ile çalışırken NoSQL veritabanları, daha az hafıza alanı kaplayacağından ve aramalar daha hızlı olacağındna daha mantıklım bir seçim olacaktır. İlişkisel veritabanları ile çalışırken elinizde bir yapı ve önceden belirlenmiş bir şema olmalıdır. Ancak dinamik ve büyümekte olan Big Data gibi bir veriyle uğraşırken bu her zaman mümkün olmayacaktır. Burada da NoSQL işimize yarar, çünkü NoSQL belirli bir yapıya sahip olmayan veriyle de çalışabilmektedir. NoSQL ile tablolar, satırlar, sütunlar oluşturmanıza ve hatta verinizin tipini bile bilmenize gerek kalmayacaktır.

NoSQL’in belki de en büyük avantajlarından biri ölçeklemedir. Büyümekte olan bir site ya da uygulama ile çalışırken elinizdeki veri miktarı asla azalmayacak, git gide artacaktır. Ölçekleme iki türlü olabilir: yatay ölçeklenme ve dikey ölçekleme. İlişkisel veritabanları dikey ölçeklemeyi kullanır, veri miktarı arttığı zaman eski, küçük hafıza biriminizi daha yeni, daha büyük bir hafıza birimiyle değiştirmeniz gerekir. NoSQL veritabanlarında ise yatay ölçekleme kullanılır, birebir aynı hafıza biriminden isterseniz on tane alıp artan veriyi diğerlerine yayabilirsiniz.Yatay ölçekleme daha hızlı, ucuz ve güvenlidir. Yatay ölçeklemede çok daha ucuz donanımsal parçalar kullanıp her biri dolduğunda bir başkasını ekleyebilirsiniz.

Diğer yandan ilişkisel veritabanları ilişkisel veriyi tutmakta daha başarılıdır. Elinizde bir şema, her bir nesne için belirli ve kesin bazı özellikler bulunur. Ayrıca ilişkisel veritabanlarında normalizasyon dediğimiz bir durum da mümkündür ve bu işimizi oldukça kolaylaştırır. Çok fazla sayıda satır ve sütun içeren bir veritabanını birden fazla, daha küçük veritabanına bölüp bunları ilişkiler yoluyla birbirine bağlamaya normalizasyon denir. Bu büyük bir hafıza alanı tasarrufu ve veriyle çalışmayı kolaylaştırması sayesinde bize daha iyi bir performans sağlar. Ayrıca ilişkisel veritabanları ile SQL kullanılabilmektedir. SQL oldukça eski ancak popüler, güvenilir ve öğrenmesi kolay bir sorgulama dilidir. İlişkisel veritabanlarında NoSQL veritabanlarından farklı olarak ekleme, çıkarma ve veri güncelleme konusunda bazı kurallar tanımlanaran veride bütünlük sağlanabilir. Örneğin spor salonu üyelerinin bilgilerini tutan bir veritabanında, üyelik durumu “aktif” olan üyelerin bilgilerinin silinmesini engelleyecek bir kural kullanarak kazayla veri kaybı olmasını engelleyebiliriz.

--

--

Gamze Yılan

Embark on my journey to becoming the world’s leading Software and Systems Engineer.