MONGODB GİRİŞ
Yazıya başlamadan önce bu makalede bazı noktalar Sayın Tolga Yıkılmaz’ın akademik amaçlı yazdıgı BigData çalışmasından alıntılar içermektedir,kendisine teşekkür ederiz.
Bu yazımızda nosql ne oldugu,mongodbnin genel tanımı,mongodbde database design konusu ve mongodbnin kurulumu gibi konuları ele alıyor olacağız.
NOSQL NEDİR?
İlişkisel veritabanı sistemlerine (RDBMS) alternatif olarak ortaya çıkan, aslen internetin gün geçtikçe artan verisini depolayabilmek ve yüksek trafiğe sahip sistemlerin ihtiyaçlarına cevap verebilmek amacıyla ortaya çıkmış yatay olarak ölçeklendirilebilen sistemlere verilen genel addır.NoSQL sistemlerinde RDBMS’de kullanılan SQL dili kullanılmadığı için “No SQL” adı verilmiştir. Kendini kanıtlamış bir çok örneği olmasına rağmen henüz endüstri standardı olarak kabul görmemesinden dolayı kimi zaman ”Not Only SQL” olarak da adlandırılır.
RDBMS’ler işlem (transaction) tabanlı çalışan sistemlerdir. Bu işlemlerin stabil çalışması ve veri bütünlüğü için ACID (Atomicity, Consistency, Isolation, Durability) kuralları bulunur. NoSQL sistemleri bu kuralların tamamına uymaz.
RDBMS’lerde veriler tablolarda, tanımlı sütunlarda satır satır bulunurken, NoSQL sistemler sabit tablo tanımlarına bağımlı değillerdir. Yani daha sonradan özel bir işlem yapmadan yeni kolonlar eklenebildiği gibi, kayıtlar arasında kolon farklılıkları olabilir. Örneğin 1. satırda a ve b kolonları varken 2. satırda bambaşka kolonlar bulunabilir. Bu esnek yapı bize denormalizasyon kolaylığı sağlar. RDBMS’lerde veriler ilişkilerine göre ayrı tablolara düzenli bir şekilde yerleştirilerek normalize edilirken, verilere erişim için birleştirme (join) kullanılır.
Dağıtık sistemlerde birleştirme operasyonu sıkıntılara sebep olur. Çünkü birleştirilmek istenen veriler farklı parçalarda olabilir. Bu yüzden dağıtık sistemlerde birleştirme işlemi elle yapılmalıdır. Yani önce a verisi çekilir, sonra bununla ilişkili b verisi çekilip programatik olarak birleştirilme yapılır. Normal sistemlerde bu işlemler performans kaybına sebep olurken, dağıtık sistemlerde bu performans kaybı sistemin genel performansı yanında önemsizdir. İşte bu sebeple dağıtık sistemlerde birleştirme operasyonu yapmak yerine veri denormalize tutularak verilere erişim kolaylaştırılır.
NoSQL sistemleri yüksek erişilebilirlik sunarlar. Okuma ve yazma performansları olarak RDBMS’lerden göreceli olarak daha performanslı olabilirler.
MONGODB NEDİR?
MongoDB döküman tabanlı bir NoSQL veritabanı sistemidir. MongoDB yapısal verileri JSON benzeri dökümanlarlarda (BSON= Binary JSON) tutar. Her türlü sorgulama ve yönetim işleri JavaScript formatında yapılır.Bu yüzden asp.net wep api gibi rest tabanlı uygulamalar geliştirirken kolaylık sağlar.
MongoDB 2007 yılında 10gen firması tarafından geliştirilmeye başlandı.MongoDB ücretsiz olarak sitesinden indirilip kullanılabiliyor.
Arşivleme ve loglama uygulamalarında, dinamik veriyapısı ihtiyacı duyan sistemlerde, yüksek miktarda veri okuma ve yazma ihtiyacı olan uygulamalarda, ilişkisel olmayan basit veri yapılarında RDBMS yerine MongoDB kullanmak daha uygun olabilir.
Diğer NoSQL çözümleri ile karşılaştırıldığında MongoDB barındırdığı özellikler ile öne çıkıyor. Bu özellikleri şöyle özetleyebiliriz:
Sorgu (query) desteği sayesinde RDBMS’lerde olduğu gibi istenilen alanlara göre, belirli aralıklara göre (range query) ve düzenli ifadelerle (regular expression) sorgu yazılabiliyor. Birçok NoSQL çözümü sadece anahtarlar (key) üzerinden veri sorgulamasına izin verdiğinden bu çok önemli bir avantaj.
İstenilen alanlara göre sorgu yapabilen MongoDB ayrıca bu alanlara indeks (secondary index) oluşturarak daha performanslı çalışabilme imkanı sağlıyor.
MongoDB ölçeklenebilirliği sağlamak için Master-Slave Replication desteği sunuyor. Bu modelde yazma işlemleri master sunucuya yapılırken okuma işlemleri slave sunuculardan yapılarak ölçeklendirme sağlanıyor. Master sunucuya herhangi bir şekilde erişilemez ise slave sunuculardan birisi yeni master olarak çalışmaya başlıyor ve sistem kesintisiz bir şekilde devam edebiliyor.
C, C++, C#, Java, PHP, Python, Erlang birçok dil için sürücü (driver) desteği sunuyor. Bu kütüphaneler gerçekten basit ve güzel tasarlanmış. Hızlı bir şekilde hemen geliştirmeye başlayabiliyorsunuz.Mongodb ile alakalı ikinci yazımızda c# entegrasyonu noktasını ele alıyor olacağız.
MongoDB’de veriler Document‘lar halinde Collection‘lar içerisinde bulunur. Veri yapısı açısından RDBMS sistemlerle karşılaştırıldığında Collection tabloya, bir Document ise tablodaki bir satıra denk gelir diyebiliriz. Ancak bir tablo içerisindeki kolonlar aynı iken bir Collection içerisindeki farklı Document’lar farklı alanlar barındırabilir.
MONGODB Kurulumu
Öncelikle mongodb nin sitesinden kurulum dosyalarımızı indirelim.
http://www.mongodb.org/downloadsKurulum dosyasını indirdikten sonra msi dosyamıza çift tıklayıp kurulumu başlatıyoruz
Kurulum bitince aşağıdaki şekilde defaultta programfiles altına mongodb dosyaları atılıyor.
Bundan sonra mongodbnin datalarımızı saklamak icin directory ayarlarını yapmamız gerekiyor.
Command prompt açıp mongodb filelarınızın oldugu path geçiş yapın
cd C:\Program Files\MongoDB\Server\3.0\bin
Daha sonra yine komut satırından mongod exe yardımı ile mongodb mizi install ediyoruz
--smallfiles küçük boyutta kurulum yapmanızın sağlıyor
--port=8080 diyerek mongodbmizin hangi porttan çalışacağını belirliyoruz
--dbpath komutu ile mongodb data directorymizi yani datamızın saklanacağı pathi belirtiyoruz
C:\Program Files\MongoDB\Server\3.0\bin>mongod --dbpath=C:\MyMongoDb --port=8080
--smallfiles --logpath=C:\MyMongoDb\log.txt --install
mongod --dbpath=C:\MyMongoDb --smallfiles --logpath=C:\MyMongoDb\log.txt --install
Eğer port kullanmadan kurulum yaparsak mongodb 27017 portuna default olarak almaktadır.bu portunda kullanım için açık olması gerekmektedir.
Daha sonra services(hizmetlere) gelerek mongodb servisimizi start ediyoruz.
MONGOVUE(Mongodb için arayüz aracı)
Mongodbde sqlserver management studio veya oracle icin sqlnavigator gibi kayıtlarınıza bakıp administration yapabileceğiniz toollarda bulunmaktadır
Bunlardan birtanesi mongovue bazı özellikleri paralı olsada genel işlemleriniz için ücretsiz indirip kurabilirsiniz
http://www.mongovue.com/downloads/Bu linkten mongovue installer.msi indirip kurulumunu yapabilirsiniz
Kurulum bittikten sonra programın nereye bağlancağını belirliyoruz
Bağlantımızı mongovue üstünde sağladıktan sonra add database diyerek ilk mongo database mizi oluşturuyoruz.
Mongovue nin database explorerda oluşturgumuz ilk databasemizi açtığımızda db mize ait itemlarımızı görüyoruz.
Burada en önemli item Collections yani sql server veya oracleda tablo karşılıklarımız.Databasemize ait ilk collectionımızı oluşturuyoruz
Add collection diyerek Person isimli bir collection oluşturalım
Bu collectionımıza tıklayıp içine ilk kaydımızı atalım.Artık burada oracle veya sql serverdan alışık oldugumuz tabloya ait sabit alanlar mantıgı yok.Collectionı oluşturduktan sonra formatı uygun oldugu sürece istediğiniz kaydı içeri atabilirsiniz.
{
"Name": "Bilgehan",
"Surname": "Yıldız",
"Mails": {
"mail": [
{"value": "a@b.com"},
{"value": "c@d.com"}
]
}
}
Örnek olarak bu json kaydımızı ekleyelim,aşağıdaki ekran görüntüsündede gördüğünüz gibi kaydımız bir doküman olarak oluşup içeri atılmış oldu,ve artık veritabanı kolonlarından çok nesne tabanlı formatta dökümanımızı saklamıs olduk
SQLCOMMAND LINE BENZERI YAPI MONGO
Mongovue ile grafik arabiriminden yaptıgımız işleri oracle da oldugu sql command line mantıgı gibi komut satırından yapabiliriz.
mongo mongodb ninJavaScript shell interfacedir.
Mongod ile kurulum ayarlarını yaparken mongo exe ile de bu command line işlemleri yapabiliriz.komut satırımızı açıp önce mongo nun bulundugu dizine geçiş yapalım daha sonra mongo yazarak shell arabirimine geçiş yapalım
Örnek show dbs mongodbimizdeki database listesini verir .Benzeri komutları mongodb sitesinden bakarak komut satırı ile kullanabilirsiniz.
MONGODB DATABASE DESIGN
Relational database kavramından farklı olarak artık mongoda nesne mantıgında tasarım düşünmemiz gerekiyor ve mongodbde denormalize yapılarla çalışmaya alışmamız gerekiyor.
İlk Modelleme yöntemimiz
• Bire az ilişki:Buna örnek olarak kişi ve kişinin adreslerini örnek verebiliriz.bunu tek bir doküman olarak aşağıdaki şekilde saklayabiliriz
{
name:Bilgehan,
addresses : [
{ street: 'Ümraniye’, city: 'istanbul'},
{ street: 'kızılay', city: 'Ankara }
]
}
• Bire çok ilişki:Buna örnek olarak bir ürün ve bu ürüne ait yedek parçalar verebiliriz.Burada parçalar çok fazla bilgisi olacağı ve parçaların değişkenlikleri yani updatelerinin de çok olacağını düşünerek relational databaselerdeki gibi üründe parçaların idlerini tutup programlama anında gerekli dataları çekip birleştirme yapabiliriz.
{
name : 'product A',
manufacturer : 'ABC Company',
catalog_number: 1234,
parts : [ // array of references to Part documents
ObjectID('AAAA'), // reference to the #4 grommet above
ObjectID('F17C'), // reference to a different Part
ObjectID('D2AA'),
// etc
]}
• Bire çok ilişkiyi denormalize etmek:Yukarıda gerekli birleştirmeleri büyük sayıda kayıtlarda yapmak zahmetli olabilir.Burada şu kararıda verebiliriz yukarıdaki örnek için ürüne ait yedek parçaları gösterirken bize gerekecek büyük ihtimalle yedek parçanın adı elimizde olması yeterli olacaktır
{
name : 'product A',
manufacturer : 'ABC Company',
catalog_number: 1234,
parts : [ // array of references to Part documents
{ id : ObjectID('AAAA'), name : 'Parça1' }, // Part name is denormalized
{ id: ObjectID('F17C'), name : 'Parça2' },
{ id: ObjectID('D2AA'), name : 'Parça3' }, ]}
Burada ürünü gösterceğimiz sayfada tek bir nesneyi çekerek ürüne ait yedek parça adlarınıda listeyebiliriz
Sonuç olarak:
• Denormalize yapılaraı büyük update maliyetleri yoksa tercih etmeliyiz.Yukarıdaki örnekte olduğu gibi yedek parça isimleri çok fazla değişmeyeceğini var sayıyoruz
• Bağlantılı kayıt sayısı azsa ve bunlarda başka yerde kullanmayacaksa iç içe doküman yapısında saklayabiliyoruz.Örnek kişiye ait adresler
• Eğer nesneye tek başına sürekli erişim ihtiyacı varsa embedded şekilde kullanmamaya çalışın
• Designınızı uygulamanızın ihtiyaçlarına göre belirleyin
Temel olarak mongodb ye bir giriş yapmış olduk bir sonraki yazımda mongodb ve .net entegrasyonu konusuna değiniyor olacağım.