Çok sayıda veritabanı soyutlama katmanına maruz kaldıktan sonra, verilere erişmek için kendi farklı paradigmalarını icat eden her kütüphanenin amacının ne olduğunu merak etmeye başlıyorum. Yeni bir DAL seçmek, tekrar tekrar yeni bir dil öğrenmek gibi geliyor, genellikle tek yapmak istediğim, katmanı kafamda zaten yazdığım bir SQL sorgusu çıkarmaya ikna etmek olduğunda.
Ve bu gerçeğin ardından okunabilirliğe bile dokunmadan:
# Exhibit A: A typical DAL
rows = db(db.ips_x_users.ip_addr == '127.0.0.1')
.inner_join(db.ips_x_users.user_id == db.users.id)
.select(order=(db.ips_x_users.last_seen, 'desc'), limit=10)
# Exhibit B: Another typical DAL
rows = db.ips_x_users
.join(db.users, on=db.ips_x_users.user_id == db.users.id)
.filter(db.ips_x_users.ip_addr == '127.0.0.1')
.select(sort=~db.ips_x_users, limit=10)
# Exhibit C: A hypothetical DAL based on standard SQL syntax
rows = db('''SELECT * FROM ips_x_users
INNER JOIN users ON
(ips_x_users.user_id = users.id)
WHERE ips_x_users.ip_addr = ip
ORDER BY last_seen DESC LIMIT 10''', ip='127.0.0.1')
Standart SQL sözdiziminde sorun nedir? Belirli bir amaç için yaratıldı ve bu amaca güzelce uyuyor. Belki de sadece benim, ama snippet C'yi ilk ikisinden çok daha kolay anlıyorum. Yeniden adlandırılan anahtar kelimeler ve sözdizimi hileleri sevimli, ancak IMO, hemen aşağı geldiğinde, kodlayıcı için satırları almayı daha kolay hale getirmiyor.
Bu muhtemelen uzun bir rant gibi görünüyordu, ama orada olduğunu burada bir gerçek soru. Her DAL, denenmiş ve doğru SQL'i ayrıştırmak yerine sorgular için yeni bir DSL icat ettiğinden, farklı sözdizimi kullanmanın yararları veya standart SQL sözdizimindeki eksiklerin orada olduğunu bilmemem gerekir. Birisi buraya baktığımı söyleyebilir mi?