ORM hâlâ bir anti-pattern mi?
(github.com/getlago)- ORM, “startup’lar için oyuncak” diye eleştirilse de, asıl mesele çoğu zaman ORM’nin kendisinden çok yanlış kullanım biçimine daha yakındır
- Nesne grafiği ile ilişkisel tablolar farklı modellerdir; bu yüzden paradigma uyumsuzluğu ortaya çıkar, ancak bu tek başına ORM’yi anti-pattern olarak görmek için yeterli değildir
- SRP ve SOC ihlali tartışmaları geçerlidir, ancak ORM zaten iki veri modelini birbirine bağlayan bir soyutlama olduğu için yalnızca ilke ihlali üzerinden değerlendirmek zordur
- Performans sorunları çoğu zaman ORM’den çok veriyi host dil mantığıyla birleştiren desenlerde ortaya çıkar ve ORM’nin SQL benzeri özellikleri ile azaltılabilir
- Lago’nun Active Record sorgularını ham SQL’e çevirmesindeki temel neden hızdan çok görünürlük ve debug edilebilirlik idi; büyük sorgularda ham SQL’e geçmek pratikte daha avantajlı olabilir
ORM eleştirisine bakışta temel tutum
- ORM sık sık “anti-pattern” diye hedef alınsa da, ORM’nin kendisinin kötü olduğu sonucu abartılıdır
- Diğer soyutlamalar gibi ORM de kusursuz değildir ve bir miktar görünürlük kaybı ile performans maliyeti yaratabilir
- Lago, Ruby on Rails’in ORM’si olan Active Record’a bağımlı olduğu sırada sorunlar yaşadı ve bunu ORM’ye bağımlılık biçimini yeniden gözden geçirmek için bir fırsat olarak kullandı
- Sonuç, ORM’yi tamamen bırakmak değil; onu artıları ve eksileri net olan bir soyutlama olarak ele almak yönündedir
Nesne modeli ile ilişkisel veritabanı arasındaki fark
- ORM’nin ele aldığı nesneler, diğer düğümlere işaret eden bir yönlü grafiğe daha yakındır
- İlişkisel veritabanı tabloları ise paylaşılan anahtarlar üzerinden verinin iki yönlü bağlandığı yönsüz bir grafiğe daha yakındır
- ORM bu yönsüz grafiği taklit edebilir, ancak yapılandırması ve davranışı her zaman basit değildir
UsernesnesindePostsdizisi eksik olabilirPostsdizisindeki varlıklar aynıUsernesnesine geri dönen bir referans taşımayabilir- Geri dönen bir referans olsa bile aynı nesne yerine onun kopyası olabilir
- Örneğin ORM, kullanıcının gönderilerini bir dizi olarak döndürürken her gönderide yazar rolündeki kullanıcıya geri referans eklemeyebilir
- Bu uyumsuzluk ORM’ye yönelik iyi bir akademik eleştiridir, ancak gerçek işletim ortamlarında daha büyük sorunlar somut kullanım biçimlerinde ortaya çıkar
SRP ve SOC tartışması
-
Tek Sorumluluk İlkesi (SRP)
- ORM’nin Tek Sorumluluk İlkesi (SRP) ’ni ihlal ettiği eleştirisi yapılır
- Çünkü tek bir sınıf ya da katmanın birden fazla rol üstlenmesine yol açabilir
- Veritabanı ve transaction yürütme
- Kayıtların temsili
- İlişki tanımları
- Migration oluşturma ve çalıştırma
- Ancak ORM’nin amacı zaten iki farklı veri paradigmasını birbirine bağlamak olduğu için, yalnızca bazı ilke ihlallerine bakarak ORM’yi reddetmek zordur
-
İlgi alanlarının ayrılması (SOC)
- ORM, İlgi alanlarının ayrılması (SOC) ilkesini de bulanıklaştırabilir
- SOC, altyapı bileşenlerinin tek bir ilgi alanına sahip olması gerektiğini söyleyen ilkedir
- ORM, veritabanı yönetimini backend tarafına taşıdığı için SOC ihlali olarak görülebilir
- Bununla birlikte günümüzde altyapı bileşenleri ve kodlama kalıpları, performans, gecikme ve kod düzeni için birden fazla rolü birleştirebilmektedir
- OLAP veritabanı içindeki CPU aggregator
- Edge backend-frontend
- Monorepo
Performans sorunu çoğu zaman ORM’den çok kullanım biçiminden kaynaklanır
- ORM’nin her zaman verimsiz olduğu eleştirisi genellikle yanlıştır
- Birçok ORM, geliştiricilerin düşündüğünden çok daha verimli çalışabilir
- Sorun, ORM’nin veriyi JavaScript veya Ruby gibi host dil mantığı ile birleştirmeyi kolaylaştırmasıdır
- TypeORM örneğinde, önce belirli bir şirkete ait yazarları çekip ardından her yazar için gönderileri yeniden sorgulamak ve her gönderiyi ayrı ayrı kaydetmek kötü bir desen olarak ele alınır
- Daha iyi yaklaşım, TypeORM’nin
createQueryBuilder()özelliğiyle tek bir update sorgusu oluşturmaktır - Lago’nun faturalandırma SQL refactor çalışmasında da Active Record ile ham SQL sürümü arasında performans farkı yoktu
- Active Record’un veri birleştirme özellikleri yoğun biçimde kullanıldığı için mevcut sorgular zaten optimize durumdaydı
- Ham SQL’e yeniden yazım, performans artışından çok görünürlük kazanmaya hizmet etti
ORM’nin gerçekten yavaşlayabildiği durumlar
- ORM, her zaman ham SQL kadar verimli değildir; bazı durumlarda kayda değer ölçüde verimsiz olabilir
- İlk sorun, ORM’nin sorgu sonucunu nesnelere dönüştürürken büyük bir hesaplama overhead’i yaratabilmesidir
- TypeORM bu probleme örnek olarak anılır
- İkinci sorun, bire-çok veya çoka-çok ilişkiler dolaşılırken veritabanına birçok gidiş-dönüş isteği gönderilmesidir
- Bu desen N+1 problemi olarak bilinir
- Başlangıçtaki 1 sorguya ek olarak N alt sorgu eklenir
- Prisma örneğinde kullanıcılar, gönderiler ve yorumlar iç içe sorgulanırken her yorum için yeni bir veritabanı isteği oluşabilir
- N+1, ORM’lerde sık görülür; ancak data loader kullanılırsa N+1 sorgu 2 sorguya indirilebilir
- ORM’nin yaygın sorunlarının önemli bir kısmı, ORM özellikleri yeterince kullanıldığında önlenebilir
Daha büyük sorun görünürlük ve debug etme
- ORM’nin en büyük zayıflığı görünürlüktür
- ORM aslında bir sorgu üreticisi olduğu için, bariz ham tip hataları gibi durumlar dışında son hata ileticisi değildir
- SQL hatası döndüğünde ORM bunu yorumlayıp kullanıcıya yeniden iletmek zorundadır
- Active Record bu noktada zorluk yaşadı ve Lago’nun faturalandırma abonelik sorgularını refactor etmesinin nedeni de buydu
- Beklenenden farklı bir sonuç çıktığında şu süreç tekrar tekrar yaşanıyordu
- Render edilmiş SQL sorgusunu incelemek
- O SQL’i yeniden çalıştırmak
- SQL hatasını Active Record değişikliklerine geri taşımak
- Bu ileri-geri süreç, SQL veritabanıyla doğrudan etkileşime girmemek için Active Record kullanma amacını zayıflatır
Pratik değerlendirme
- ORM doğru kullanıldığında ham SQL’e yakın verim sağlayabilir
- Sorunların çoğu, ORM’nin SQL benzeri özelliklerini kullanmak yerine host dilin mantıksal yapısına aşırı bağımlı olunduğunda ortaya çıkar
- Büyük sorgular geliştiricileri zorluyor ve debug etmeyi engelliyorsa, ham SQL sorgularına geçmek iyi bir yatırım olabilir
- Çoğu ORM, ORM içinden SQL sorgusu çalıştırma özelliği sunar
1 yorum
Hacker News görüşleri
Java’da Hibernate ilk çıktığından beri ORM kullanıyorum ama hep kötü buldum
“Başka bir veritabanına geçebilirsin” avantajı bugünden bakınca neredeyse saçmalık gibi geliyor; pratikte bunu kimse yapmıyor
“SQL bilmek gerekmiyor” sözü de yanlış; uzun ömürlü, trivial olmayan uygulamalarda eninde sonunda tek tek sorguları string düzeyinde elden ayarlamak gerekiyor
Veri katmanında doğru yaklaşımın sorguları tek tek string SQL olarak yazıp araya değer yerleştirmek olduğunu düşünüyorum; raw JDBC’ye ne kadar yakınsa o kadar iyi
ORM’nin “domain model”i desteklediği iddiası da kötü bir gerekçe; çünkü o domain model her zaman mantığı boş olan, anemic domain model haline geliyor
ORM, XML, annotation’lar ve üretilen SQL’i debug etmeye harcanan zamanı düşününce insanın ağlayası geliyor
Kolay kısımlar zaten kolay, o yüzden pek umurumda değil; asıl sorgular ölçekle çöküşe geçtiğinde ORM’nin kendisiyle boğuşmak yüzünden işin milyon kat zorlaştığı çok oldu
Query builder ORM ile tamamen aynı şey değil ama https://gajus.medium.com/stop-using-knex-js-and-earn-30-bf41... yazısını seviyorum ve Slonik türü teknolojilerin hayranıyım
Sonuçları nesnelere otomatik bağlama, güçlü tip denetimi gibi istediğim şeylerin %90’ını sağlıyor ama yine de doğrudan normal SQL yazmana izin veriyor
SQL’in gizemli biçimde zor bir dil olduğu fikrini de anlamıyorum. Eski ve kusurlu olabilir ama ORM araçlarının uydurduğu sorgu dilini öğrenmek yerine SQL öğrenmek daha iyi
O zamanlar bu eleştirileri dile getirince diğer geliştiriciler tepeden bakardı
Bugün de geliştirici olarak mecburen kullanmak zorunda kaldığımız araç ve teknikler arasında anti-pattern çok; sektörün talihsiz gerçeği de yaygın kullanılan araçların önemli bir kısmının kötü olması ve anti-pattern’leri teşvik etmesi
Teknoloji sektöründe karar gücünü elinde tutan, iyi bağlantılara sahip az sayıda geliştirici ve eski geliştirici var; ve bana kalırsa onlar pek iyi değiller
Artı-eksi dengesi makul olan ORM’ler de var; özellikle Python tarafında durum iyi
Django ORM kaba ve performansı çok iyi değil ama entegrasyonu güçlü, pratik, üretken ve kullanımı keyifli
Peewee, ORM’yi küçük bir paket halinde sunuyor; olağanüstü özelliklere ihtiyaç duymadığında ve uğraşmak istemediğinde küçük programları keyifle yazdırıyor
SQLAlchemy daha fazla yatırım istiyor ama çok esnek, temiz SQL üretiyor ve doğru çalışıyor
Nesne yönelimli paradigmayı istemeyip idiomatic SQL davranışını Python ile soyutlayarak ifade etmek isteyenler için daha düşük seviyeli query builder’ları da açığa çıkarıyor
Sonuçta mesele, her zamanki gibi yatırım getirisi hesabı olan bir mühendislik kararı
Bunu 10 yılı aşkın süredir yapıyorum ve Hibernate dokümantasyonunu 5 dakika okuyup o durumda önerilen şeyi yaptığımda çözemediğim tek bir sorgu olmadı
Sanki bütün geliştiricilerin üç değerli mantık tablolarını ve COBOL tarzı fonksiyon adlarını ezberlemesi gerektiğine inanan SQL fanboy’ları, konu Hibernate dokümanını okumaya gelince bu zahmete girmek istemiyor gibi görünüyor
ORM, OLTP workload içindir; OLAP için değil; bunu Hibernate’in kurucularından biri de söylemişti
Asıl faydası, uzun ve hata üretmeye açık INSERT/UPDATE sorgularını elle yazmak zorunda bırakmaması ve SQL satırlarını nesnelere otomatik eşleştirmesi
Raw yaklaşıma dönünce bunların önemli bir bölümünü yeniden uygulaman gerekir; dolayısıyla bu da sıfır toplamlı bir oyun değil
Yeterince karmaşık uygulamalarda, uygulamanın çeşitli bölümlerinin birlikte sorguları gecikmeli olarak birleştirebildiği bir query builder benzeri şey eninde sonunda ortaya çıkıyor
Bu, veriyi bellekte birleştirip filtreleyip sıralamak yerine sorgu olarak birleştiren bir yapı oluyor
ORM bunu kolaylaştıran bir araç ama farkında olmadan N+1 query üretmeyi de kolaylaştırıp insanın ayağına kurşun sıkmasına yol açabiliyor
Her araçta olduğu gibi gerçek kullanım senaryolarıyla birlikte ödünleşimleri değerlendirmek gerekiyor; SQL cümlesi string'lerini doğrudan manipüle etme yaklaşımını ise hiçbir durumda önermiyorum
Buna rağmen bu farkları yok sayıp ORM'nin iyi ya da kötü olduğunu mutlak biçimde söyleyen insanlar hep var
Bunu ilgi çekmek için takınılan tartışmacı bir tavır olarak görüp geçmek daha iyi; ben “ORM'nin faydaları var ama bunların nerede geçerli olduğunu bilmeli ve kullanım sorunlarının faydaları aşmasına izin vermemeliyiz” noktasından başlayan tartışmalara odaklanmak istiyorum
Veri gerekiyorsa veri erişim katmanına gidilir; o da gerekeni sağlamıyorsa yeni bir repository ya da provider gibi, desene uyan bir şey yapılır
İster ORM olsun ister elle yapılmış bir sorgu birleştirici, uygulama “yeterince karmaşık olduğu için buna ihtiyacımız var” yanılgısına düşecek hale geldiyse zaten güvenle kullanılmayacak kadar karmaşık hale gelmiştir
Sonunda builder'ı yanlış katmanda değerlendirmeye ya da sonuçları dolaşırken N+1 query ürettiğinizi kaçırmaya başlarsınız
ORM gerekli değil
LINQ tam olarak bir ORM değil; güçlü biçimde tiplenmiş LINQ ifadeleri yazdığınızda bunlar expression tree'ye dönüşüyor, ardından query provider bunu sorguya çeviriyor
Geliştirme sırasında model içinde ORM'nin okunabilirliğini tercih ediyorum ama gerektiğinde N+1 ve diğer verimsizlikleri yakından izleyip optimize ediyorum
“Gerektiğinde” sınırı net değil ama fazla erken optimizasyon yapmamaya çalışıyorum
Yeni projelerde genelde veritabanından başlıyorum; kod yazmadan önce factory, seeder ve raw SQL sorgularıyla veri modelinin hissini kavrıyorum
Laravel'in Eloquent gibi ORM'lerinde N+1'i çözmek ve lazy loading yapmak için iyi yöntemler var ama her zaman ödünleşimler bulunuyor
Gecikmeli sorgu birleştirmeye izin veren bir kütüphane yerine, sorguyu doğrudan yazıyorsunuz ve kütüphane derleme zamanında o sorgu için kod üretiyor
Örneğin
getUser: SELECT * FROM users WHERE id = ?gibi bir sorgu yazıncaGetUserQuerysınıfını vegetUser(id: String): GetUserQueryResultgibi bir metodu üretmesi gibi; bence bu model çok daha iyiORM'den hoşlanmamamın temel nedeni, modern SQL motorlarını abartılı biçimde aptal bir bit deposu gibi ele alma eğilimi
CTE, LATERAL join ve RETURNING clause işlemleri ciddi ölçüde basitleştirebilir ya da veri tutarsızlığı olasılığını ortadan kaldırabilirken, ORM'ler çoğunlukla temel tabloları ve view'ları önceden tanımlanmış nesnelere basitçe eşlemekle sınırlı kalıyor
ORM tabloyu da kendisi oluşturuyorsa daha da kötü oluyor
SQL özünde bir veri çıkarma aracı olmanın yanında bir dönüşüm dili de ama ORM bu yönü neredeyse tamamen görmezden geliyor; böylece pek çok geliştirici SQL'de INSERT/SELECT/UPDATE/DELETE dışında başka neler olduğunu hiç öğrenmiyor
Pivot table'lar, temporal query'ler, CUBE/ROLLUP, window function'lar, set-returning function'lar, materialized view'lar, external table'lar, JSON işleme, tarih işleme, exclusion constraint'ler, range·interval·domain gibi tipler, row-level security, MERGE ve daha fazlası var
Sanki elinizde tam donanımlı bir alet atölyesi varken biri size sadece bir çekiç, bir tornavida ve bir demir testeresi verip bunların yeterli olduğuna ikna etmeye çalışıyor; siz de birkaç metre ötede masa testeresi, router, zımpara makinesi ve kama seti olduğundan habersiz tüm kariyerinizi geçiriyorsunuz
ORM çoğu zaman insanı basit CRUD ifadeleri üzerinden düşünmeye yönlendiriyor ama bunun muhtemelen daha iyi olduğunu ve gelişmiş özelliklerin idareli kullanılması gerektiğini düşünüyorum
Yine de DB kullanmam gerekirse bilerek DB özelliklerinin çok küçük bir alt kümesini kullanmaya çalışırım
Çünkü “kod”u kontrol edebildiğim bir alan, “veritabanı”nı ise hataların sonradan yavaş entegrasyon testleri gibi yerlerde ortaya çıktığı, riskli ve dokunması zor bir alan olarak görüyorum
DB içinde gerçekleşen mantık düşük seviye test kapsamının dışında kaldığı için ürkütücü geliyor; muhtemelen
select-from-selectsorgusu bile yazmamAlet atölyesinin büyük kısmını memnuniyetle kullanmadan bırakırım
Temel veri bütünlüğü korumalarını yeniden icat etmek için zamanın çoğunu karmaşık dolambaçlı çözümler üretmeye harcadık
Kendi veritabanını yapmak öğrenmek için eğlenceli olabilir ama production uygulamalar için değil
ActiveRecord bana hep iyi hissettirdi
Bazı istisna durumlar var ama 80/20 noktasını iyi tutturuyor; gerekirse SQL'e kaçış imkânı veriyor ve alan mantığını düzenlemeyi sağlayan lifecycle hook'ları da harika ve anlaşılır
Her şeyi bir “bundle” arkasına saklamayan ya da kendi sorgu dilini dayatmayan pragmatik ORM'ler iyi
ORM sorununu tamamen “çözmeye” çalışan ORM'ler ise kullanımı zor olanlar
ORM böyle yapılmalı
Yalnız bunu doğru kullanmak için SQL hakkında iyi bir ön bilgi şart
İnsanlar SQL öğrenmeden AR'nin ürettiği sorguları ve sınırlarını anlamadığında sorun çıkıyor
Varsayım yanlış. ORM hiçbir zaman “zararlı bir fikir” olmadı
Birlikte çalışması korkunç ORM'ler var, ama bu tüm türün kötü bir fikir olduğu anlamına gelmez
SQLAlchemy yıllardır keyifle kullanıyorum çünkü SQL kavramının kendisini yeniden icat etmeye çalışmıyor
Bunun yerine sorguları oluşturup iletmek için kullanışlı bir katman sağlıyor ve küçük ayrıntıları düzgün ele alarak benim elle kurcalamamı gereksiz kılıyor
Son zamanlarda Rust öğrenirken basit CRUD işleri için gereken kalıp kodu elle yazmak acı verici ve zaman kaybı gibi geliyor
SQLAlchemy ORM daha karmaşık ya da optimize edilmeye çalışılan sorgularda biraz engel olabilir, ama böyle durumlarda her zaman doğrudan SQL'e inebilirsin
Her şeyde olduğu gibi, uygun olduğu durumlar ve olmadığı durumlar vardır; teknoloji kolayca aşırı ya da yanlış kullanılabilir
Örneğin .NET'teki Entity Framework gibi ORM'ler, özellikle database-first yaklaşımla çalışırken büyük bir avantaj olabilir
Yüzlerce tabloya ve doğru foreign key ilişkilerine sahip bir DB varsa, ORM karmaşık şemada gezinmeye yardımcı olur ve değişikliklerde derleme zamanında kontrol sağlar
Gömülü SQL performans avantajı gibi görünen iki ucu keskin bir kılıçtır, ama özellikle join'lerde hardcode edilmiş uzun SQL'i bakımda tutmak çok zordur
Burada 5-10 tabloyu değil, yüzlerce tabloyu kastediyorum
Kimseyi ikna etmeye çalışmıyorum, ama internette best practice diye okuduğun her şeye olduğu gibi inanmamak gerekir
İnsanlar tamamen farklı şeylerden söz ediyor olabilir ve hangi teknolojiyi kullanırsan kullan, kötü geliştiriciler her zaman vardır
ORM ya da başka bir DB arayüzü kullanmazsan, sonunda CRUD benzeri şeyler için kendin bir tane yazıp bakımını yapmak zorunda kalırsın
Ve bunun içinde garip bug'lar, edge case'ler ve güvenlik açıkları olma ihtimali yüksektir
SOLID gibi ilkelerin üniversitede yazılım tasarım ilkeleri olarak öğretilmesinde de sorun var
Akademide zaman, bakım kolaylığı, para ve emek gibi kısıtlar daha az önemli olduğu için mantıklı görünebilir, ama yeni mezun biri sektöre girince çok kötü bir çarpışma yaşanır
Çünkü bütün günü “mükemmel” çözümü arayarak oyalanmaya ve tekerleği yeniden icat etmeye alışmış olur
Bunu frenleyecek yeterli sayıda yetkin senior/lead geliştirici yoksa ortaya çok ilginç bir ürün, bütçe aşımı, büyük yangınlar ya da bunların bir kombinasyonu çıkar
Daha da kötüsü, akademide üretilip akademi için tasarlanan bir şeyin halka açılmasıdır
Bunun tipik iyi/kötü örneği OpenStack; CERN ve yüzlerce üniversitenin özel ortamlarını destekleyecek kadar çok düğmesi ve ayar noktası var ve bileşenleri delice modülerleştirilmiş, ama o kadar Bizans usulü ki başlamak neredeyse imkansız
ORM veritabanını zahmetsizce değiştirmez, ürettiği SQL'i öğrenip anlama ihtiyacını ortadan kaldırmaz ve şemayı pürüzsüz hale getirmez
Yine de kullanılmasının nedeni, zaten kopyalamak zorunda kalacağın standart bir soyutlama olmasıdır
DB erişiminde cache kullanmayı mümkün kılar; bunu elle yazılmış SQL ile yapmak ölçek büyüdükçe şaşırtıcı derecede zorlaşır
Beraberinde standart araçlar ve best practice'ler gelir; bu da N+1 gibi sorunları önemsiz hale getirebilir
ORM'nin asıl problemi yanlış beklentiler ve kötü ORM'lerdir
ORM'nin değerini anlamak istiyorsan, ORM'siz yazılmış bir projeyi aç ve herhangi bir şeyi değiştirmeyi dene
https://news.ycombinator.com/item?id=36498583 bağlantısına bak
Faydalı işler ilerlemedi ya da hızlı ve dağınık bir yaklaşıma göre 20-100 kat daha uzun sürdü
En kötüsü, yetkin bir HTML tasarımcı ekibinin fonksiyonel programlama öğrenmeye zorlandığı durumdu
Backend yapılandırma sihirbazı modern mühendisliğin ve zarif tasarımın bir harikasıydı, ama 10 kişinin 1 yılını aldı
VC parası insanları tuhaflaştırıyor
SQL dili çok karmaşık ve gerçekten düzgün, tam özellikli bir query builder yapmak hiç de önemsiz değil
Asıl ilişkisel eşleme kısmını bir kenara bıraksan bile durum böyle
SQL için durumun gerçekten de “lanet olası şeyi doğrudan kendin programla” olduğunu düşünüyorum
SQL ya da ORM kütüphanelerini öğrenmenin pek anlamı yok; SQL'i doğrudan öğrenip kullanmak daha iyi
Veritabanı erişimi muhtemelen kariyerin boyunca yapacağın temel işlerden biri olacak, bu yüzden gerçek tekniği doğrudan öğrenmek en iyisi
CSS de benzer; CSS kütüphanelerini öğrenmek yerine CSS'i öğrenip kullanmak gerekir
Aslında frontend geliştirmenin neredeyse her alanı için de bu geçerli; “form kütüphanesi” yerine tarayıcının form API'sini doğrudan kullanabilirsin
Bana göre SQL, herhangi bir ORM'den çok daha kolay öğrenildi
Yanlış şeyi öğrenmenin maliyetini boşa harcamamak gerekir
CSS için de aynı şey geçerli; CSS biliyorsan, kolaylık için bir kütüphane seçerken çok daha esnek olur ve onu daha iyi anlarsın
Mainframe, masaüstü, istemci/sunucu, web gibi pek çok geliştirme platformundan ve bunların üzerindeki çeşitli dillerden geçerken SQL her zaman ortak bağ oldu
Veri katmanını ve onun altında neler olup bittiğini iyi bilen geliştiricilerin daha güçlü geliştiriciler olduğuna tamamen katılıyorum
Eğer bir ORM'nin tuhaflıklarını öğrenmeye zaman harcayacaksan, neden o zamanı SQL öğrenmeye yatırmıyorsun sorusu klasik bir sorudur
SQL deneyiminin bileşik getirisi, 10-15 yıl sonra belirli bir platform ya da dilin ORM'sinden daha değerli olabilir
ORM öğrenmek ve kullanmak için nedenler var, ama sırf SQL öğrenmek istemediğin için ORM tarafına kaymamalısın
Ancak o zaman bu soyutlama için ne bedel ödediğini bilirsin. Tabii “sıfır maliyetli soyutlama” ise başka
Ama şimdi Go tipleriyle marshalling/unmarshalling yüzünden ORM sayılabilecek
azercrudkullanıyorumGo standart kütüphanesindeki
sqlfazla temel; nesne marshalling/unmarshalling işini fiilen kendin yazman gerekiyor ve bu gerçekten sıkıcıBugünlerde ORM kullanacak olsam, muhtemelen sadece bu amaçla kullanırdım
Dapper veya Diesel gibi “orta nokta” mikro ORM'leri seviyorum
Sorguları SQL ile yazıyorsun ama güçlü tipler ve sonuç kümesinin nesnelere otomatik eşlenmesini elde ediyorsun
Böylece hem üretkenliği hem de tam özellikli “gerçek” bir sorgu dilini birlikte alıyorsun
Ayrıca nesne eşleyicileri yalnızca salt-okunur sorgular için kullanma yaklaşımını da sevmeye başladım
Güncellemeler komut deseniyle, yani stored procedure'lerle yapılır ve bunlar native metotlarmış gibi eşlenebilir
Geliştiriciler SQL yokmuş gibi davranmayı bırakıp bunu kabullenmeli
Eloquent, bu angaryayı yeterince soyutlayarak mantığa odaklanmayı sağlıyor
Sadece diziler ve sorgulardan oluşan “eski” bir PHP uygulamasını modeller ve Eloquent kullanan bir yapıya yeniden yazıyorum; bu tam anlamıyla oyunun kurallarını değiştiriyor gibi hissettiriyor
Eskiden .NET üzerinde SQLite kullanırken ben de bu yönde bir wrapper kütüphanesi yazmıştım: https://github.com/zmj/sqlite-fast
Bu başlık, ORM'nin zihin payı üzerindeki hâkimiyetini iyi gösteriyor
Neredeyse bütün yorumlarda ORM'nin örtük alternatifi, uygulama kodunun içinde string literal olarak yazılmış raw SQL
Oysa daha 6 yıl önce SQL'i başlı başına bir dil olarak kullanıp sorguları uygulamada metot olarak sunan wrapper'lar üreten araçlar vardı
queryfirst, pgtyped, pugsql, sqlc gibi
Bu bir paradigma değişimiydi ya da en azından öyle olabilirdi ve açıkça daha üstün bir çalışma biçimi olduğu görülüyor, ama ORM ve hiç değişmeyen bu tartışma tüm oksijeni tüketip bunu kenarda bırakıyor
SQL bir dildir, hem de oldukça yüksek seviyeli bir dil
SQL'i daha düşük seviyeli bir dille birleştirmeye çalışmak, “elinde çekiç varsa her şey çivi gibi görünür” durumunun tipik örneği
Örneğin düşük seviyeli assembly ile kod yazıp büyük bir sistemle etkileşime giriyorsun ve bu sistemin dokümantasyonu girdinin yalnızca JavaScript ile ifade edilebildiğini söylüyor olsun; önünde seçenekler var
Her şeyi saf assembly ile bir araya getirmene yarayan karmaşık bir kütüphane alıp depoya
xxx.jsdosyası commit etmeyebilirsin ya da doğrudan.jsdosyasıyla yüksek seviyeli dilin gücünü kullanarak bunu ifade edebilirsinKullanılan SQL sorguları için tek bir doğruluk kaynağı oluşuyor ve gerçekten yazıp bakımını yaptığın şey sorguların kendisi olduğu için yeni indeksler oluşturmak gibi optimizasyonlar da kolaylaşıyor
Raw SQL string'leri üzerine soyutlama koymak çok faydalı, ama ilişkileri nesneymiş gibi göstermek karmaşık ve dolaşık bir yaklaşım
TopLink de muhtemelen öyleydi
Stored procedure'ler ile yerel entity'ler arasındaki eşlemeyi ele alış biçimi buydu