Kodunuzda saklanan SQL sorgularını düzenlemenin en iyi yolu? (ya da yapmalısın?) [kapalı]


13

Ben SQL sorguları ile çevrili bir kod sayfası gördüğünüzde sinirli alır tek kişi değilim eminim. ActiveRecord ve diğer ORM kalıpları, bir projede kullanılan SQL miktarının azaltılmasına yardımcı olur, ancak birçok karmaşık sorgu durumunda SQL kullanımı kaçınılmazdır.

SQL sorguları kodun geri kalanı ile organize (veya dışarıdan) nasıl bir yere dağılmasını önlemek için görüş arıyorum? Açık bir fikir, Görünümlerin kullanımıdır, ancak çoğu kez Görünümler, birden çok büyük dizinli tabloyla uğraşırken performans sorunlarının kaynağı olabilir.

DÜZENLEME 1 - Zaten model katmanına ayrıldığını varsayıyorum


3
Bu soru burada kesinlikle uygundur - kod organizasyonu: '“neden” ve “nasıl” açıklayan cevaplara ilham verin. ve 'Tasarım desenleri' ve 'Mimarlık' ( SSS'den ) konularından biridir
Michael K

1
Ben de aynı soruyu sormak üzereydim. Keşke burada daha fazla cevap olsaydı.
Michael Kristofik

Yanıtlar:


10

Bana göre SQL, iş mantığı kodunun temel bir parçasıdır (çoğu durumda, çoğunluk). Bunu döndürülen verilerde çalışan koddan ayırmaya çalışırsanız, kodun anlaşılabilirliği ve sürdürülebilirliğini dengesiz hale getirmeye daha eğilimlisiniz.

Ona baktığımda, veri okumak, veri işlemek, veri yazmak, veri aramak ... hepsi benzer işlemler ve en iyi aynı yerde tutuluyor.

Sorgularla çabaların bir kopyasını hissetmeye başlarsanız, belki de bir veritabanı görünümüne veya veritabanı erişiminin bu yönünü kapsayabilecek bir nesneye ihtiyacınız vardır.

Başka bir ipucu aslında iyi bir veritabanı sorgu yöntemine sahip olmaktır. Yazdığım yazılımda (PostgreSQL, MySQL, SQL Server), sorgu işlemlerimin büyük bir kısmının tek bir kod ifadesi olarak yer almasını sağladım.

GetValue(SQL, [transaction], [array_of_params])
GetRow(SQL, [transaction], [array_of_params])
GetRowList(SQL, [transaction], [array_of_params])
GetValueList(SQL, [transaction], [array_of_params])
Execute(SQL, [transaction], [array_of_params])

Bunlar benim (bağlantı) benim "bağlantı nesnesi" bir parçası olduğundan emin olun ana işlev çağrıları vardır. Bu dile, gerçekte ne uyguladığınıza bağlıdır, ama benim amacım onu ​​gerçekten, gerçekten basit ve ağrısız tutmaktır.

Özet olarak, SQL'i programlamanın yerel bir parçası olarak ele alın ve soyutlama uğruna soyutlamayın.


1
harika bir cevap. belki sadece geri adım ve kodun bir parçası olarak SQL, sadece aralarında dağınık bakmaya başlamak gerekir.
jellyfishtree

1
"soyutlama uğruna soyutlama" - İyi bir nokta. Daha anlaşılır kod uğruna özet.
Jason Baker

'Başka bir ipucu aslında iyi bir veritabanı sorgu yöntemi var': Kesinlikle katılıyorum. İş mantığı değiştiğinde kodu değiştirmek için yalnızca bir yer olduğunda çok yardımcı olur.
Michael K

1
SQL'i nereye koyarsınız? Uygulamaya derlenmiş ve yukarıdaki yöntemler kullanılarak gönderilmiş mi?
johnny

OP tarafından Jason Baker'ın cevabı "dev bir SQL sorgusunun variline bakıyor ..." hakkındaki yorumuna dayanarak, bu, SQL metninin büyük bloklarını okuma sorununu nasıl ele alıyor?
JeffO

0

Genel olarak, ayrı bir model katmanına sahip olmak en iyi yaklaşımdır. Bunu mimar etmek için yol veren bir dizi kurumsal tasarım deseni vardır.


üzgünüm, daha spesifik olmalıydım ... Zaten onları bir model katmanına ayırdığınızı varsayıyorum. Ancak bir model katmanı SQL koduyla hala oldukça dağınık hale gelebilir. Belki bu kaçınılmazdır. Model kodunda beni korkutuyor başka bir şey, bazı mantık dayalı "bir SQL sorgusu oluşturur" kodudur ... belki bu kendi fabrika ya da bir şey ayrılmalıdır ...
jellyfishtree

2
@jellyfishtree - Korkarım o zaman sorunun ne olduğunu anlamıyorum. Yani, model katmanınızın çok fazla model koduyla sonuçlanacağından korkuyor musunuz?
Jason Baker

geçerli bir çürütme. Okunabilirlik konusunda endişeliyim. İyi model kodunu anlamak genellikle oldukça kolaydır, ancak dev bir SQL sorgusunun variline bakmanın anlamı tam olarak size sıçramaz. Açıkçası yapılacak ilk şey, bu sorguları düzgün bir şekilde yorumlamaktır, ancak iyi, kendi kendini belgeleyen kodla aynı değildir ve bu tür bölümler model genelinde dağılmıştır. Kabul ediyorum, ama modelde çılgın SQL ifadelerini izole etmenin veya organize etmenin daha iyi bir yolu olup olmadığını merak ediyordum ...
jellyfishtree

0

Model katmanınızı "varlıklar", "depolar" ve "hizmetler" olmak üzere 3 alt katmana ayırmak iyi bir fikir olabilir. Bu, endişelerin ayrılmasını sağlar ve SQL'i iş mantığınızdan tek bir yerde toplar.

Bu senaryoda karmaşık SQL de dahil olmak üzere tüm veri alma kodu depolarda bulunacaktır. Bu yüzden deponun amacı, karmaşık SQL ifadelerini kendi kendini açıklayan yöntemlerin arkasına saklamaktır getUsersWithActiveSubscription().

Varlık, alıcılar ve ayarlayıcılarla gerçek DB tablo alanı adlarını özetler; DB alan türleri ve uygulamanız / programlama dilinizde bulunan türler arasında bazı veri dönüşümleri sağlayabilir. ORM'niz bunu destekliyorsa - kuruluşlar ilişkilendirmeleri gerçekleştirebilir.

Hizmet katmanı iş mantığının yeridir. Hizmet, depoları kullanarak varlıkları alır, bunlara göre hareket eder ve onları depolar.

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.