🌀 Критика критики SQL (Запутались? Сейчас будем разбираться!) 📚
Язык SQL впервые появился в 1974 году как часть базы данных IBM System R. Прошло почти 50 лет, и SQL де-факто является языком для работы с большинством баз данных (реляционных, конечно же).
Карлин Энг работал инженером и аналитиков данных 12 лет и у него накопилось много вопросов к SQL. В статье он, как настоящий аналитик, структурированно изложил, что именно его не устраивает. Конечно, он был не первым критиком SQL, а лишь прокомментировал идеи, описанные в книге 1984 года выпуска «Критика языка баз данных SQL» математика Си Джей Дейта. Дейт был бывшим сотрудником IBM, известным исследователем баз данных и другом Э. Ф. Кодда. Однако, те замечания, которые были описаны в его книге, частично устарели и ниже будет краткая выжимка из рассуждения Карлина (которое я рекомендую прочесть в оригинале).
🤔 Что не так с SQL по версии Си Джей Дейта?
Для начала разберемся с тем, что такое ортогональность. Суть ортогональности по мнению автора в следующем: конструкции языка подобны блокам Lego — небольшое количество базовых частей можно рекомбинировать простыми и интуитивно понятными способами. Отсутствие ортогональности означает, что в языке есть много исключений в том, как компоненты могут быть объединены, что делает его сложным для изучения.
1. Отсутствие ортогональности выражений
Раньше использование FROM в SELECT было ограничено указанием только имен таблиц или представлений, а не подзапросов или общих табличных выражений (CTE). Однако, современный SQL предоставляет возможность ссылаться на CTE или подзапрос в операторе FROM.
2. Отсутствие ортогональности функций
Автор приводит множество конкретных примеров этого критического замечания, которые возникают при разном написании запроса. Один из них – оператор HAVING, которое мы разбирали в предыдущем посте. Спойлер: использование HAVING и GROUP BY теперь гораздо проще и шире, чем, например, в SQL 1983 года.
3. Отсутствие ортогональности в целом
Это замечание касается ряда небольших проблем, например, ограничение для «длинных» полей (строки больше 254 символов): на «длинное» поле нельзя было сослаться в предложении WHERE или GROUP BY. Конечно, современные системы баз данных больше не имеют этих ограничений.
4. Ключи
SQL образца 1983 года мог легко игнорировать первичные ключи, а внешних ключей даже не существовало. Хотя SQL образца 2022 допускает внешние ключи, и многие базы данных обеспечивают ссылочную целостность, последняя версия языка по-прежнему не полностью понимает семантику первичных и внешних ключей.
5. Домены или типы данных
В первоначальном SQL были только примитивные типы (int, char, float и т. д.). Сегодня Postgres обеспечивает поддержку пользовательских типов произвольной сложности, однако, большинство хранилищ данных OLAP не поддерживают определяемые пользователем типы, и SQL тут бессилен.
6. Назначение отношений
Критика здесь заключалась в следующем: Ограниченная форма присваивания отношения поддерживается через INSERT ... SELECT, но эта операция не перезаписывает предыдущее содержимое таблицы, а источником присваивания не может быть произвольное алгебраическое выражение (или эквивалент SELECT). Это уже не так. Назначение отношения может быть выполнено с помощью CREATE OR REPLACE TABLE AS. Для подзапросов и CTE источником может быть любое произвольное алгебраическое выражение.
7. Явные операторы JOIN, INTERSECT и DIFFERENCE
SQL 1983 года их не поддерживал, но в современном SQL это уже давно исправлено.
💭 Выводы
Хотя многие критические замечания в отношении SQL были исправлены обновлениями стандарта ANSI, некоторые из них все еще присутствуют, например, отсутствие ортогональности. Несмотря на несовершенство SQL, его доминирование на рынке означает, что каждый начинающий аналитик и программист должен его изучить. Однако, мне кажется, что при всех известных недостатках и попытках регулярно улучшить язык, SQL остается очень удобным и интутитивно понятным языком для работы с данными.
А вы что думаете — удобнее писать SELECT к табличке 💯или обработать массив с помощью pandas 🤡?