Я считаю, что при использовании SQL мы совершаем фундаментальную ошибку. Мы используем его как для того, чтобы задать вопрос, так и для форматирования ответа.
Позвольте мне привести пример генерации XML с помощью SQL:
(Тот же аргумент можно использовать с использованием JSON или любого другого языка разметки. Я использую XML только в качестве примера.)
Вот один из бесчисленных способов генерации XML с помощью SQL в базе данных Oracle:
ВЫБРАТЬ XMLELEMENT («Emp», XMLATTRIBUTES (e.fname AS «firstName»))
ОТ сотрудников e
Ниже приведен пример фрагмента XML, который этот оператор SQL может создать при выполнении:
‹Emp firstName =" John "/›
‹Emp firstName =" Mary "/›
Так же,
ВЫБРАТЬ XMLELEMENT («Emp», XMLELEMENT («firstName», e.fname))
ОТ сотрудников e
возвращает следующий фрагмент XML:
‹Emp›
‹firstName› Джон ‹/firstName›
‹/Emp›
‹Emp›
‹firstName› Мэри ‹/firstName›
‹ / Emp ›
По логике, два оператора задают один и тот же вопрос базе данных (выберите fname из сотрудников) и должны возвращать один и тот же ответ, если данные статичны. Отличается только формат ответа. Однако два оператора SQL выглядят по-разному, потому что способ представления данных скрыт внутри оператора SQL. Другими словами, SQL используется не только для того, чтобы задать вопрос, но и для форматирования ответа на вопрос.
У этого подхода есть несколько недостатков. Это затрудняет написание и понимание операторов SQL. Это затрудняет их обслуживание, особенно если изменения в формате значительны. Что еще хуже, каждый другой формат требует написания нового оператора SQL, даже если мы можем задать тот же самый вопрос, только чтобы получить его в другом формате.
Альтернативный подход
Я полностью за то, чтобы указать формат ответа, задавая вопрос с помощью SQL. Я согласен с тем, что преобразование ответа в желаемый формат должно быть максимально приближено к кремниевому. Однако, если мы собираемся это сделать, давайте сделаем это правильно и отделим запрос данных от форматирования, которое нам нужно для ответа.
Ниже приведены примеры утверждений, которые возвращают ту же информацию, что и выше. Однако эти заявления состоят из двух частей. Первая часть - это SQL, который задает вопрос, а вторая часть описывает формат, в котором пользователь хочет получить ответ.
Обратите внимание, что я придумал синтаксис. На данный момент меня не волнует конкретный синтаксис для достижения этого разделения. Все, что я пытаюсь показать, это то, что это разделение возможно и очень, очень полезно.
выберите fname
из сотрудников
вернуть XMLType,
строки как xmlTag «Emp»,
столбцы как атрибуты,
переименуйте столбец fname в «firstName ”
приведет к:
‹Emp firstName =" John "/›
‹Emp firstName =" Mary "/›
Так же,
выберите fname
среди сотрудников
вернуть XMLType,
строки как xmlTag «Emp»,
столбцы как теги,
переименуйте столбец fname в «firstName» ”
произвел бы
‹Emp›
‹firstName› Джон ‹/firstName›
‹/Emp›
‹Emp›
‹firstName› Мэри ‹/firstName›
‹ / Emp ›
Используя реализацию синтаксиса, подобную описанной выше, пользователь базы данных может получать данные в любом желаемом формате, будь то XML или JSON. Более того, если синтаксис и его реализация мощные, пользователь может даже описать любой произвольный формат ответа. Эти выходные форматы также можно сохранять и использовать повторно.
Поскольку запрос отделен от представления, оператор SQL становится намного проще писать и более читабельным. Если формат изменится, запрос не изменится. Добавление нового формата представления становится независимым от SQL, необходимого для извлечения данных. Наконец, с достаточно мощной реализацией языка форматирования разработчики могут добавить новый формат представления к оператору SQL во время выполнения в качестве входного параметра:
выберите fname
среди сотрудников
вернуть с помощью myFormat
Как я уже сказал, я не сосредотачиваюсь на собственном синтаксисе языка форматирования. Но давайте не ошибаться. Это новый язык. Итак, я предполагаю, что я говорю, что SQL нужна сестра для форматирования его вывода. Помимо SQL, языка структурированных запросов, нам нужен язык структурированного форматирования и новые механизмы баз данных, которые могут интерпретировать и то, и другое.
Большое спасибо Х. Ибрагиму Сандалли, Сердару Гекчену и Лукасу Эдеру за чтение первых черновиков этой статьи.