Perl's DBIx :: Class'ı ne zaman kullanmalıyım?


17

DBIx :: Class , DBI aracılığıyla bağlanabileceğiniz herhangi bir veritabanının popüler Perl arabirimidir . Teknik detayları için iyi bir dokümantasyon var, ancak uygun kullanımı hakkında yetersiz bilgi (muhtemelen istemediğiniz durumlar dahil).

Birçok durumda, insanlar buna bir veritabanı içeren her şey için kullanmaları gerektiğini düşündükleri için refleks olarak ulaşırlar. Ancak, çoğu zaman bir ağrı noktası haline geldiği noktaya yanlış kullanıldığını gördüm. Kod ve mimari incelemeler sırasında sorum her zaman "Foo size ne fayda sağlıyor?" Çoğu zaman, bu durumlarda gördüğüm geliştiriciler buna tutarlı bir cevap oluşturamazlar. Ama sonra, genellikle basit SQL'i anlamıyorlar.

Son birkaç aydır insanlara "Neden DBIx :: Class kullanıyorsunuz?" Diye soruyorum. ve sadece bir tane iyi yanıt aldınız (ve bu kişi "Ne zaman kullanmazsınız" takibine de cevap verebiliyordu). Baş geliştirici Peter Rabbitson, yaptığı röportajda bir cevaba yaklaştı FLOSS Weekly'deki , ancak röportajın ortasında biraz gömüldü.

Peki, DBIx :: Class kullanmanın bir proje için uygun olup olmadığına nasıl karar verebilirim?


3
Başka bir kitap mı yazıyorsun? :)
simbabque

1
Deneyimlerime göre, ağrı, DBIC aşırı dolu olduğu durumlarda kullanıldığında ortaya çıkar. Ve çok güçlü olmasına rağmen, genellikle aşırı derecede doludur, çünkü insanlar sadece temel özellikleri (SQL oluşturma ve birleştirme) kullanır ve başka bir şeye ihtiyaç duymazlar. Bu yüzden DBIx :: Lite yazdım, bu temel özellikleri sağlar ve sabit kodlu bir şema gerektirmez.
Alessandro

Yanıtlar:


24

Soruyu cevaplamadan önce, arka planın düzgün olduğunu düşünüyorum.

Sorunun Özü

Yıllarca geliştiricilerle röportaj yaptıktan ve işe aldıktan sonra iki şey öğrendim:

  1. Geliştiricilerin büyük çoğunluğu veritabanı tasarımı konusunda çok az deneyime sahiptir.

  2. Veritabanlarını anlamayanlar ile ORM'lerden nefret edenler arasında gevşek bir ilişki olduğunu fark ettim .

