İlişkisel veritabanları neden yalnızca SQL sorgularını kabul eder?


15

Bildiğim kadarıyla, ilişkisel veritabanlarının çoğu, querySQL dizesini bağımsız değişken olarak alan bir işlev dışında, sorgular için herhangi bir sürücü düzeyinde API sunmaz .

Birinin yapabilmesi ne kadar kolay olurdu diye düşünüyorum:

var result = mysql.select('article', {id: 3})

Birleştirilmiş tablolar için, biraz daha karmaşık ama yine de mümkün olacaktır. Örneğin:

var tables = mysql.join({tables: ['article', 'category'], on: 'categoryID'});
mysql.select(tables, {'article.id': 3}, ['article.title', 'article.body', 'category.categoryID'])

Temiz kod, dize ayrıştırma yükü yok, enjeksiyon problemi yok, sorgu elemanlarının daha kolay yeniden kullanılması ... Bir çok avantaj görüyorum.

Yalnızca SQL aracılığıyla sorgulara erişim sağlamak için seçilmesinin belirli bir nedeni var mı?


14
Bir ORM'nin henüz sağlamadığı ilk örneğiniz ne yapar?
Robert Harvey

4
Herkesin yaptığı tek şey basit sorgular olsaydı yolunuz iyi çalışır.
Blrfl

5
@RobertHarvey Hiçbir şey. Ancak SQL'e dönüştürülmesi gerekiyor. Sorum şu: Veri işleme işlemlerine neden sürücü düzeyinde erişemiyoruz.
lortabac

20
Bana göre bu, ekmek kızartma makinelerinin neden Dondurma kabul etmediğini sormak gibidir.
HLGEM

2
Birisi ne düşündüğünüzü zaten düşündü ve bir adım daha ileri götürdü ve böylece ORM'ler doğdu.
Muffin Man

Yanıtlar:


33

Veritabanları işlem dışı - genellikle farklı bir sunucuda çalışırlar. Bu nedenle, bir API'niz olsa bile, sorgunuzu ve tüm projeksiyonlarını, filtrelerini, gruplarını, alt sorgularını, ifadelerini, birleştirmelerini, toplama işlevlerini vb. Temsil eden tel üzerinden bir şey göndermeniz gerekir. özel biçim, ancak denenmiş, test edilmiş ve desteklenmiş olduğu için SQL de olabilir.

Bu günlerde SQL komutlarını kendiniz oluşturmak daha az yaygındır - birçok kişi bir çeşit ORM kullanır. Bunlar sonuçta SQL deyimlerine dönüşse de, peşinde olduğunuz API'yi sağlayabilirler.


17
SQL komutlarını elle oluşturma konusunda katılmıyorum. ORM çok basit veri modelleri için iyidir. Önemsiz olan her şeyi kendi SQL katmanınızı yazıyorsunuz.
Martin York

2
Ben şeytanlar savunucusu oynayacağım ve herhangi bir makul ORM bir uygulamanın ihtiyaçlarını karşılamak için yapılandırılabilir olması gerektiğini unutmayın.
bunglestink

7
@LokiAstari: Doğru, ancak önemsiz CRUD şeyler uygulamanızın% 80'ini veya daha fazlasını oluşturabilir.
Robert Harvey

@Zaman, mükemmel bir nokta. Aslında, soruda önerilen varsayımsal sözdizimi JSON'a çok benziyor.
John M Gant

JSON bir dil değil, bir veri kapsülleme ve aktarma biçimidir.
Craig

35

Çünkü SQL ortak bir API sağlar. SQL yayan ve istediğiniz API'yi ortaya çıkaran ANSI 92 SQL uyumlu bir sürücü yazabilirsiniz. Özel bir bonus olarak, yeniden yazmadan neredeyse tüm SQL veritabanlarıyla çalışacaktır.

Bu şekilde yapıldıysa, her SQL veritabanının farklı bir API'si olur. Tabii ki, hepimiz API'nizde standardize olmadıkça. Ama sonra tekrar SQL'e sahip olurduk, az çok değil mi? Bunun dışında API'nız programlama diline özgü görünmektedir, ancak SQL değildir.


7

Veritabanında yönetimsel amaçlarla yapılacak daha çok şey vardır, bu nedenle kullanıcı eklemek, yedekleri çalıştırmak, veri yüklemek, şemayı değiştirmek vb. İçin metin yazabilmek ve gönderebilmek önemlidir. Çoğu DBA, bunu başka bir programlama dilinde yapmak istemez.

DBA'lar SQL'de beklemek istiyorsa, başka bir dile sahip olmanız gerekir, veritabanı her ikisini de işleme yükü olacaktır.

Veritabanlarında birçok yeni özellik var, bu yüzden durduklarını sanmıyorum. Onlar sadece bir nedenden ötürü önerdiklerini yapmıyorlar.

SQL Server, SQL CLR ile içeriden .NET kodunu yürütebilir. Bu, ilişkisel bir modele uymayan, ancak performansı korumak isteyen bazı görevler için yararlıdır. Aradığın şeyin bu olmadığını anlıyorum. Veritabanlarının yaptığı birçok şeye bir örnek.

Yakında hiç gitmeyecek. Piyasaya çıkacak en yeni veritabanlarından biri NuoDB . SQL'i tuttular, sunucu dağıtma ve bir bulutta çalıştırma yeteneği eklerken ACID sağlıyorlar. Neden SQL'in devamını teşvik etmek için tüm bu sorunlara gittiklerini incelemek isteyebilirsiniz (Tek nedeni değil, ama büyük bir satış noktası.).


SQL Server'daki .NET kodu aslında veritabanı motoru içinde çalışmaz. Sunucudaki bir derleme için derlenmiş .NET kodudur ve saklı yordamlar veritabanı sunucusunun nasıl çağıracağını bildiği statik sınıf yöntemleri ile ilişkilendirilir. Yöntemler bir veri sağlayıcısı kullanır ve veritabanına diğer .NET kodları gibi bağlantı kurar. Java saklı yordamlarını destekleyen veritabanları (Oracle, Sybase) ile benzer bir durum var. Öte yandan SQL, veritabanının "yerel arabirimi" dir, çoğu veritabanı ürününde benzerdir ve aslında doğrudan veritabanında ayrıştırılır ve yürütülür.
Craig

@Craig - Mükemmel nokta.
JeffO

3

SQL DBMS, başka bir API sağlamadığından, yerel dil ve birçoğu aracılığıyla mağazaya önemli ölçüde optimize edilmiş erişim sağlar.

Veritabanının işlem dışı olduğu gözlemi bazı durumlarda geçerli değildir ve gerçekten doğrudan ilgili değildir.

SQL DML'nin kullanılmasını gerektiren veritabanları bile, genellikle bir sonuç kümesine yineleyici erişimi sağlamak için bir imleç kitaplığı sağlar ve iyi bilinen Microsoft Access ve Btrieve SQL DBMS'nin her ikisi de bir mekanizma olarak veritabanındaki tek tek tablolara doğrudan kayıt arabirimi sağlar belirli koşullar altında çok yüksek performans erişimi için.

Belirtildiği gibi, böyle bir sözdizimini kullanan karmaşık sorgular, 70'lerin sonlarından itibaren ağ veritabanlarının davranışını yeniden üretecektir.

Alternatif erişim mekanizmaları, alışık olmamaları nedeniyle genel kullanıcılar için daha az caziptir, ancak NoSQL veritabanlarının popülaritesindeki artış, belirli performans kazançları elde etmek için diğer API'lara olan ilgiyi artırabilir. Böyle bir yaklaşımı önerecek çok az şey var.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.