MongoDB bir NoSQL veritabanıdır. NoSQL "not only sql" olarak da açılabilir, yani SQL değil anlamındadır. Çünkü çalıştırılan sorgular bir MySQL ya da MsSQL sistemlerinde alışmış olduğunuz sorgular değiller.
NoSQL Sistemlerinin Avantajları Nelerdir?
Okuma ve yazma konusunda diğerlerine göre daha performanslı olabilirler.
Yatay olarak genişletilebilirler. Yani binlerce sunucu küme oluşturarak çalıştırılabilir ve daha büyük veriler üzerinde daha rahat işlem yapılabilir.
Farklı bir çok özellikleri olması sebebiyle programlama alanında kolaylıklar sağlar.
Maliyet olarak diğer veritabanı sistemlerine göre daha avantajlıdır.
NoSQL Sistemlerin Dezavantajları Nelerdir?
SQL bir veritabanı kullanan uygulamanın NoSQL sisteme taşınması ilk aşamada zor olacaktır. Özellikle join kullanan sorgularda düzenleme yapılması gerekecektir.
NoSQL veritabanı sitemleri veri güvenliği konusunda SQL veritabanlarındaki gibi gelişmiş bir yapıya sahip değiller.
MongoDB'de yukarıdaki dezavantajlarda bahsettiğim gibi güvenlik konusunda ilk kurulumda yetersiz kalmakta. Varsayılan olarak kullanıcı adı ve şifre bulunmamakta. Doğrudan sunucu adresini yazarak veritabanına bağlantı sağlanabilmekte. Bu sebeple veritabanı erişimini sunucu dışına kapatmak gerek ve MongoDB konfigurasyonlarını düzenleyerek kullanıcı yetkilendirmesini açmanız gerek. Kurulum ve konfigurasyonları sonraki konumda açıklayacağım.
MongoDB
10gen firması tarafından 2007 yılında başlanan ve 2009 yılında AGPL lisansıyla açık kaynak projesine dönüştürülen bir veritabanı sistemidir. Belge yönelimli veritabanı olarak tanıtılmaktadır. (Document oriented). MongoDB üzerinde oluşturulan her kayıt bir dökümandır. Bu dökümanlar json formatında saklanır.
MongoDB ve alışılagelmiş S
Plesk panel servisleri bir mysql veritabanı kullanarak çalışmaktadır. Plesk panele ait bilgiler, sunucuda ekli olan siteler ve o sitelerin özelliklerinin bir çoğu "psa" isimli veritabanında tutulmaktadır. Plesk panel psa isimli veritabanına admin kullanıcısı ile bağlanmaktadır. Bu admin kullanıcısının mysql şifresi değiştirilirse eğer Plesk panel girişinde bir hata mesajı ile karşılaşabilirsiniz ve erişim sağlayamazsınız. Aşağıdaki komutu SSH üzerinden çalıştırarak Plesk admin şifresini görüntüleyebilirsiniz.
# /usr/local/psa/bin/admin --show-password
Admin şifresi değiştirildiğinde bu komut çalıştırıldığında da hata alabilirsiniz. Aşağıdaki komutları çalıştırarak Plesk panel mysql admin şifresini tekrar düzeltebilir ve bu problemi çözebilirsiniz.
# export PSA_PASSWORD=buraya_şifreniz_gelecek
# /usr/local/psa/admin/bin/ch_admin_passwd
PHP de veri tabanına bağlanma ve sorgu çalıştırmayı anlatmıştım.
Klasik veri tabanı bağlantısı mysql_connect() komutu ile yapılıyor, sorgu çalıştırma mysql_query() ile yapılıyor fakat pdo yapısı biraz farklı. PDO php 5.2 den sonra gelen bir veri tabanı sorgu sınıfı, yani nesne tabanlı bir yapı.
En güzel özelliği çoklu veri tabanı desteği olması. Oracle, SQL Server, MySQL gibi farklı veritabanlarına bağlanabilme özelliği sunuyor. Ayrıca kendi içerisinde sql injection koruması olan bir sınıftır.
$db = new PDO('mysql:host=localhost;dbname=veritabanı adı', 'kullanıcı adı', 'sifre');
PDO sınıfını db değişkenine bağlı olarak oluşturduk, sorgularımızı bu sınıfa bağlı methodlar ile yapacağız.
query() methodu genel olarak tüm sorgularda kullanılır.
exec() methodu bilgi girişi, güncelleme, silme gibi veri tabanına değer göndermede kullanılır.
prepare() methodu query() methodundaki gibi tüm sorguları çalıştırmada kullanılır fakat buna ek olarak bir de execute() methodu kullanılır, prepare ile yapılan sorgunun uygulanması için.
fetch() methodu; tek bir sonuç getirmek için kullanılır, query ile çalıştırılmışsa sorgu query den sonra, prepare ile çalıştırılmışsa sorgu execute methodundan sonra kullanılır.
Veritabanından dataların sayılarını getirmek istediğimizde fetch(PDO::FETCH_NUM) kullanılır.
Örnek olarak bir sorgu çalıştırayım, sorguyu query ile yapacağım.
$sorgu = $db->query('select * from blog where id=1')->fetch();
Veritabanından id değeri 1 olan konuyu getiren sorguyu yazdık. Bu şekilde de yapabilirdik
$sorgu = $db->query('select * from blog where id=1');
$sorgu->fetch();
İkisi de aynı işlemi yapıyor.
echo $sorgu['blog_baslik'];
İ
İki farklı tablomuz var, birinde açılan konular, diğerinde ise kullanıcılar.
Sistemde hangi kullanıcı konu açıyorsa o kullanıcının id bilgisi de konuların bulunduğu tabloda tutuluyor.
Konular Tablosunda
id, baslik, icerik, yayin, kullanici_id alanları var
Kullanıcılar Tablosunda
k_id, kullanici_adi, sifre, yetki alanları var
Biz yetki durumu 1,2 ve 3 olan kullanıcıları yayında bulunan konu sayılarına göre konu sayısı en fazla olan en üstte çıkacak şekilde göstermek istiyoruz.
Ben bunu çok uzun bir yöntemle yapmıştım, konuların bulunduğu yerden kullanıcı idlerini ve o kullanıcıların konu sayılarını ayrı ayrı alıp dizi değişkenine atayıp sıralayıp foreach ile döngüye sokup o şekilde sadece üç kullanıcı gelecek şekilde uzun sorgular topluğu şeklinde yapmıştım, daha kısa bir yöntem arıyordum ve Kerim Yılmaz (Ayazoğlu) kardeşim sayesinde çözdüm.
Tek bir sql sorgusu
select distinct(b.kullanici_id),k.kullanici_adi, (select count(id) from konular where kullanici_id=k.p_id) as toplam from kullanicilar kinner join konular b on b.kullanici_id=k.k_id where b.yayin=1 and k.yetki=1 or k.yetki=2 or k.yetki=3 order by toplam desc limit 3
sorguyu şu şekilde açıklayayım, tablo ilişkilendirmesi yaptık, bu konuda anlatmıştım tablo ilişkilendirmeyi, distinct ile veriyi tekrarsız çekiyoruz.
Konular tablosunda konusu olan kullanıcıları seçmiş olduk, ekran yazdırmak istediğimiz alanları seçtik sadece veritabanından, kullanici_adi, konu sayıları ve kullanıcı idleri.
select işlemi yaparken içerde parantez içinde bir select sorgusu daha kullandık, bura da count ile konuların sayılarını aldık ve hangi kullanıcının konu sayısını alacağımızı where koşuluyla belirttik daha sonra aldığımız bu sayıları toplam isimli bir alana aktardık ve toplam alanındaki değere göre tersten sıralayarak sadece 3 kişi gelecek şekilde kişileri seçmiş olduk.
sorguyu phpMyAdmin de çalıştırınca resimdeki g
C# ta veritabanında sorgu çalıştırabilmemiz için SqlCommand komutunu kullanırız, ben örneğimize MySql üzerinden devam edeceğim için MySqlCommand komutunu kullanacağım.
Yeni bir windows form uygulaması başlatıp, iki buton bir de listview ekliyoruz. Butonun birine "Bilgileri Getir" diğerini "Bilgiyi Sil" isimlerini veriyoruz.İlk önce veritabanı bağlantımızı yapmak için bağlantı komutlarımızı yapıp bağlantıyı açıyoruz.
MySqlConnection baglanti = new MySqlConnection("server=localhost; userid=root; password=root; database=cryptograph");
Bilgileri Getir ismini verdiğimiz butonun click olayına hata kontrol komutlarımızı kullanarak bağlantımızı açıyoruz ve veriler çekmek için gerekli komutlarımızı yazıyoruz.
try
{
baglanti.Open();
MySqlCommand sorgu = new MySqlCommand("SELECT * FROM blog ORDER BY id DESC", baglanti);
MySqlDataReader oku = sorgu.ExecuteReader();
while (oku.Read())
{
listView1.Items.Add(oku["blog_baslik"].ToString());
}
}
catch (Exception hata)
{
MessageBox.Show(hata.ToString(), "Hata");
}
finally
{
baglanti.Close();
}
MysqlCommand komutu ile sorgu isminde bir nesne tanımladık ve sql sorgumuzu belirtip hangi bağlantıyı kullanacağını belirttik.SELECT * FROM blog ORDER BY id DESC sql sorgumuz, burada blog isimli tablodan verilerin id alanına gire tersten sıralanacak şekilde getirilmesini istedik.MysqlDataReader ile bir data reader nesnesi oluşturduk, yani veritabanından bilgileri okuyacak olan nesne, oku isimli nesneye sorgu.ExecuteReader(); bu komut ile bilgiyi nereden okuyacağını belirttik, sorgu isimli nesneden alacak bilgiyi.Daha sonra bunu döngüye sokarak listview içine ekledik veriyi. Try içerisinde gerçekleşen sorgular bittiğinde finally içerisindeki sorgu çalıştırılır, yani durum gerçekleşse de gerçekleşmese de en sonda yapılacak işlem burada belirtiliyor,