https://youtu.be/mb6-NHMzSkY
Без ORMИван Гришаев, 2017
View Slide
Википедияis a technique for converting databetween incompatible type systemsusing object-oriented programming languages.
ORM, например
Что дает— абстракция над БД— упрощает процесс разработки— объектность™
В реальности— абстракции (чаще всего) зло— база меняется редко (и болезненно)— коллекции > объекты
SQL— создан до ООП— декларативный— не-Тьюринг полный— решает задачи
Задача о переводе SQL в объекты...— неразрешима в принципе!— сравнима с трансляцией языков
Примерная сложностьSEL/INS/UPD/DEL +(на этом пора заканчивать)INNER/LEFT JOIN ++WITH RECURSIVE ++++JSON(b) ++++++++GIS ++++++++++++++FULLTEXT SEARCH ++++++++++++++++++++++++++++...
Проблемы— ORM системы сложны— внутренние API не документированы— не спасают от raw SQL
Боязнь raw SQL— доменный язык (как HTML, CSS)— ООП-код растет— неэффективная работа с БД
Эти ваши объекты
К чему приводит ORM— Боязнь (незнание) SQL— Хрупкость базы— Лишний ОО-код— ORM-specific bugs
К чему приводит ORM— Зависимость— Нечитаемые запросы— Трудно понять, что на выходе
А если будет тормозить?— Сперва добейся!— Конфигурация— Железо— Меньше кода
Вам не нужны объекты— опасные property— нужны удобные структуры— и функции для работы с ними— Clojure, Go, Rust
Что предлагаешь?— Построители запросов— Запросы из структур данных— SQL-шаблоны— Генерация функций
Построители запросов
Запросы из структур данных
SQL templates
Наш проект— PostgreSQL, JDBC/Clojure— 70 таблиц— до 15 join-ов в запросах— GIS, JSONb— рекурсивные запросы
HugSQL, YeSQL— Один *.sql файл— Clojure, JS, Python, PHP, Perl, Go, C#,Erlang, Ruby
Конец— Вопросы?