(Not: ve evet, ORM'lerden nefret eden veritabanlarını çok iyi anlayanlar olduğunu biliyorum)

İnsanlar içinde üretici adını gömmek niye yabancı anahtarlar, neden önemli olduğunu anlamıyorum ne zaman itemmasaya, ya da neden customer.address1, customer.address2ve customer.address3alanlar yazma veritabanı hataları onlar için daha kolay hale getirmek için bir ORM ekleyerek, iyi bir fikir değildir hiçbir şey yardım etmeyecek.

Bunun yerine, uygun şekilde tasarlanmış bir veritabanı ve bir OLTP kullanım durumu ile ORM'ler altındır. Çoğu homurdanma çalışması gider ve DBIx :: Class :: Schema :: Loader gibi araçlarla , iyi bir veritabanı şemasından dakikalar içinde Perl kodunu çalıştırabilirim. Pareto Kuralından bahsederim ve problemlerimin% 80'inin işin% 20'si ile çözüldüğünü söylerdim, ancak gerçekte, faydaları bundan daha da fazla buluyorum.

Çözümü Kötüye Kullanma

Bazı insanların ORM'lerden nefret etmesinin bir başka nedeni de soyutlamanın sızmasına izin vermesidir. MVC web uygulamalarının ortak durumunu ele alalım. İşte yaygın olarak gördüğümüz bir şey (sözde kod):

GET '/countries/offices/$company' => sub {
    my ( $app, $company_slug ) = @_;
    my $company = $app->model('Company')->find({ slug => $company_slug }) 
      or $app->redirect('/');
    my $countries = $app->model('Countries')->search(
     {
         'company.company_id' => $company->company_id,
     },
     {
         join     => [ offices => 'company' ],
         order_by => 'me.name',
     },
   );
   $app->stash({
     company   => $company,
     countries => $country,
   });
}

İnsanlar bunun gibi kontrolör rotaları yazıyor ve iyi, temiz kod olduğunu düşünüyorlar. Denetleyicilerinde sabit kodlama SQL'de dehşete düşeceklerdi, ancak farklı bir SQL sözdizimini ortaya koymaktan çok daha fazlasını yapmamışlardı. ORM kodlarının bir modele aktarılması gerekir ve daha sonra bunu yapabilirler:

GET '/countries/offices/$company' => sub {
   my ( $app, $company_slug ) = @_;
   my $result = $app->model('Company')->countries($company_slug)
     or $app->redirect('/');
   $app->stash({ result => $result });
}

Şimdi ne olduğunu biliyor musun? Modelinizi düzgün bir şekilde kapsüllediniz, ORM'yi açığa çıkarmadınız ve daha sonra, bu verileri veritabanı yerine bir önbellekten alabileceğinizi fark ettiğinizde, denetleyici kodunuzu değiştirmeniz gerekmez (ve daha kolay bunun için testler yazmak ve mantığı yeniden kullanmak).

Gerçekte, insanların ORM kodlarını tüm denetleyicilerine (ve görünümlerine) sızdırmaları ve ölçeklenebilirlik sorunlarına çarptıklarında, mimarilerinden ziyade ORM'yi suçlamaya başlamasıdır. ORM kötü bir rap alır (Bunu birçok müşteri için tekrar tekrar görüyorum). Bunun yerine, ORM sınırlarını gerçekten vurduğunuzda, kodun bağlandığınız ORM ile çok sıkı bir şekilde eşleştirilmesine izin vermek yerine sorununuz için uygun çözümleri seçebilmeniz için bu soyutlamayı gizleyin.

Raporlama ve Diğer Sınırlamalar

Rob Kinyon'un yukarıda açıkladığı gibi, raporlama ORM'lerde zayıflık eğilimindedir. Bu, birden çok tabloya yayılan karmaşık SQL veya SQL'in bazen ORM'lerle iyi çalışmadığı daha büyük bir sorunun alt kümesidir. Örneğin, ORM bazen istemediğim bir birleştirme türünü zorlar ve bunu nasıl düzeltebileceğimi söyleyemem. Ya da belki MySQL'de bir indeks ipucu kullanmak istiyorum , ama bu kolay değil . Ya da bazen SQL o kadar karmaşıktır ki, sağlanan soyutlama yerine SQL yazmak daha iyi olur.

Bu DBIx :: Class :: Report yazmaya başlamamın bir parçasıdır . Şimdiye kadar iyi çalışıyor ve insanların burada yaşadıkları sorunların çoğunu çözüyor (salt okunur bir arayüzle iyi oldukları sürece). Ve bir koltuk değneği gibi görünse de, gerçekte, soyutlamadan sızmadığınız sürece (önceki bölümde açıklandığı gibi), çalışmayı DBIx::Classdaha da kolaylaştırır.

Peki DBIx :: Class'ı Ne Zaman Seçerim?

Benim için, çoğu zaman bir veritabanına bir arayüze ihtiyaç duyduğumu seçerdim . Yıllardır kullanıyorum. Bununla birlikte, bir OLAP sistemi için seçemeyebilirim ve yeni programcılar kesinlikle onunla mücadele edecek. Ayrıca, sık sık meta-programlamaya ihtiyacım olduğunu görüyorum ve DBIx::Classaraçları sağlarken , çok kötü belgeleniyorlar.

DBIx::ClassDoğru kullanmanın anahtarı çoğu ORM için olanla aynıdır:

  1. Soyutlamayı sızdırmayın.

  2. Lanet olasý testlerini yaz.

  3. Gerektiğinde SQL'e nasıl bırakılacağını bilin.

  4. Bir veritabanını nasıl normalleştireceğinizi öğrenin.

DBIx::Class, bir kez öğrendikten sonra, ağır kaldırma işlemlerinizin çoğunu sizin için halledecek ve uygulamaları hızlı bir şekilde yazmayı bir esinti haline getirecektir.


1
Belki de kullanmadığınız zamanlar için başka bir liste ekleyebilirsiniz. :)
brian d foy

1
Bu sizin için açıktır, ancak muhtemelen birçok okuyucu için açık değildir (diyorum, yıllar içinde #dbix-classve geçirdikten sonra #catalyst) - "soyutlama sızdırmaz" bitinin anahtarı DBIC'de çalıştığınız her şeyin çerez kesici davranışı sağlayan bir şeyin alt sınıfı. Alt sınıflarınıza yöntem eklemeniz önemle tavsiye edilir ve bir Soru-Cevap işi yapmazsanız, yalnızca yazdığınız yöntemler genel arayüzünüzün bir parçası olmalıdır.
hobbs

@hobbs: Gerçekten de, insanların bununla en çok yanlış gittiğini görüyorum ve DBIC ile bu şekilde takılıyorlar. İnsanların genellikle küçüklerde ne yaptıklarını bildiğini varsayıyoruz, ancak büyüklerinde bilmiyorlar.
brian d foy

9

Bir şeyi ne zaman kullanacağınızı bilmek için, şeyin amacının ne olduğunu anlamak önemlidir. Ürünün amacı nedir.

DBIx :: Class bir ORM - Nesne İlişkisel Eşleyici'dir. Bir ORM, İlişkisel / Küme tabanlı ilişkisel veritabanı veri yapılarını alır ve bir Nesne ağacıyla eşler. Geleneksel eşleme, tablonun yapısını sınıf açıklaması olarak kullanan satır başına bir nesnedir. Veritabanındaki ebeveyn-çocuk ilişkileri, nesneler arasında taşıyıcı ilişkiler olarak ele alınır.

Bu onun kemikleri. Ancak, bu bir ORM kullanmanız gerekip gerekmediğine karar vermenize yardımcı olmaz. ORM'ler öncelikle aşağıdakiler doğru olduğunda yararlıdır:

  • İlişkisel bir veritabanı kullanırsınız.
  • Verileriniz büyük ölçüde OLTP (Çevrimiçi İşlem İşleme) için kullanılır.
  • Başvurunuza rapor yazmazsınız.

Bir ORM'nin sahip olduğu en büyük güç, ilişkisel veri yapısının üstüne yerleştirilmiş bir ağaç grafiğini yürümek için iyi SQL oluşturmaktır. SQL genellikle tüylü ve karmaşıktır, ancak empedans uyumsuzluğunu yönetmenin bedeli budur.

ORM'ler satır çıkarma SQL yazma konusunda çok iyi olsa da, harmanlama SQL yazma konusunda çok zayıftır. Bu, raporların oluşturulduğu SQL türüdür. Bu tür bir harmanlama bir ORM değil, farklı araçlar kullanılarak oluşturulur.

Çeşitli dillerde birçok ORM, Perl'de ise birçok vardır. Diğer haritacılar Class :: DBI ve Rose :: DB'dir. DBIx :: Class genellikle sonuç kümelerinin gücü konusunda diğerlerinden daha iyi kabul edilir. Bu, SQL üretiminin SQL yürütmesinden ayrıldığı bir kavramdır.


Güncelleme : Ovid'e yanıt olarak, DBIx :: Class (SQL :: Abstract aracılığıyla) hem hangi sütunların döndürüleceğini hem de hangi dizin ipuçlarının kullanılacağını belirleme olanağı sağlar.

Genel olarak, eğer bunu yapmak istiyorsanız, o sorgu için bir ORM kullanmamanız daha iyi olur. Unutmayın - ORM'in temel amacı, tablodaki satırları, nitelikleri tablonun sütunları olan bir sınıfın nesnelerine eşlemektir. Özelliklerin yalnızca bazılarını dolduruyorsanız, o nesnenin potansiyel kullanıcıları hangi özelliklerin doldurulduğunu veya bilmediğini bilemez. Bu korkunç savunma programlamasına ve / veya ORM'lerin genel nefretine yol açar.

Neredeyse her zaman, dizin ipuçlarını kullanma veya hangi sütunların döndürüleceğini sınırlama isteği, hız için bir optimizasyon ve / veya bir araya getirme sorgusudur.

  • Verilerini birleştirme sorgular ORMS'nin olan kullanım durumu vardır DEĞİL için tasarlanmış. DBIx :: Class toplama sorguları oluşturabilirken, nesne grafiği oluşturmuyorsunuz, bu yüzden doğrudan DBI kullanın.
  • Performans optimizasyonları, sorgulanan veriler, veritabanına nasıl eriştiğinize bakılmaksızın, temel alınan veritabanı için çok büyük olduğundan kullanılır. İlişkisel veritabanlarının çoğu, veri + indekslerinin çoğunun RAM'e sığdığı SSD'lerden biten 1-3MM sıraya kadar olan tablolar için idealdir. Durumunuz bundan daha büyükse, her ilişkisel veritabanında sorunlar olacaktır.

Evet, harika bir DBA 100MM + satırlı tabloları Oracle veya SQL * Server'da yapabilir. Bunu okuyorsanız, personel üzerinde harika bir DBA'nız yoktur.

Tüm bunlar, iyi bir ORM'nin nesne grafikleri oluşturmaktan daha fazlasını yaptığını - ayrıca veritabanınızın gözle görülür bir tanımını sağladığını söyledi. Bunu, geçici sorgular oluşturmaya ve nesne grafiğini oluşturmadan DBI'da yaptığınız gibi tüketmenize yardımcı olması için kullanabilirsiniz.


Gördüğüm hemen hemen her şey raporlar yazıyor, bu yüzden muhtemelen insanlar manuel sorgulara düşmek zorunda (ve bu acı).
brian d foy

1
Raporlar için neden manuel sorgulara gitmeniz gerektiğini anlamıyorum. DBIC kullanarak oldukça karmaşık raporlar oluşturdum. Tabii ki, genellikle 'önceden getirme' ve 'katılma' gibi yoğun bir şekilde kullanılan devasa bir özelleştirilmiş sonuç kümesi oluşturmayı içerir.
Dave Cross

Dave: Manuel SQL yazmak çok daha kolay olabilir ve sadece ihtiyacınız olan yedi alanı üç tablodan alıp tek bir satırda temsil ettiğinizden emin olabilirsiniz. Ayrıca, ham SQL yazarken ipuçları sağlamak çok daha kolay.
Curtis Poe

> Yalnızca ihtiyacınız olan yedi alanı çektiğinizden emin olmak için Evet, ResultSet aramaları için kullanılan "sütunlar" seçeneği burada kullanılır. Ham SQL yapmak için duyduğum veya gördüğüm tek geçerli argümanlar şunlardır: 1. Genellikle kötü tasarlanmış bir tablonun / DB'nin ürünü olan oldukça karmaşık alt sorgular 2. DBIC'nin çalışmadığı DDL veya diğer 'do' işlemlerini çalıştırma gerçekten için tasarlanmadı. 3. Dizin ipuçlarını kırmaya çalışmak. Yine, bu daha çok RDBMS'nin bir zayıflığıdır, ancak bazen yapılması gerekir. Ve bu tür işlevleri DBIC'ye eklemek mümkündür.
Brendan Byrd

8

Interchange6 e-ticaret platformunun (ve birincil şema testere) temel geliştiricilerinden biri olarak DBIC ile oldukça derin deneyime sahibim. İşte onu harika bir platform yapan şeylerden bazıları:

  • Sorgu üreteci birçok veritabanı motoru (ve her birinin birden çok sürümü) için bir kez yazmanıza izin verir. Şu anda Interchange6'yı MySQL, PostgreSQL ve SQLite ile destekliyoruz ve zaman ve kaynakları aldıktan sonra daha fazla motor için destek ekleyeceğiz. Projenin tamamında, motorlar arasındaki farkları karşılamak için ek kod içeren şu anda sadece iki kod yolu vardır ve bunun nedeni ya belirli bir veritabanı işlevinin olmamasıdır (SQLite'nin yerinde olmaması) ya da değişen MySQL'in aptallığıdır. LEAST işlevinin iki küçük sürüm arasındaki NULL'ları işleme biçimi.

  • Önceden tanımlanmış sorgular, uygulama kodundan (argümanlarla veya argümanlar olmadan) çağrılabilecek basit yöntemler oluşturabileceğim anlamına geliyor, bu yüzden sorgularımı uygulama kodumu çöplemek yerine çoğunlukla şema tanımının içinde tutuyorum.

  • Birleştirilebilir sorgu oluşturma, sorguların küçük, anlaşılabilir, önceden tanımlanmış sorgulara bölünmesine ve daha sonra, tek bir adımda oluşturulduklarında DBIC'de (saf SQL'de daha da kötüsü) uzun vadede tutulması zor olan karmaşık sorgular oluşturmak için birlikte zincirlenmesine olanak tanır.

  • Şema :: Loader, DBIC'yi eski bir uygulama ile kullanmamıza izin verdi ve yeni bir kullanım ömrü ve geleceğe çok daha basit bir yol verdi.

  • DBIC eklentileri olan DeploymentHandler & Migration, hayatımı basitleştiren araç setine son derece katkıda bulunuyor.

DBIC ve diğer ORM / ORM benzeri platformlar arasındaki büyük farklılıklardan biri, sizi bir şeyler yapma yolunda size rehberlik etmeye çalışmasına rağmen, sevdiğiniz herhangi bir şeyi yapmanıza da engel olmamasıdır:

  • DBIC'nin bilmediği SQL işlevlerini ve saklı yordamları yalnızca işlev adını sorguda bir anahtar olarak sağlayarak kullanabilirsiniz (MySQL ^^ içinde LEAST kullanmaya çalıştığınızda da eğlenceye neden olabilir, ancak bu DBIC'in hatası değildir) .

  • Değişmez SQL, bir şey yapmak için 'DBIC yolu' olmadığında kullanılabilir ve döndürülen sonuç hala erişimcilerle birlikte güzel sınıflara sarılır.

TL; DR Muhtemelen sadece birkaç tablo ile gerçekten basit uygulamalar için kullanmak için rahatsız etmem, ancak özellikle karmaşık motor uyumluluğu ve uzun vadeli bakımın önemli olduğu daha karmaşık bir şeyi yönetmem gerektiğinde, DBIC genellikle benim tercih ettiğim yol.


7

(Başlamadan önce bu sadece DBIC, DBI ve Mojo tabanlı DBI sarmalayıcıları karşılaştırır söylemeliyim. Diğer Perl ORM ile deneyimim yok ve bu yüzden doğrudan onlara yorum yapmayacağım).

