Чому реляційні бази даних приймають лише запити SQL?


15

Наскільки мені відомо, більшість реляційних баз даних не пропонують жодного API рівня драйверів для запитів, крім queryфункції, яка приймає рядок SQL як аргумент.

Я думаю, як простіше було б, якби можна було зробити:

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

Для з’єднаних таблиць це було б трохи складніше, але все ж можливо. Наприклад:

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

Чистіший код, відсутність синтаксичного розбору рядків, відсутні проблеми з ін'єкцією, легше повторне використання елементів запиту ... Я бачу багато переваг.

Чи є конкретна причина, чому було обрано лише надання доступу до запитів через SQL?


14
Що ваш перший приклад робить, що ORM вже не надає?
Роберт Харві

4
Ваш спосіб спрацював би чудово, якби єдине, що хтось коли-небудь робив, - це прості запити.
Blrfl

5
@RobertHarvey Нічого. Але його потрібно перетворити на SQL. Суть мого питання полягає в тому, чому ми не можемо отримати доступ на рівні драйверів до операцій маніпулювання даними.
lortabac

20
Для мене це як запитання, чому тостери не приймають морозиво.
HLGEM

2
Хтось уже подумав про те, що ви думаєте, і зробив це на крок далі, і таким чином ORM народилися.
Людина-булочка

Відповіді:


33

Бази даних закінчені - вони зазвичай працюють на іншому сервері. Тож навіть якщо у вас був API, йому потрібно було б надіслати щось через провід, який відображає ваш запит, і всі його проекції, фільтри, групи, підзапити, вирази, об'єднання, агрегатні функції тощо. Щось може бути XML або JSON чи деяким власний формат, але він може бути і SQL, оскільки це перевірено, протестовано та підтримується.

У ці дні рідше самостійно створювати команди SQL - багато людей використовують якусь ORM. Незважаючи на те, що вони в кінцевому підсумку переводяться на оператори SQL, вони можуть надавати API, який ви шукаєте.


17
Я не погоджуюся з побудовою команд SQL вручну. ORM чудово підходять для дуже спрощених моделей даних. Все, що виходить за межі тривіального, ви пишете власний шар SQL.
Мартін Йорк

2
Я зіграю захисника чортів і зауважу, ніж будь-який розумний ORM повинен бути налаштований для задоволення потреб програми.
bunglestink

7
@LokiAstari: Це правда, але дрібниці CRUD можуть становити 80% або більше вашої програми.
Роберт Харві

@Tim, відмінний момент. Насправді гіпотетичний синтаксис, запропонований у питанні, виглядає надзвичайно багато, як JSON.
Джон М Гант

JSON - формат інкапсуляції та передачі даних, а не мова.
Крейг

35

Оскільки SQL надає загальний API. Ви можете написати драйвер, сумісний з ANSI 92 SQL, який випромінює SQL та відкриває потрібний вам API. Як особливий бонус, він буде працювати майже з будь-якою базою даних SQL без перезапису.

Якби це було зроблено у ваш спосіб, кожна база даних SQL мала б інший API. Якщо, звичайно, ми всі не стандартизовані у вашому API. Але тоді ми знову мали б SQL, більш-менш, чи не так? За винятком того, що ваш API здається специфічним для мови програмування, тоді як SQL - не.


7

На базі даних є ще багато чого для адміністративних цілей, тому важлива можливість сценарію та подання тексту для додавання користувачів, запуску резервних копій, завантаження даних, зміни схеми тощо. Більшість DBA не хочуть робити це всередині якоїсь іншої мови програмування.

Якщо бажання DBA захотіти на SQL, ви повинні мати іншу мову, база даних буде тягарем обробки обох.

У базах даних є багато нових функцій, тому я не думаю, що вони застійні. Вони просто не роблять того, що ви пропонуєте чомусь.

SQL Server має можливість виконувати .NET-код зсередини через SQL CLR. Це корисно для деяких із тих завдань, які не вписуються у реляційну модель, але хочуть підтримувати продуктивність. Я розумію, що це не те, що ви шукаєте. Це приклад багатьох речей, якими займаються бази даних.

Це скоро не піде. Однією з останніх баз даних для виходу на ринок є NuoDB . Вони зберігали SQL, надавали ACID, додаючи можливість розподіляти сервери та запускати його у хмарі. Можливо, ви захочете розібратися, чому вони пішли на всю цю проблему, щоб сприяти продовженню SQL (Не єдина їхня причина, але це величезна точка продажу).


.NET-код у SQL Server насправді не працює в двигуні бази даних. Це .NET-код, зібраний на збірку на сервері, і збереженим процедурам приписуються методи статичного класу, які сервер бази даних знає, як викликати. Методи використовують постачальника даних і встановлюють з'єднання з базою даних, як і будь-який інший .NET-код. У вас схожа ситуація з базами даних (Oracle, Sybase), які підтримують збережені Java процедури. З іншого боку, SQL є "рідним інтерфейсом" бази даних, подібний у більшості продуктів бази даних і насправді аналізується та виконується безпосередньо в базі даних.
Крейг

@Craig - Відмінний момент.
JeffO

3

SQL СУБД надають істотно оптимізований доступ до магазину через рідну мову та багато інших, як ви зазначаєте, жодного іншого API.

Зауваження, що база даних не працює, не застосовується в ряді випадків і насправді не має прямого значення.

Навіть бази даних, які вимагають використання SQL DML, часто надають бібліотеку курсорів, щоб забезпечити ітератор доступу до набору результатів, а добре відомі СУБД Microsoft Access і Btrieve SQL забезпечують інтерфейс прямого запису до окремих таблиць у базі даних як механізм для дуже високопродуктивного доступу за конкретних обставин

Як зазначалося, складні запити, що використовують такий синтаксис, відтворюють поведінку мережевих баз даних з кінця 70-х.

Механізми альтернативного доступу є менш привабливими для основних користувачів через незнайомість, але зростання популярності баз даних NoSQL може підвищити інтерес до інших API для досягнення конкретних підвищення продуктивності. Мабуть, ще мало рекомендувати такий підхід.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.