Данные лежат в основе Интернета. Чем более персонализированным мы хотим, чтобы наш опыт просмотра веб-страниц был, тем больше данных необходимо хранить. Хранение данных за пределами картотеки и стальной ловушки ума в основном осуществляется с использованием баз данных.

Вся наша информация находится в базах данных… Что теперь?

SQL — это язык баз данных, который используется для создания, извлечения, обновления и уничтожения информации из реляционных баз данных. SQL — (на мой взгляд) один из самых простых для понимания языков программирования, хотя это и не так просто; ВЫБЕРИТЕ * ИЗ знания, ГДЕ тема = SQL;. Если предыдущее предложение не имеет для вас смысла, сделайте небольшой 4-минутный перерыв и посмотрите это видео, в котором рассматриваются основы SQL.

Есть ли у вас опыт работы с ORM?

Всю последнюю неделю я изучал Ruby on Rails, используя Active Record объектно-реляционного сопоставления (ORM). Вместо входа в psql и создания таблиц, взаимосвязей внешних ключей, выборочных запросов и объединенных таблиц Active Record позаботился об этом за меня. Рассмотрим таблицу, содержащую возраст и окрас кошек в приюте; чтобы получить всю информацию о каждой кошке, я мог бы написать этот запрос SELECT * FROM Cats, но если бы я использовал Active Record, я мог бы просто написать Cat.all.

Но как?

Начну с ответа на вопрос, которого вы не задавали: почему Cat.all, а не cat.all? Ruby — это объектно-ориентированный язык (ООП), данные которого хранятся в таких объектах, как классы и модули. Cat — это класс, который имеет 2 свойства; название и окрас. Cat также является моделью, потому что он расширяет модуль ActiveRecord, предоставляя ему доступ к методу all, который создает запрос и извлекает данные. Модель Cat (O) сопоставляется (M) с таблицей (R) Cats, и каждый экземпляр Cat будет добавлен в таблицу Cats. Если вы хотите узнать больше о моделях в Ruby on Rails и используемом шаблоне Model-View-Controller, здесь — отличный ресурс.

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

«Абстракция используется, чтобы скрыть второстепенные детали или любую ненужную реализацию данных, чтобы пользователи видели только необходимую информацию». — Эдпрессо

Когда мы перейдем к JavaScript?

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

TypeORM является более популярным из двух: только на этой неделе (30.01.22) было загружено более 853 тыс. npm. У Prisma меньше половины этих загрузок, но все же это почти 342 тысячи загрузок.

Для меня TypeORM было легче понять после работы с Active Record, поскольку он также отображает классы моделей в реляционные таблицы. Эта функция делает его уникальным среди ORM JavaScript, если у вас также есть опыт работы с ООП, этот ORM будет полезен. TypeORM, как следует из названия, предназначен для использования с TypeScript, который является подмножеством JavaScript, предназначенным для раннего обнаружения ошибок. Выучить TypeScript не так уж сложно, если вы уже знакомы с JavaScript, но может быть сложно выучить TypeScript только для того, чтобы использовать TypeORM.

Prisma, с другой стороны, имеет свой собственный язык декларативных схем, Prisma Schema Language (PSL), который мне показался очень удобочитаемым. Prisma также имеет расширение VS Code с функциями автоматического форматирования и автозаполнения, что позволяет вам писать меньше шаблонов. Даже если вы никогда не использовали Prisma, этот пример страницы схемы из документации Prisma довольно интуитивно понятен.

И TypeORM, и Prisma напишут ваши файлы миграции за вас, но были некоторые жалобы на то, что функция миграции TypeORM содержит ошибки и создает неподходящие миграции.

Prisma имеет более высокий уровень абстракции, чем TypeORM, поэтому, если вы хотите окунуться в ORM, но при этом держаться близко к SQL, я бы рекомендовал TypeORM. Если вы визуальный ученик, у Prisma есть отличная функция Prisma Studio, которая визуализирует ваши таблицы и строки в браузере. Обе ORM эффективны при манипулировании и запросе базы данных и являются отличными библиотеками, которые нужно иметь под рукой.

В чем подвох?

Загвоздка в том, что кривая обучения крутая; Буквально на днях я написал сложную логику, требующую зацикливания и таблицы соединений для модели с отношением has_many. Я передвинул сушу и море только для того, чтобы стоять на одном месте. Еще один недостаток ORM, особенно если вы новичок, заключается в том, что вы не накапливаете и не укрепляете свои знания SQL. Вам может быть интересно, зачем вам нужно изучать SQL, если ORM позаботится об этом за вас, и на это я скажу; кто сказал, что вы будете использовать ORM? Когда вы работаете над своими собственными проектами, вы устанавливаете стек и можете добавить свою любимую ORM, но когда вы работаете над проектом с указанным списком библиотек, ORM не гарантируется. Во-вторых, конкретный запрос, который вам нужен, может не поддерживаться или не может быть легко написан с помощью ORM, и вам придется написать SQL самостоятельно или изменить структуру вашей базы данных. Наконец, с лучшим пониманием SQL вы сможете писать лучший код, создавать лучшие миграции и лучше отлаживать свой код, когда что-то пойдет не так.

Итак, что мне делать?

Как и на любой хороший вопрос, ответ таков: это зависит от обстоятельств. Это будет зависеть от ваших целей: хотите ли вы быстро добавить функцию или усилить свой SQL? Вы хотите заплатить за библиотеку ORM? У вас есть время, чтобы научиться использовать выбранную вами библиотеку ORM? Самое главное, кто отвечает за этот проект и находится ли он в стеке?

Ссылки

https://www.educative.io/edpresso/what-is-abstraction-in-programming

https://guides.rubyonrails.org/active_record_basics.html

https://www.sitepoint.com/javascript-typescript-orms/

https://www.sitepoint.com/model-view-controller-mvc-architecture-rails/

https://www.prisma.io/docs/concepts/more/comparisons/prisma-and-TypeORM

https://www.prisma.io/docs/concepts/components/prisma-schema

https://www.typescriptlang.org/