ORM
Nesne-İlişkisel Eşleme
Kısaca
ORM, veritabanı tablolarını programlama dilinizdeki nesnelere eşleyen ve ham SQL yerine kodla veri okuyup yazmanızı sağlayan bir kütüphanedir.
ORM nedir?
Nesne-ilişkisel eşleme (object-relational mapping) anlamına gelen ORM, iki farklı dünya arasında köprü kurar: uygulama kodunuzun kullandığı nesneler ve sınıflar ile ilişkisel bir veritabanının kullandığı tablolar ve satırlar. Bir ORM ile users tablosundaki bir satır bir User nesnesi olur ve bu nesneyi kaydetmek değişikliği veritabanına geri yazar.
Arka planda ORM sizin için SQL üretir. Tablolarınızı tarif eden modeller tanımlar, sonra find, create ya da update gibi metotları çağırırsınız; ORM bu çağrıları SQL sorgularına çevirir, çalıştırır ve sonuçları yeniden nesnelere dönüştürür. Çoğu ORM ayrıca şema geçişlerini (migration), tablolar arasındaki ilişkileri ve SQL injection'a karşı koruyan parametreli sorguları da yönetir.
Popüler ORM'ler arasında Java için Hibernate, .NET için Entity Framework, Python için Django ORM ve SQLAlchemy, Ruby on Rails için Active Record ve TypeScript için Prisma, Drizzle ve TypeORM bulunur. ORM'i bir tercüman gibi düşünebilirsiniz: siz programlama dilinizi konuşursunuz, o da veritabanı için SQL'e çevirir.
ORM'ler zaman kazandırır ve tekrarlayan kodu azaltır, ancak hangi sorguların gerçekten çalıştığını gizleyebilirler. Yaygın bir tuzak N+1 sorgu sorunudur: bir liste yüklenip ardından her öğenin ilişkili kayıtları yüklendiğinde, tek bir birleştirilmiş sorgu yerine öğe başına bir sorgu çalışır. Birçok ekip günlük işlemler için ORM kullanır; karmaşık ya da performansın kritik olduğu sorgular için ham SQL yazar veya daha hafif bir sorgu oluşturucu (query builder) kullanır.
Bir bakışta
Önemli noktalar
- ORM, veritabanı tablolarını sınıflara, satırları nesnelere eşler.
- Sizin için SQL üretir; böylece programlama dilinizde çalışırsınız.
- Çoğu ORM ilişkileri, migration'ları ve parametreli sorguları yönetir.
- N+1 sorgu sorunu gibi gizli verimsizliklere dikkat edin.
Örnek
// Insert a row without writing SQL by hand
const user = await prisma.user.create({
data: { name: "Ada", email: "ada@example.com" },
});
// Roughly equivalent to:
// SELECT * FROM "User" WHERE email LIKE '%@example.com' ORDER BY name;
const users = await prisma.user.findMany({
where: { email: { endsWith: "@example.com" } },
orderBy: { name: "asc" },
});Sık sorulan sorular
ORM mi yoksa ham SQL mi kullanmalıyım?
Günlük oluşturma, okuma, güncelleme ve silme işlemleri için ORM genellikle iyi bir varsayılandır; çünkü yazması daha hızlı ve daha güvenlidir. Karmaşık raporlar ya da performansın kritik olduğu sorgular için ham SQL çoğu zaman daha iyidir ve birçok proje ikisini birlikte kullanır.
ORM, SQL injection'ı önler mi?
ORM'ler varsayılan olarak parametreli sorgular kullanır; bu da SQL injection'ların çoğuna karşı koruma sağlar. Kullanıcı girdisini ORM'in ham SQL özelliklerine parametresiz eklerseniz yine de savunmasız kalabilirsiniz.
N+1 sorgu sorunu nedir?
Kod, bir kayıt listesini yüklemek için bir sorgu, ardından her kaydın ilişkili verisi için ayrıca birer sorgu çalıştırdığında ortaya çıkar. Çoğu ORM bunu, ilişkili veriyi baştan bir ya da iki sorguyla getiren eager loading ile çözer.
İlgili sayfalar
- VeritabanıVeritabanları, s. 37Veritabanı, bilgisayarda düzenli biçimde saklanan ve uygulamaların verimlice kaydedip arayıp güncelleyebildiği, bir yazılımla yönetilen veri topluluğudur.
- SQLVeritabanları, s. 29SQL, ilişkisel veritabanlarıyla çalışmanın standart dilidir; tablo oluşturmak ve içindeki veriyi eklemek, sorgulamak, güncellemek ve silmek için kullanılır.
- OOPProgramlamanın Temelleri, s. 41OOP, yani nesne yönelimli programlama, kodu ilişkili verileri onlar üzerinde işlem yapan fonksiyonlarla birleştiren nesneler etrafında düzenleme yöntemidir.
- SQL InjectionGüvenlik, s. 39SQL injection, kullanıcı girdisinin veritabanı sorgusunun parçası sayıldığı ve saldırganın erişmemesi gereken verileri okuyup değiştirebildiği saldırıdır.
- FrameworkProgramlamanın Temelleri, s. 22Framework, bir uygulamanın yapısını sağlayan, yeniden kullanılabilir kod, araç ve kural temelidir; geliştiriciler yalnızca kendi mantıklarını doldurur.
- Veritabanı Migration'ıVeritabanları, s. 39Veritabanı migration'ı, bir sütun eklemek gibi veritabanı şemasını değiştiren sürümlü bir betiktir; her ortam aynı değişiklikleri aynı sırayla uygular.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin