Путь разработчика, как и любого другого профессионала, минимально посвященного постоянному обучению, неизбежно имеет фактор непрерывного обучения. В моем случае эта кривая обучения была интенсивной и полна еженедельных новинок. Горячей темой недели стало то, что полностью изменило мой взгляд на код и организацию базы данных. Мы говорим об ORM или объектно-реляционном отображении.

ORM — это метод компьютерных наук для преобразования данных между несовместимыми системами данных или, в наиболее распространенном случае, для запроса и манипулирования данными из базы данных с использованием объектно-ориентированных языков. Другими словами, ORM работает как «переводчик» между такими системами. Взяв в качестве примера парадигму SQL, она переводит такой запрос к базе данных:

SELECT * FROM students WHERE name = 'James';

К этому (на примере JavaScript):

const { myOrm } = require('my-orm-library');
const student = myOrm('students').where({ name: 'James' });

Короче говоря, вы создаете базу данных и управляете ею из объектов на своем любимом языке программирования. Вместо того, чтобы запрашивать создание базы данных, а затем переносить данные в ваш код, ORM делает все с самого начала!

Это приводит к главной особенности любого ORM: шаблону Model-View-Controller или MVC.

И что делает MVC? Он инкапсулирует логику разработки программного обеспечения в три взаимосвязанных элемента, каждый из которых отвечает за свою роль в приложении:

  • Модель содержит данные приложения, логику и основные правила приложения.
  • Просмотр выводит визуальное представление модели в той или иной форме.
  • Наконец, Контроллер управляет взаимодействием и проверкой между пользовательскими входными данными из представления, выполняя взаимодействия в объектах модели данных.

В некоторых ORM, таких как Active Record на основе Ruby Rails, проверка и логика основных правил также управляются контроллером, в то время как модель заботится о моделировании данных и манипулировании ими.

Базовая диаграмма функционирования шаблона MVC в ORM будет выглядеть так:

Мой текущий (и продолжающийся по состоянию на сентябрь 2020 года) опыт работы с ORM — это Active Record, самая популярная библиотека разработки Ruby. В то же время, когда он помог мне лучше понять объектно-ориентированное программирование и предоставил гораздо более чистый стиль кода, он заново научился ездить на велосипеде с нуля. Основным недостатком любой ORM является то, что она выступает в качестве транслятора, и из-за этого, говоря с точки зрения разработки, это почти то же самое, что полностью изучить новый язык программирования. Он разделяет и организует вашу логику гораздо лучше, но требует новой кривой обучения, поскольку это своего рода диалект языка программирования, над которым вы работаете, и шаблон MVC может быть не очень знаком новичку в коде — я в том числе.

Вот некоторые преимущества использования ORM:

  • Вы можете продолжать писать на том же языке программирования, к которому вы привыкли, и вам не нужно долго изучать правильные операторы SQL для создания и управления базами данных.
  • Поскольку он использует ваш язык программирования для абстрагирования запросов к базе данных, вы можете переключаться между системами баз данных, если обе системы поддерживаются библиотекой ORM.
  • Многие ORM включают другие расширенные функции из коробки, такие как прогрессивная миграция базы данных (что означает более простое манипулирование базой данных), заполнение и транзакции, среди других функций. Такие функции также помогают предотвратить SQL-инъекции.
  • Большинство ORM автоматизируют процесс моделирования данных, требуя от разработчика меньше шагов для организации кода внутри своих проектов.
  • Поскольку краеугольным камнем ORM является написание кода в шаблоне MVC, ваш код становится чище и более пригодным для повторного использования.

