EMZETT.
Giriş yap

ORM ve veri tabanı erişimi: SQL yerine nesneler – artıları ve eksileri

Kısaca: Bir ORM, veri tabanı tablolarını nesnelere eşler; böylece verileri SQL yerine kodla sorgularsın. Bu yazmaktan tasarruf sağlar ancak performansa ve anlamaya mal olabilir.

Biraz daha ayrıntılı: ORM, nesne-ilişkisel eşleme (object-relational mapping) anlamına gelir: tablolar sınıf, satırlar nesne, sütunlar özellik olur. Örnekler: Hibernate/JPA (Java), Entity Framework (C#), SQLAlchemy ve Django ORM (Python), Prisma, Drizzle, TypeORM (JavaScript/TypeScript), ActiveRecord (Ruby), Eloquent (PHP).

Ayrıntılı

Örnek

// Drizzle (TypeScript)
const active = await db
  .select()
  .from(users)
  .where(and(eq(users.active, true), gt(users.age, 17)))
  .orderBy(users.name)
  .limit(10);

Araç bunu parametreli SQL’e (SQL enjeksiyonuna karşı koruma) dönüştürür, çalıştırır ve tiplenmiş nesneler döndürür. Şema migrasyonları ve ilişkiler (1:n, n:m) de desteklenir.

Avantajlar

  • Daha az şablon kod: satırların nesnelere elle eşlenmesi yok.
  • Düzenleyicide tür güvenliği ve otomatik tamamlama.
  • Güvenlik: varsayılan olarak parametreli sorgular.
  • Migrasyonlar, ilişkiler, doğrulama.
  • Veri tabanından bağımsız kod (sınırlar içinde).

Dezavantajlar ve tuzaklar

  • N+1 sorunu: her nesne için ek bir sorgu çalıştırılır (siparişler listesi ve müşteriler için ayrı ayrı birer sorgu). Çözüm: eager loading (JOIN, include, joinedload).
  • Düşüncesiz sorgular: tüm sütunlar yüklenir, bellekte devasa miktarlar.
  • Sızdıran soyutlama: karmaşık analizler, pencere işlevleri, özel işlevler zor ifade edilir; o zaman ham SQL.
  • SQL’e ek olarak ORM’in öğrenme eğrisi; performansı değerlendirmek için (dizinler, EXPLAIN) yine de SQL’i anlaman gerekir.
  • Sihir (tembel yükleme, örtük işlemler) şaşırtıcı davranışa yol açar.

ORM mi SQL mi?

Günlük CRUD işlemleri ve az sayıda karmaşık sorgu için ORM. Sorgu oluşturucular (Kysely, jOOQ, Knex) orta yoldur: SQL’e yakın ama tür güvenli. Raporlar, analizler, performans darboğazları için ham SQL. Üretilen SQL sorgularına bak (günlükleme), dizinleri ve migrasyonları bilinçli planla. SQL bilen ORM’leri daha iyi kullanır.

Ayrıca bak: N+1 sorunu, SQL enjeksiyonu, Veri tabanı migrasyonu, İşlemler ve ACID