NoSQL, MongoDB: Doküman Temelli ve Şema Bağımsız NoSQL Veritabanı
MongoDB NOSQL türünde veritabanlarından belki de en ünlüsü. (NoSQL ve ilgili veri tabanları hakkında dayazmalıyım) En yaygın ve bilinen tanımı ile Not only SQL- sadece SQL değil şeklinde Türkçe ’ye çevirdiğimizde sanki SQL desteği var gibi anlaşılıyor ancak MongoDB de SQL komutları çalıştıramayacağınızı şimdiden söylemeliyim. Yazdığınız SQL komutlarını kısmen de olsa NoSQL jargonuna dönüştürebilen çalışmalar var fakat bence tamamen ayrı dünyalar. Denemek isterseniz bir tanesinin linkini paylaşalım http://www.querymongo.com/
Örnek verdiğim bu adreste SQL -> MongoDB dönüşümünü yapabilirsiniz. Fakkaat. Söyle bir sorgu yazdığınızda:
…..WHERE demo.salesid=sales.salesid
En kibar hali ile “aradığınız kişiye şu anda ulaşılamıyor” mesajı garantidir. Yada Select cümlesinde birden fazla tablodan sorgu yaptığınızda yani select * from sales, orders dediğinizde benzer mesajı alırsınız. Bunun nedeni RDBMS (MSSQL, Oracle, MySQL vb.) sistemlerinin ortak çalışma mantığı olan birden fazla tablonun join edilerek yani tablolar ve alanlar arasında ilişki kurularak istenilen verinin elde edilme yaklaşımının (Adı üzerinde ilişkisel veritabanı) MongoDB ninde dahil olduğu NoSQL DB’ ler için olmamasıdır. Wollllaaa …. Eğer foreign key, master key , normalization gibi konular ortama hakim olduğunda başı ağrıyanlardan iseniz, yukarıdaki sesleri muhtemelen siz çıkardınız. Relational yapıdan kurtulmanızın bazı önemli dezavantajları olsa da tasarımı kolaylaştırması, yatay olarak genişleyebilme ve sistem availabilityi artırması sebebi ile tercihiniz olabilir. Ne demeye çalışıyorum: Paranız cebinizde kalır. Çoğu RDBMS sisteminde verileriniz arttığında yan yana makineler koymanız sistem performansını kolaylıkla artırmaz. Ayrıca bu sistemler genellikle sıradan sunucular üzerinde çalışmazlar ve her donanım artımı (RAM, CPU, Diskler) size ciddi rakamlara mal olabilir. Oysa sıradan donanımları yan yana koyarak rahatlıkla genişleyebilen ve daha ucuza mal ettiğiniz bir yapı kurmanız mümkündür. NoSQL veritabanları doküman, kolon, graph veya key-value olarak veriyi saklarlar. Hangi ürününü ne şekilde veir sakladığını merak ediyorsanız aşağıdaki adresi ziyaret edebilirsiniz.
http://media.bestofmicro.com/Z/L/383601/original/nosql-databases.jpg
MongoDB doküman temelli bir veri tabanı uygulamasıdır. MongoDB de yazacağımız sorgular yalnız bir koleksiyon (tablo gibi düşünebilirsiniz) üzerinde çalışır. Nedeni daha önce belirttiğimiz gibi SQL’ de olduğu gibi JOIN benzeri bir karşılığın olmamasıdır. Bu yüzden MongoDB ve benzeri NOSQL veritabanları herhangi bir şema yada model kurulmasını zorlamaz. (Bu kurmayacağınız anlamına gelmez) Tasarım yaparken veriyi “denormalize” etmek gereklidir.
Doküman temelli ne demek…
MongoDB’ ye eklediğiniz her bir kaydı ve o kaydın barındırdığı alt kayıtları bir doküman gibi düşünebilirsiniz. Saklanan dokümanlar JSON (Java Script Object Notation) objelerinden meydana gelir. Basit bir json objesi/nesnesi ile örnek vermeye çalışalım:
{ "name":"Fırat","lastname": "Doğan","age":37,"email": "[email protected]"}
Not: Yazdığınız bir JSON bloğunun geçerli olup olmadığını kontrol etmek isterseniz, çok faydalı bir siteyi önereyim : http://jsonlint.com/
Örnek verdiğimiz JSON objesi aslında içerisinde dört alan barındıran bir dokümandır. Bunu tarz JSON nesnelerini saklayan MongoDB’ ye bu nedenle “document based” veritabanı diyoruz.
Şemasız veya şema bağımsız veritabanı ne demek…
Yukarıda verdiğimiz doküman aslında RDBMS sistemleri için bir veya birden fazla tabloda saklanması gereken bir kayıttır. Yani yukarıda JSON olarak verilen dökümanı (kayıtı) saklamak için üç tane string bir tanede number türünde olmak üzere dört alanlı bir tablo oluşturmamız gerekir. RDBMS veri tabanlarında mevcut kayıtlara yeni bir alan eklemeye kara verdiğinizde tablonun şemasını değiştirmeniz gereklidir. Bu durumda da önce tabloyu “drop” etmek, yeni alanı tanımlamak ve ardından yeni kayıt oluşturmak gereklidir. Örneğin “ID” alanının unuttuk ve bunuda eklemeye kara verdik. Bunun için yazmamız gereken JSON:
{"name": "Fırat","lastname": "Doğan","age":37, "email": "[email protected]","ID": "TCN01234"}
Yukarıdaki JSON nesnesi bu defa beş alandan oluşan bir dokümandır. Fazladan bir alanın bulunması ( yada eksik) bir dökümanın aynı koleksiyona (tabloya) eklenmesi doküman temelli MongoDB’ için bir engel oluşturmaz. Çünkü her doküman ayrı bir varlıktır ve kendi içinde farklı bir yapısı olabilir: Örneğin bir doküman bir başka alt dokümanda içerebilir. Bu anlamda RDBMS sistemlerindeki tablolar arasındaki ilişkiler ve lookup tablolar bir anlamda alt dokümanlar ile temsil edilebilir. Son bir örnek vererek bu konuyu netleştirelim:
{
"name": "Fırat",
"lastname": "Doğan",
"age": 37,
"email": "[email protected]",
"ID": "TCN01234",
"books": [
{
"isbn": "AXRT123",
"title": "Atın İntikamı"
},
{
"isbn": "XYZT123",
"title": "Bütün Kuşlar Ötmez"
}
]
}
Bu son örnekte alt doküman olarak books’ u oluşturduk ve bunu bir dizi olacak biçimde tanımladık. JSON hakkında daha fazla bilgi almak için sizlere googlelamanızı öneririm. Bir sonraki yazı için hatırlatma düşeyim. Bu yazıda anlattıklarımın MongoDB’ de uygulamasını yazmaya çalışacağım. (Ekran görüntüsü almak, ürün anlatmak benim için vakitsizlik nedeni ile biraz zor, yinede deneyeceğim)
Görüşmek Üzere…
