Имейте в виду, однако, что принятие ORM не является единодушием среди программистов. Когда я впервые погуглил эту тему, я быстро нашел длинную критику ORM, продемонстрированную на практических примерах JavaScript. Некоторые из описанных преимуществ включают в себя:

  • По той же причине, по которой вы придерживаетесь своего текущего языка программирования, использование ORM приводит к тому, что вы не изучаете должным образом, как программируется и структурируется SQL, что приводит к техническим недостаткам.
  • ORM обычно эффективны для запросов к более простым структурам базы данных, но это не тот случай, когда вам нужно разработать более сложные запросы. Поскольку ORM создал новый уровень абстракции с объектной моделью, это сказывается на производительности. Эта статья дает сравнение производительности SQL и ORM, чтобы продемонстрировать такую ​​​​реальность, а этот репозиторий демонстрирует ту же проблему в библиотеках Node ORM.
  • Несмотря на то, что вы приняли язык программирования, над которым вы работаете, ORM по-прежнему представляют собой новый уровень для изучения, поскольку они поставляются со своими шаблонами, настройками, специальным синтаксисом и функциями. Это может быть особенно трудоемким или запутанным для новых разработчиков.
  • Создание базы данных ORM по-прежнему является автоматизированным процессом. Если у вас есть хорошие знания SQL, вы, вероятно, сможете создавать более эффективные запросы самостоятельно.

Все, что было сказано и описано относительно ORM и того, что они могут принести, я решил немного больше изучить тему с библиотеками JavaScript ORM, поскольку JS — это первый язык программирования, который я изучил как веб-разработчик, и это означает, что я неизбежно столкнуться с проектами и системами, использующими такие библиотеки. Я уделю некоторое время тому, чтобы немного рассказать о трех самых популярных доступных ORM-библиотеках и о том, что они могут дать разработчикам.

Прежде чем я продолжу, я лишь кратко расскажу о том, как я сначала отсортировал эти библиотеки:

  • Несмотря на свою большую популярность, Knex НЕ является ORM. Knex — это построитель SQL-запросов, который, несмотря на поддержку многих баз данных, таких как Postgres, MySQL, MariaDB и многих других, не выполняет сопоставление объектов. Эта роль по-прежнему остается за разработчиком, самостоятельно или с помощью ORM. Кстати, одна из ORM, которые я представлю, использует Knex в качестве построителя запросов.
  • Я отдал приоритет ORM, поддерживающим несколько баз данных, поскольку одним из основных моментов внедрения такой библиотеки является избежание хлопот, связанных с реструктуризацией всего построения запроса в случае миграции системы базы данных.

1. Сиквел

Sequelize на сегодняшний день является самой популярной библиотекой JavaScript ORM, с более чем 700 000 еженедельных загрузок, которая поддерживается и обновляется почти десять лет. Постоянный и последовательный ответ на проблемы оправдывает его огромную популярность, что делает его надежной библиотекой ORM для JavaScript.

Sequelize поддерживает Postgres, MySQL, MariaDB, SQLite и Microsoft SQL Server. Будучи основанным на Promise, он помогает многим разработчикам, которые привыкли использовать эту объектную модель, быстро ознакомиться со своей библиотекой. Другие функции, которые включает Sequelize, включают, помимо прочего:

  • Синхронизация базы данных
  • Миграция базы данных
  • Проверка модели и хуки
  • Заполнение данных, отношения и даже необработанные запросы на вкус разработчика
  • Упрощенное тестирование

Sequelize предлагает чрезвычайно богатую и подробную документацию, разделенную по версиям, чтобы помочь устаревшей разработке, и включает справку по API. Однако иногда их документацию может быть трудно читать.

Если вы цените стабильность разработки, вы, вероятно, захотите использовать Sequelize в качестве предпочтительного ORM для JavaScript.

2. ТипОРМ

TypeORM — относительно новая библиотека по сравнению с другими аналогами ORM, первый выпуск которой состоялся четыре года назад. Тем не менее, его совместимость как с TypeScript, так и с современным JavaScript (начиная с ES5) сделала его все более популярным среди разработчиков, поскольку он имеет почти половину еженедельных загрузок, как его самый популярный и обычный аналог, описанный выше.

Глядя на документацию TypeORM, я чувствовал себя почти как просмотр субботней утренней рекламы, поскольку она может похвастаться широким набором функций и совместимости. Вот часть такого списка с их целевой страницы документации:

  • Поддержка шаблонов DataMapper или Active Record
  • Конфигурация подключения в форматах JSON, XML, YML и ENV
  • Пул соединений
  • Управление объектами
  • Несколько подключений к базе данных
  • Поддержка многих фреймворков, браузеров и платформ, таких как React Native.
  • Поддержка широкого спектра систем баз данных, включая MongoDB, которая представляет собой NoSQL (нереляционную) базу данных, которую не поддерживает большинство ORM.

