Ana içeriğe geç

ORM

Nesne-İlişkisel Eşleme

Güncellendi 2 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/orm

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

Kod ile veritabanı arasında bir ORM: kod 42 numaralı kullanıcıyı bir User nesnesi olarak bulur, adını değiştirir ve save() çağırır; ORM bunu users tablosunda bir SQL UPDATE'e çevirir, orada nesne bir satırdır.kodunuzuser = User.find(42)user.name = "Ada"user.save()ORMnesneler ↔ satırlarusers tablosuidnameemail41"Linus"linus@…42"Ada"ada@…UPDATE users SET name = 'Ada' WHERE id = 42;sizin yerinize yazdığı SQL
Siz nesnelerle çalışırsınız, SQL'i ORM yazar. Ona gereğinden fazla sorgu yazdırmak kolaydır, N+1 sorgu sorununda olduğu gibi; bu yüzden ne gönderdiğine bakmakta fayda var.

Ö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

Bir ORM (Prisma) ile kayıt oluşturmak ve sorgulamaktypescript
// 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

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar