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