DBIC birçok şeyi çok iyi yapar. Ben ağır bir kullanıcı değilim, ama teoriyi biliyorum. SQL üretimi ve özellikle (söylendi gibi) katıldı vb işlemek oldukça güzel bir iş yapar. Ayrıca oldukça güzel ilgili diğer verilerin önceden getirme yapabilirsiniz.

Gördüğüm en büyük avantaj, sonuçları doğrudan model sınıfınız olarak kullanma yeteneğidir. Bu, aksi takdirde "sonuç kümesi yöntemleri ekleme" olarak bilinir; burada sonuçlarınızı ve çağrı yöntemlerinizi bu sonuçlardan alabilirsiniz. Yaygın örnek, DBIC'den bir kullanıcı nesnesi getirilmesi ve ardından parolalarının geçerli olup olmadığını kontrol etmek için bir yöntem çağırmasıdır.

Emin şema dağıtımı zor olabilir, ancak her zaman zordur. DBIC, kendi şemalarınızı elle yönetmekten daha kolay ve muhtemelen daha kolay hale getiren araçlara (bazıları harici modüllerde) sahiptir.

Madalyonun diğer tarafında, mojo aromalı DBI sarmalayıcıları gibi diğer hassasiyetlere hitap eden başka araçlar da var. Bunlar yalın ve yine de kullanılabilir olma cazibesine sahiptir. Çoğu da Mojo :: Pg'den (orijinal) bir ipucu aldı ve düz dosyalarda şema yönetimi ve pubsub entegrasyonu gibi kullanışlı özellikler ekledi.