По мере того, как вы изучаете их документацию, у вас быстро возникает соблазн отказаться от всех других вариантов и немедленно принять TypeORM в качестве предпочтительной библиотеки ORM. Однако после некоторых исследований я быстро понял, что мое ощущение того, что я смотрю субботнюю рекламу, в конце концов, не было ошибочным. Недавнее сравнение между TypeORM и Sequelize указывает на две неприятные проблемы в TypeORM: плохо детализированная документация (несмотря на их превосходное представление) и отсутствие встроенного заполнения данных. В то время как Sequelize поддерживает собственное заполнение данных, TypeORM требует для этого внешнего плагина, расширяя требования к зависимостям и потенциально создавая побочные эффекты для тестирования.

Хотя это кажется идеальным выбором ORM для разработчиков TypeScript, многие профессионалы склонны советовать осторожно при использовании TypeORM.

3. Книжная полка

Книжная полка — это отдалённый третий вариант для разработчиков, предлагающий около 100 000 загрузок еженедельно. Это Node.js, созданный на основе конструктора Knex SQL и поддерживающий базы данных Postgres, MySQL и SQLite SQL. Что выделяет Bookshelf по сравнению с двумя другими упомянутыми библиотеками, так это их поддержка обратных вызовов, что становится потенциальным выбором для разработчиков, предпочитающих функциональное программирование моделированию на основе обещаний Sequelize (также поддерживаемом Bookshelf) или моделированию на основе классов TypeORM.

Другие функции, присутствующие в Bookshelf:

  • Поддержка наиболее распространенных отношений SQL (один к одному, один ко многим, многие ко многим)
  • Полиморфные ассоциации
  • Нетерпеливая (вложенная или не вложенная) загрузка отношения

Bookshelf кажется более простой библиотекой по сравнению с TypeORM или Sequelize, но их поддержка обратных вызовов может выделиться для некоторых разработчиков, поэтому всегда приятно представить другой вариант для работы.

Ладно, а как насчет тебя, Жоао?

В какую кроличью нору JavaScript ORM вы ныряете?

Я, вероятно, посмотрю на этот пост (кстати, мой первый пост, связанный с разработкой) через пару лет и от души посмеюсь, или, по крайней мере, глубоко задумаюсь после прочтения последнего раздела. Как я уже говорил в начале этой статьи, как новый разработчик, я чувствую себя ребенком на вечеринке по случаю их 10-летия, получающей все крутые игрушки каждые десять минут. Невероятно поражен следующей игрушкой, в которую я играю, даже если я еще не до конца понимаю, как она работает. Мне это нравится, потому что с ним здорово играть, только чтобы быть пораженным следующей доступной игрушкой. Это была моя жизнь как разработчика в двух словах за последние три месяца. Это может быть потрясающим в большинстве случаев, но, возможно, иногда ошеломляющим. Это имело место в этом новом мире объектно-связанного отображения и вытекающего из него шаблона модель-представление-контроллер.

Я также быстро понял, что ORM — более противоречивая и самоуверенная тема, чем я ожидал. Хотя многие разработчики ценят его как инструмент для упрощения стиля кода и разработки, многие другие разработчики рассматривают ORM как средство, которое может принести больше вреда пациенту (в данном случае модели и структуре базы данных), чем пользы. Меня, как начинающего разработчика, такая общая проницательность честно удивила.

Я также склонен ценить стабильность и поддержку сообщества при работе с языками программирования, библиотеками и инструментами. После изучения этих трех документов JavaScript ORM и изучения восприятия, опыта и сравнений сообщества разработчиков мой выбор ORM определенно будет Sequelize, несмотря на то, что он более многословен, чем два других конкурента. Мне потребуется некоторое время, чтобы привыкнуть к использованию (и освоению!) его использования и шаблона MVC в целом в JavaScript (я знакомлюсь с ним с помощью Active Record и Rails), но обучение — это всегда непрерывный процесс, и делать это как разработчик не является исключением.

Если вы хотите лучше узнать об ORM и соответствующих библиотеках JavaScript, я предлагаю несколько ссылок, по которым я перешел, чтобы лучше узнать тему: