Dlaczego relacyjne bazy danych akceptują tylko zapytania SQL?

15

O ile mi wiadomo, większość relacyjnych baz danych nie oferuje interfejsu API na poziomie sterownika dla zapytań, z wyjątkiem queryfunkcji, która przyjmuje argument SQL jako argument.

Myślę, jak łatwiej byłoby, gdyby można było:

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

W przypadku połączonych tabel byłoby to nieco bardziej złożone, ale nadal możliwe. Na przykład:

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

Czystszy kod, brak narzutu parsowania łańcucha, żadnych problemów z wstrzykiwaniem, łatwiejsze ponowne użycie elementów zapytania ... Widzę wiele zalet.

Czy istnieje konkretny powód, dla którego wybrano opcję zapewniania dostępu do zapytań tylko za pomocą SQL?

lortabak
źródło
14
Co robi twój pierwszy przykład, którego ORM jeszcze nie zapewnia?
Robert Harvey
4
Twój sposób działałby dobrze, gdyby jedyną rzeczą, jaką ktokolwiek zrobił, były proste zapytania.
Blrfl
5
@RobertHarvey Nic. Ale musi zostać przekonwertowany na SQL. Chodzi o to, dlaczego nie możemy mieć dostępu na poziomie sterownika do operacji na danych.
lortabac
20
Dla mnie jest to jak pytanie, dlaczego tostery nie akceptują lodów.
HLGEM
2
Ktoś już pomyślał o tym, co myślisz i posunął się o krok dalej, dzięki czemu powstały ORM.
The Muffin Man

Odpowiedzi:

33

Bazy danych nie są przetwarzane - zwykle działają na innym serwerze. Więc nawet jeśli posiadasz interfejs API, musiałby przesłać przez drut coś, co reprezentuje twoje zapytanie i wszystkie jego projekcje, filtry, grupy, podzapytania, wyrażenia, złączenia, funkcje agregujące itp. Może to być XML, JSON lub inny Zastrzeżony format, ale równie dobrze może to być SQL, ponieważ jest wypróbowany, przetestowany i obsługiwany.

Obecnie rzadsze jest samodzielne tworzenie poleceń SQL - wiele osób korzysta z pewnego rodzaju ORM. Mimo że ostatecznie przekładają się one na instrukcje SQL, mogą dostarczyć interfejsu API, którego szukasz.

Tim
źródło
17
Nie zgadzam się na temat ręcznego budowania poleceń SQL. ORM są odpowiednie dla bardzo uproszczonych modeli danych. Cokolwiek poza trywialnością piszesz własną warstwę SQL.
Martin York
2
Będę grał w rzeczników diabła i zauważam, że jakakolwiek rozsądna ORM powinna być konfigurowalna, aby spełnić potrzeby aplikacji.
bunglestink
7
@LokiAstari: To prawda, ale trywialne CRUD mogą stanowić 80% lub więcej twojej aplikacji.
Robert Harvey
@Tim, doskonały punkt. W rzeczywistości hipotetyczna składnia zaproponowana w pytaniu wygląda bardzo podobnie do JSON.
John M Gant
JSON to format enkapsulacji i przesyłania danych, a nie język.
Craig,
35

Ponieważ SQL zapewnia wspólny interfejs API. Możesz napisać sterownik zgodny z ANSI 92 SQL, który emituje SQL i udostępnia pożądany interfejs API. Jako specjalny bonus, będzie działał z prawie każdą bazą danych SQL bez przepisywania.

Gdyby to było zrobione po swojemu, każda baza danych SQL miałaby inny interfejs API. O ile oczywiście nie wszyscy znormalizujemy interfejs API. Ale wtedy mielibyśmy SQL mniej więcej, prawda? Tyle że twój interfejs API wydaje się być specyficzny dla języka programowania, podczas gdy SQL nie.

Robert Harvey
źródło
7

Baza danych ma jeszcze wiele do zrobienia w celach administracyjnych, więc możliwość pisania skryptów i przesyłania tekstu w celu dodawania użytkowników, wykonywania kopii zapasowych, ładowania danych, zmiany schematu itp. Jest ważna. Większość DBA nie chce tego robić w jakimś innym języku programowania.

Jeśli DBA chce pozostać przy SQL, musisz mieć inny język, baza danych będzie obciążona przetwarzaniem obu.

W bazach danych jest wiele nowych funkcji, więc nie sądzę, aby się stagnowały. Po prostu nie robią tego, co proponujesz z jakiegoś powodu.

SQL Server ma możliwość wykonywania kodu .NET od wewnątrz poprzez SQL CLR. Jest to pomocne w przypadku niektórych zadań, które nie pasują do modelu relacyjnego, ale chcą zachować wydajność. Wiem, że nie tego szukasz. Jest to przykład wielu rzeczy, które robią bazy danych.

W najbliższym czasie nie zniknie. Jedną z najnowszych baz danych, które trafiły na rynek, jest NuoDB . Utrzymywali SQL, dostarczali ACID, dodając jednocześnie możliwość dystrybucji serwerów i uruchamiania ich w chmurze. Możesz zastanowić się, dlaczego zadali sobie tyle trudu, aby promować kontynuację SQL (nie jedyny powód, ale to ogromna zaleta).

JeffO
źródło
Kod .NET w SQL Server tak naprawdę nie działa w silniku bazy danych. Jest to kod .NET skompilowany do zestawu na serwerze, a procedurom przechowywanym są przypisywane metody klasy statycznej, które serwer bazy danych potrafi wywoływać. Metody wykorzystują dostawcę danych i nawiązują połączenie z bazą danych, jak każdy inny kod .NET. Podobna sytuacja występuje w przypadku baz danych (Oracle, Sybase), które obsługują procedury składowane Java. Z drugiej strony, SQL jest „rodzimym interfejsem” bazy danych, jest podobny we wszystkich produktach bazodanowych i jest faktycznie analizowany i wykonywany bezpośrednio w bazie danych.
Craig
@Craig - Doskonały punkt.
JeffO,
3

SQL DBMS zapewnia znacznie zoptymalizowany dostęp do sklepu za pośrednictwem języka ojczystego i wielu, jak zauważasz, że nie zapewnia żadnego innego API.

Obserwacja, że ​​baza danych jest poza procesem, nie ma zastosowania w wielu przypadkach i nie jest tak naprawdę bezpośrednio istotna.

Nawet bazy danych, które wymagają użycia SQL DML, często zapewniają bibliotekę kursorów, aby zapewnić iteratorowi dostęp do zestawu wyników, a dobrze znany program Microsoft Access i Btrieve SQL DBMS zapewniają bezpośredni interfejs zapisu poszczególnych tabel w bazie danych jako mechanizm dla bardzo wysokiej wydajności dostępu w określonych okolicznościach.

Jak wspomniano, złożone zapytania wykorzystujące taką składnię odtworzyłyby zachowanie sieciowych baz danych z późnych lat 70.

Alternatywne mechanizmy dostępu są mniej atrakcyjne dla użytkowników głównego nurtu ze względu na brak znajomości, ale wzrost popularności baz danych NoSQL może zwiększyć zainteresowanie innymi interfejsami API w celu osiągnięcia określonych przyrostów wydajności. Wydaje się, że nic innego nie zaleca takiego podejścia.

Pekka
źródło