Yazıları ve yorumları almak istediğim bir blog oluşturduğumu varsayalım. Bu yüzden iki tablo, 'autocrementing integer' id 'sütununa sahip bir' posts 'tablosu ve yabancı bir' post_id 'anahtarına sahip' comments 'tablosu oluşturuyorum.
Sonra muhtemelen en yaygın sorgumun ne olacağını çalıştırmak istiyorum. Bu, bir yayını ve tüm yorumlarını almaktır. İlişkisel veritabanlarında oldukça yeniyken, bana en açık görünen yaklaşım, şuna benzer bir sorgu yazmaktır:
SELECT id, content, (SELECT * FROM comments WHERE post_id = 7) AS comments
FROM posts
WHERE id = 7
Bu da bana istediğim gönderinin kimliğini ve içeriğini, bir dizi içinde düzgünce paketlenmiş tüm ilgili yorum satırlarıyla (JSON'da kullanacağınız gibi iç içe bir gösterim) verirdi. Elbette, SQL ve ilişkisel veritabanları bu şekilde çalışmaz ve elde edebildikleri en yakın şey, 'gönderiler' ve 'yorumlar' arasında bir çok gereksiz veri çoğaltması getirecek bir katılım yapmaktır (aynı gönderi bilgisi tekrarlanırken) Her satırda), işlem süresi, hepsini bir araya getirmek için veritabanına hem de ORM'ime hepsini çözümlemek ve geri almak için harcanan anlamına gelir.
ORM’ye gönderinin yorumlarını hevesle yüklemesini söylesem bile, en iyisi gönderinin bir sorgusunu, ardından da tüm yorumları almak için ikinci bir sorguyu gönderip sonra bunları istemci tarafı koymaktır. ayrıca yetersiz.
İlişkisel veritabanlarının kanıtlanmış teknoloji olduğunu (cehennem, benden daha yaşlı olduklarını) ve on yıllardır kendilerine bir ton araştırma yaptıklarını ve bunların gerçekten iyi bir neden olduğunu biliyorum (ve SQL standardı) yaptıkları gibi çalışacak şekilde tasarlanmıştır, ancak yukarıda ana hatları çizdiğim yaklaşımın neden mümkün olmadığından emin değilim. Kayıtlar arasındaki en temel ilişkilerden birini uygulamanın en basit ve açık yolu bana geliyor. İlişkisel veritabanları neden böyle bir şey önermiyor?
(Feragatname: Çoğunlukla Rails ve NoSQL veri depolarını kullanarak webapps yazarım, ancak son zamanlarda Postgres'i deniyorum ve aslında çok hoşuma gidiyor. İlişkisel veritabanlarına saldırmak istemiyorum, sadece şaşırdım.)
Bir Rails uygulamasını nasıl optimize edeceğimi ya da belirli bir veritabanında bu problemi nasıl çözeceğimi sormuyorum. Neden SQL standardı bana karşı mantıklı ve savurgan göründüğünde bu şekilde çalışıyor diye soruyorum. SQL’in özgün tasarımcılarının sonuçlarının böyle görünmesini istemelerinin bir nedeni olmalı.