Bu Mojo aromalı modüller, DBIC'nin bir diğer zayıf noktasından ortaya çıkmıştır, bu da (henüz) asenkron sorgular yapamayacağıdır. Yazarlar, teknik olarak belki de hızlı bir şekilde mümkün olabileceğinden emin oldular, ancak uygun olacak bir api tasarlarken sorunlar var. (Kuşkusuz bu konuda yardım etmem bile istenmişti ve ben buna rağmen, ona ayırmam gereken zamanda iğneyi nasıl hareket ettireceğimi bilmiyorum).

TL; DR, SQL'i sevmediğiniz veya asenkronize ihtiyacınız olmadığı sürece DBIC'yi kullanır; bu durumda Mojo aromalı DBI sarmalayıcılarını araştırın.


6

Bu konudaki düşüncelerimi üç yıl önce DBIC vs DBI'de yazdım . Özetlemek gerekirse, iki ana neden listeledim:

  1. DBIC, yazdığım herhangi bir uygulama için gerekli olan tüm önemsiz SQL'leri düşünmek zorunda olmadığım anlamına gelir.
  2. DBIC bana aptal veri yapıları yerine veritabanından nesneleri geri verir. Bu, oynamak için tüm standart OO iyiliğine sahip olduğum anlamına gelir. Özellikle DBIC nesnelerime yöntemler ekleyebilmeyi gerçekten yararlı buluyorum.

Anti-desenlere gelince, aklıma gelen tek şey performans. Gerçekten her saat döngüsünü CPU'nuzdan sıkmak istiyorsanız, belki de DBIC iş için doğru araç değildir. Ancak, kesinlikle yazılan uygulamalar için, bu vakalar giderek daha nadirdir. Son kez bir veritabanıyla konuşan ve DBIC kullanmayan yeni bir uygulama yazdığımı hatırlamıyorum. Tabii ki, DBIC'nin oluşturduğu sorguları ayarlamayı biraz biliyorsanız , yardımcı olur .


2
Ha, yazım hatalarını düzeltemiyorum çünkü yeterince karakter değiştirmiyorum ("righ ttool"). Merakla topal. Ama bu beni şaşırtan bir cevap. Sanırım PerlHacks gönderisinde Rob'un işaret ettiği bir şeye hitap ediyorsun, ama diğerini düşünmüyorsun. Birçok durumda, insanların manuel SQL'e geri döndüğünü gördüm.
brian d foy

1

Ölçek yapma şeklim:

  1. DBI soket yapıcısını ve test yöntemlerini sağlayan bir sınıf oluşturun.

  2. bu sınıfı SQL sorgu sınıflarınıza (sql tablosu başına bir sınıf) türetebilir ve yapıcı zamanında soketi test edebilir.

  3. tablo adınızı ve birincil dizin sütun adlarınızı tutmak için sınıf kapsamındaki değişkenleri kullanın.

  4. SQL'de statik olarak tanımlamak yerine, tüm enterpolasyon tablosu adınızı ve birincil dizin sütununuzu bu değişkenlerden yazın.

  5. SADECE sql deyimini yazarken temel DBI yöntemi çiftleri (hazırlama ve yürütme) yapmanıza izin vermek için editör makrolarını kullanın.

Bunu yapabiliyorsanız, tüm gün DBI üzerine temiz API kodu yazabilirsiniz.

Bulabileceğiniz şey, sorgularınızın çoğunun birden çok tabloya taşınabilir olacağıdır. Bu noktada bir EXPORTER sınıfını kesip yapıştırabilir ve gerektiğinde tekrar serpebilirsiniz. Burada, tablo adının ve birincil dizin sütun adlarının sınıf kapsamındaki enterpolasyonu devreye girer.

Bu yaklaşımı, nispeten iyi performansa sahip yüzlerce DBI yöntemine ölçeklemek için kullandım. Ben denemek ve başka bir şekilde DBI kodu korumak istemem.

DBI ne zaman kullanılır: Her zaman.

Ama bunun senin asıl sorunun olduğunu düşünmüyorum. Asıl sorunuz şuydu: "Bu büyük bir PITA'ya benziyor, lütfen bana bunu yapmak zorunda olmadığımı söyle?"

Yapmazsın. Düzgün yerleştirin ve DBI kısmı çoğunlukla otomatik hale getirebilecek kadar yedeklenir.


Paylaşabileceğiniz açık kaynaklı bir projeniz ya da belki de her sınıfın bir örneğiyle github'a bir özünüz olabilir mi? Söylediğiniz fikirlerin ilginç olduğunu ve muhtemelen birçok insanın projesi için geçerli olacağını düşünüyorum, ancak bazı örneklerle devam etmek biraz daha kolay olurdu.
msouth

0

Ben bir Perl uzmanı değilim, ama çok kullanıyorum. Nasıl daha iyi yapacağımı bilmediğim veya bilmediğim birçok şey var; belgelere rağmen henüz anlayamadığım bazı şeyler.

DBI ile başlamaya meyilliyim çünkü "Oh, bu basit bir proje, bir ORM'nin şişkinliğine ihtiyacım yok ve kurulum ve Schema modülleriyle uğraşmak istemiyorum." Ama çok çabuk - neredeyse her seferinde - bu karar için kendimi çabucak lanetlemeye başlıyorum. SQL sorgularımda (yalnızca karşılaştırma yer tutucuları değil, dinamik sorgular) yaratıcı olmaya başlamak istediğimde DBI kullanarak aklı korumak için mücadele ediyorum. SQL :: Abstract çok yardımcı oluyor ve bu muhtemelen benim için yeterli. Ama bir sonraki zihinsel mücadelem, kodumun içinde çok fazla SQL korumak. Çirkin heredocların içinde gömülü SQL hatları ve hatları olması benim için çok rahatsız edici. Belki de kaliteli bir IDE kullanmalıyım.

Sonunda, daha fazla kez, düz DBI ile sopa. Ama daha iyi bir yol olmasını diliyorum. DBIx :: Class'ın gerçekten düzgün özellikleri var ve birkaç kez kullandım, ancak en büyük projeler hariç tüm bunlar için aşırıya kaçmış gibi görünüyor. Hangi yönetmek için daha hantal bulmak bile emin değilim: dağınık SQL ile DBI veya dağınık Schema modülleri ile DBIC.

(Ah, kısıtlamalar ve tetikleyiciler gibi şeyler DBIC için benim için büyük bir artı.)


4
Bu cevap çok iyi gelmiyor - DBIx kullanırken sorunlarınız var, ama neden bu sorunlarınız var? DBI esnek değil, DB ile çok sıkı bir şekilde eşleştirilmiş değil mi, ölçeklenebilir değil mi?
Jay Elston
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.