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/downloads

Kurulum 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.

Bu yazı MONGODB kategorisine gönderilmiş. Kalıcı bağlantıyı yer imlerinize ekleyin.

MONGODB GİRİŞ için 2 cevap

  1. Serdar der ki:

    mongodb kullanıyorum çok fazla bellek tüketiyor bunu nasıl kısıtlayabilirim

    • bilgehanyildiz der ki:

      Mongodbyi kullanırken join yapamadığınız icin bellek tarafında birleştirmektense kastın bu veritabanlarında denormalize yapılarla mümkün olduğu kadar tekli sorgular kurgulamak gerekiyor

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>