• 22-11-2015, 22:58:38
    #1
    Merhaba arkadaşlar, üstadlar.

    Yeni bir web tabanlı projeye başlayacağım. Ancak, merak ettiğim ve denemek istediğim bir husus var.

    Herhangi bir ORM aracı kullanmıyorum ve INSERT, UPDATE, DELETE gibi işlemleri yazılım içinde klasik SQL sorguları ile yapıyorum.

    Yapmak istediğim şey tam olarak şu:
    INSERT INTO tablo(sutun1, sutun2) VALUES(deger1, deger2)
    yerine bu işlemi yapacak bir prosedür yazıp
    CALL prosedur(deger1, deger2)
    şeklinde kullanmak.

    Ya da yazılım tarafında yaptığım kontrolleri (dönen değerin null olması durumunda varsayılan bir değer atamak vb.) tamamen veritabanı içinde bitirip o şekilde SQL çıktısı üretmek istiyorum.

    İşin özü; yazılımın üstlendiği görevleri mümkün olduğunda veritabanına (Mysql kullanıyorum) yıkmak, veritabanı dışında mümkün olduğunca az kodlama yapmak ve bilgi işlemeyi tamamen veritabanına bırakmak istiyorum.

    Bunun avantajları ve dezavantajları nedir?

    Öngördüğüm avantajlar:
    - Programlama dili değiştirmek daha kolay olur.
    - Veritabanı işlemleri kendi içinde bitireceği için, dolayısıyla yazılım tarafında yalnızca sonuçları listeleyeceğim için; yanıt son kullanıcıya daha hızlı verilir (bu sadece tahmin).

    Öngördüğüm dezavantajlar:
    - Veritabanı sistemi değiştirmek daha zor olur.
    - Çok daha fazla kod yazılır.

    Siz de avantaj ve dezavantajları (mümkünse teknik verilerle) bu konu altında paylaşırsanız ve konu hakkında bilgisi olduğunu düşündüğünüz üstadları konuya davet ederseniz; hem benim, hem de bu şekilde proje geliştirmek isteyen diğer arkadaşlar için oldukça faydalı olacaktır.

    Katkısı olan herkese şimdiden teşekkür ederim.
  • 23-11-2015, 08:31:07
    #2
    sql wiew kullanabilirsiz
  • 23-11-2015, 12:13:14
    #3
    halil2233 adlı üyeden alıntı: mesajı görüntüle
    sql wiew kullanabilirsiz
    Yanıtınız için teşekkür ederim ancak öğrenmek istediğim bu değil.

    Yukarıda anlattığım şekilde bir yapının artıları ve eksiklerini öğrenmek istiyorum.

    TURKCELL T60 cihazımdan Tapatalk kullanılarak gönderildi
  • 23-11-2015, 12:19:47
    #4
    🌐 𝘀𝗼𝗰𝗶𝗳𝗹𝘆.𝗰𝗼𝗺
    Ama önemli olan veritabanının yükünü azaltmaktır. Siz bütün yükleri veritabanına taşırsanız bir çok problemlerle karşılaşırsınız.

    Hatta sırf veritabanının yükünü azaltmak için cache sistemi kuruluyor. Bence yapacağınız şey çok performanslı olmayacaktır.
  • 23-11-2015, 12:32:16
    #5
    tolgasen adlı üyeden alıntı: mesajı görüntüle
    Ama önemli olan veritabanının yükünü azaltmaktır. Siz bütün yükleri veritabanına taşırsanız bir çok problemlerle karşılaşırsınız.

    Hatta sırf veritabanının yükünü azaltmak için cache sistemi kuruluyor. Bence yapacağınız şey çok performanslı olmayacaktır.
    Yanıtınız için teşekkür ederim. Haklısınız ancak, bahsettiğiniz önbelleklemeli yapılarda da, veritabanı işlemi yapılacağı zaman, önbellekleme aşılıyor. Neticede bilginin bir şekilde veritabanında işlenmesi gerekiyor.

    Ben de diyorum ki; veritabanına bir bilgi kaydedilecek, güncellenecek ya da silinecekse; ilgili tüm işlemler veritabanının kendi içinde yapılsın. Önbellekleme de olsa, bu işlemleri yapmak için sonuçta bir şekilde yine veritabanına gelecektim ben.
  • 23-11-2015, 13:00:36
    #6
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Misafir adlı üyeden alıntı: mesajı görüntüle
    Yanıtınız için teşekkür ederim. Haklısınız ancak, bahsettiğiniz önbelleklemeli yapılarda da, veritabanı işlemi yapılacağı zaman, önbellekleme aşılıyor. Neticede bilginin bir şekilde veritabanında işlenmesi gerekiyor.

    Ben de diyorum ki; veritabanına bir bilgi kaydedilecek, güncellenecek ya da silinecekse; ilgili tüm işlemler veritabanının kendi içinde yapılsın. Önbellekleme de olsa, bu işlemleri yapmak için sonuçta bir şekilde yine veritabanına gelecektim ben.
    Bu bahsettiklerin zaten veritabanında yapılıyor. Orm gibi araçlar kullanmak veya kendi prodecure'lerini yazmak birşey değiştirmiyor. Sen procedure yazarak zaman kaybediyorsun. Orm kullansan da kullanmasan da zaten herşey veritabanında bitiyor.
    Örneğin orm ile insert işlemi yapıyorsun diyelim, orm aracı db.Insert(x,y,z) metodunu çalıştırdığında zaten bir query oluşturuyor ve sql tarafında execute ediyor.
    Sen kendi insert metodunu yazınca yine query sql tarafında execute olmuş oluyor.
    Orm araçları sana zaman kazandırmak için query yazmayı minimuma indiriyor.

    Veritabanı yükü demek bu değildir. Veritabanı yükü demek aynı ayna (aynı saniye ve salisede) 10larca kişinin işlem yapıyor olmasıdır ve bundan dolayı sistem kaynaklarına daha fazla ihtiyaç duyulmasıdır.
  • 23-11-2015, 13:29:30
    #7
    rob33n adlı üyeden alıntı: mesajı görüntüle
    Bu bahsettiklerin zaten veritabanında yapılıyor. Orm gibi araçlar kullanmak veya kendi prodecure'lerini yazmak birşey değiştirmiyor. Sen procedure yazarak zaman kaybediyorsun. Orm kullansan da kullanmasan da zaten herşey veritabanında bitiyor.
    Örneğin orm ile insert işlemi yapıyorsun diyelim, orm aracı db.Insert(x,y,z) metodunu çalıştırdığında zaten bir query oluşturuyor ve sql tarafında execute ediyor.
    Sen kendi insert metodunu yazınca yine query sql tarafında execute olmuş oluyor.
    Orm araçları sana zaman kazandırmak için query yazmayı minimuma indiriyor.

    Veritabanı yükü demek bu değildir. Veritabanı yükü demek aynı ayna (aynı saniye ve salisede) 10larca kişinin işlem yapıyor olmasıdır ve bundan dolayı sistem kaynaklarına daha fazla ihtiyaç duyulmasıdır.
    Yanıtınız için teşekkür ederim. Sanırım istediğim şeyi doğru biçimde anlatamadım.

    Benim derdim; ORM aracı kullanmamak, SQL komutları yazmak gibi bir şey değil.

    En basit hâliyle:
    if (dbdenGelenAd == null) {
      ad = "Ad yok";
    } else {
      ad = dbdenGelenAd;
    }
    
    conn.executeQuery("INSERT INTO tablo(ad) VALUES("+ ad +")");
    deyip de veri kontrollerini veritabanı dışında yapmaktansa
    conn.execute("CALL AD_EKLE("+ ad +")");
    
    -- AD_EKLE PROSEDÜRÜ
    IF GELEN_AD IS NULL THEN
      @AD = "Ad yok";
    ELSE
      @AD = GELEN_AD;
    END IF;
    
    INSERT INTO tablo(ad) VALUES(@AD);
    şeklinde bir kullanım ile veri kontrollerini dahi veritabanı içinde yapmak istiyorum.

    Bu çok basit bir örnekti. Bunun gibi veritabanı dışında yapılan hemen hemen her işi (döngüler, kontroller vb.) mümkün olduğunca veritabanı içinde yapmak istiyorum. Yükten kastım da tam olarak bu.

    Yaptığımı ve yapmak istediğimi biliyorum. Sadece bunun artı ve eksilerini öğrenmek istiyorum.
  • 23-11-2015, 22:40:04
    #8
    Application tarafında hata ayıklaması sql tarafında göre daha kolaydır. Tablolarının yapılarının application tarafında implement edilmesi, crud işlemlerinde uygun nesnelerin oluşturulması, bunların kontrolleri çok daha kolaydır ve sql meşgul edilmeden bu gibi hatalar önlenir ve veritabanı kullanılmamış olur.
    Sql tarafında insert işleminde bir hata olduğunu ve bunu query'i execute edip kullanıcıya geri döndürdüğünü düşün. Kullanıcı hatayı düzeltip tekrar gönderdiğinde 2 kere sql'i meşgul etmiş olacak ve bu sorguyu 10larca veya 100lerce kişinin çalıştırdığını düşün. Sorgu cevap zamanların artabilir, deadlock'lar oluşabilir ve belkide bazı sorgular hiç cevap vermeyecek ve boş yere log dosyan büyüyecek. Kısaca sistem kaynaklarını daha fazla kullanmış olacaksın, bu da maliyet demektir.

    Döngüler için çok fazla söyleyecek birşeyim yok, recursive (cte), cursor gibi döngüler kullandım fakat çok ciddi performans sorunu yaşamadım.

    Diğer taraftan güvenliği de düşünmek gerekir. Xss, csrf, sql injection gibi saldırıları sql validation'larla engellemek çok daha zor ve büyük risk taşır.

    Bu nedenlerden ötürü sql tarafında minimum işlemlerin yapılması önerilir, database migration işlemleri daha kolay ve hızlı olur, yazılan kod daha efektif olur.
  • 24-11-2015, 07:33:51
    #9
    Projenin yönetilebilirliği açısından sql'den uzak durmak daha doğru, bu konuda haklısınız. Ancak benim açımdan projenin taşınabilirliği ve paylaşılabilirliği de önemli.

    Örneğin; ilerleyen zamanlarda bu proje için bir servis yazabilir (farklı programlama dili ile), projeyi yine farklı bir dil ile yazabilir ya da bunun servissiz desktop sürümünü çıkarabilirim.

    Bunun gibi durumlarda veritabanı dışında yazdığım kodlar, kurguladığım yapı küçüleceği için, oldukça avantajlı görünüyor.

    Ek olarak; ben yalnızca veritabanı işlemlerinin veritabanında yapılmasını istiyorum. Bahsettiğiniz hataları mümkün olduğunca veritabanına gitmeden çözmek isterim.

    if (verilerTam && verilerGuvenli) {
      conn.execute("call prosedurAdi()");
    }