RDBMS'ye işi kodda yapmak yerine boşaltmak ne zaman daha iyidir?


12

Tamam, ben buna polis olacağım: Ben veritabanlarında olduğumdan daha iyi bir kodlayıcıyım ve "en iyi uygulamalar" hakkındaki düşüncelerin SQL sorgusunda "basit" hesaplamalar yapma konusunda nerede olduğunu merak ediyorum. Bu MySQL örneği gibi kod (yazmadım, sadece korumak zorundayım!) - Bu, kullanıcı adını ve kullanıcıların son olaydan itibaren yaşını döndürür.

SELECT u.username as user, 
       IF ((DAY(max(e.date)) - DAY(u.DOB)) < 0 ,   
       TRUNCATE(((((YEAR(max(e.date))*12)+MONTH(max(e.date)))
       -((YEAR(u.DOB)*12)+MONTH(u.DOB)))-1)/12, 0),  
       TRUNCATE((((YEAR(max(e.date))*12)+MONTH(max(e.date))) -            
       ((YEAR(u.DOB)*12)+MONTH(u.DOB)))/12, 0)) AS age   
FROM users as u
JOIN events as e ON u.id = e.uid
...

Koddaki "ağır" kaldırma işlemiyle karşılaştırıldığında:

Sorgu:

SELECT u.username, u.DOB as dob, e.event_date as edate
FROM users as u
JOIN events as e ON u.id = e.uid

kod:

function ageAsOfDate($birth, $aod)
{    //expects dates in mysql Y-m-d format...
     list($by,$bm,$bd) = explode('-',$birth);
     list($ay,$am,$ad) = explode('-',$aod);

     //Insert Calculations here 
     ...
     return $Dy; //Difference in years
}

echo "Hey! ". $row['user'] ." was ". ageAsOfDate($row['dob'], $row['edate']) . " when we last saw him."; 

Böyle basit bir durumda çok fazla fark yaratmayacağından eminim (birincisi gibi sorgularda değişiklik yapmak zorunda olduğumda korkutucu korku hissi dışında), ama bence ne daha net arıyorum.

Teşekkürler!


1
Bu iyi bir soru - aynı konuyla karşılaştım.
Michael K

İşte ne zaman yapılmayacağına dair iyi bir örnek : calendar.sql (Evet, bu benim canavarlığım, evet, kötü bir fikirdi ve hayır, yavaş değil.)
greyfade

Ye tanrılar ... Ben MD5 bahse girerim o şey "CthulhuFhtagn"
GeminiDomino için

Yanıtlar:


13

Performans nedenleriyle veritabanındaki tüm küme tabanlı işlemleri yapmak istiyorsunuz. Böylece toplama işlevleri, sıralama işlevleri, birleşimler vb.

Bu yaş hesaplaması, kod yapardım. Hiç bir veritabanı sorgusunda böyle bir şey yapabilir tek nedeni, başka türlü aslında benim sorgu anlamlı yavaşlatmak için yeterli veri miktarı olabilir seçin olmaz sütunları çok gerekli olmasıdır. Birkaç tamsayı değeri seçmek anlamlı bir performans farkı yaratmaz. Orta düzeyde bir performans farkı yaratsa bile, bu mantığı uygulama kodunda tutmaya eğilimli olacağım.


Katılıyorum. Görüntüleme amaçlı değerlerle çalışan kod, uygulama kodunuzda olmalıdır.
TehShrike

4

Her vaka farklı

Mantık ...

  • diğer müşteriler tarafından gerekli? KURU: veritabanında
  • ileri işlemler için kullanılır? örneğin yaşa göre azalan sıralama: veritabanında
  • bölgesel ayarlar gerekli mi? gg / aa / yyyy veya aa / gg / yyyy: istemcide
  • sık kullanılan? Neden tekrar tekrar hesaplıyoruz: Veritabanında hesaplanmış ve kalıcı sütun kullan

Gelen bu durumda, ben veritabanında bir bilgisayarlı ve kalıcı sütunu kullanabilirsiniz

Daha kötü olabilir: veritabanında bu olabilir:

"Hey! ". u.username." was ". <datecalc>. " when we last saw him."

3

Temel olarak iki şeye bakmalısınız: CPU kullanımı ve ağ trafiği. Veritabanı çok daha iyi yapabileceğinden, büyük yanıtlar oluşturmamalı, bunları ağ üzerinden aktarmamalı ve daha sonra ön uçta özetlememelisiniz.

Veri manipülasyonu için bir ticarettir. Veritabanı, aynı şeyi yaparak karşılaştırılabilir miktarda cpu döngüsü harcarsa, aynı şeyi yaparak aktarılır - veri miktarının kabaca eşdeğer olduğu göz önüne alındığında), nerede olduğu önemli değildir. Ardından, en fazla programlama uzmanlığına sahip olduğunuz yerde yapın. Sık sık, dikkatli bir seçim ile çok uzun bir yol elde edebilirsiniz ve bu çok yararlı olabilir.


1

Birinden bahsettiniz: uzmanlık alanı. Belki de veritabanının yapısı çok yoğun değildir, bu nedenle mantıksal geliştirmenin bir kısmını daha veritabanı merkezli bir ekip üyesine boşaltmaya karar verirsiniz. İdeal olmayabilir, ama eğer zaman için çıtırtıysanız ...

Veritabanı donanımının diğer sunuculardan çok daha fazla kaynağı vardır ve bunu değiştiremezsiniz. Bu, bu özel durum için geçerli olmayabilir, ancak dikkate alınması gerekebilir.

Kodunuzun dışında mantığa ihtiyaç duyabilecek başka uygulamalar da vardır. Bazı rapor yazma araçları bir web hizmeti veya API kullanamayabilir. Mantığı çoğaltabilir veya gereksinimlerin farklı olabileceğini düşünüyorsanız.


"Veritabanı donanımının diğer sunuculardan çok daha fazla kaynağı var ve bunu değiştiremezsiniz." - ha? Bu iki ifade nereden geldi?
Peter Boughton

Bence Jeff bağımsız Veritabanı sunucularından bahsediyor olabilir. Muhtemelen çoğunlukla LA [MP] P kurulumlarında çalıştığımı belirtmeliydim.
GeminiDomino

1
LAMP kurulumu, bağımsız bir veritabanı sunucusuna sahip olmamanın bir nedeni değildir ve bağımsız bir veritabanı sunucusundan daha fazla kaynak garantisi veya bunu değiştirememe garantisi yoktur.
Peter Boughton

Hrm. Emin değilim.
GeminiDomino

@Peter Boughton, DB ve aynı sunucudaki uygulama, arayüz bağlantısı için daha az büyüklük ve daha büyük IO büyüklükleri sırasına sahiptir, bu ikisini birlikte bulmak için gerçek nedenler vardır.
Jé Queue

0

Ben her zaman DB kadar işleme koyarak hata. Yukarıdaki sözdiziminiz IMO'nun çok temiz bir çözümü olacak DB işlevleriyle de yazılabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.