Sequelize против Prisma
Начало
В настоящее время в eBay я мигрирую наши внутренние инструменты с использования MongoDB на Postgres. Это проект, который очень сложен, но я с радостью берусь за него в лоб. В ходе исследования я определил, что для нашей кодовой базы лучше всего использовать ORM, поскольку кодовая база уже была спроектирована для использования Mongoose. Но теперь вопрос в том, какой ORM лучше всего подойдёт для нашей кодовой базы? В этом блоге я разберу этот вопрос. Пожалуйста, учтите, что я не могу раскрыть всё в этом блоге из-за характера моего контакта с работодателем.
Требования
После тщательного анализа потребностей проекта я установил следующие основные критерии, которым должно соответствовать любое ORM-решение:
- Быть пакетом JavaScript; поскольку большая часть кода написана на JavaScript
- Обязательно поддерживать Postgres и большинство его возможностей
- Его производительность должна быть как минимум на уровне Mongoose или лучше
- Должен быть открытым исходным кодом и поддерживаться
ORM
После проведения большого количества исследований я определил, что три лучших ORM, подходящих под требования, это: Sequelize, Prisma и TypeORM. В итоге я решил сосредоточиться только на Sequelize и Prisma, потому что у меня не было времени полноценно протестировать три разных ORM из-за сроков.
Среда тестирования
Для своей среды тестирования я запускал Postgres через Docker. Я взял наш самый большой и более сложный набор данных, преобразовал его из структуры документа в табличную структуру и добавил его в мой локальный экземпляр Postgres. Я преобразовал набор данных, используя столбцы, связи один-к-одному, связи один-ко-многим и некоторые столбцы JSONB.
Далее я писал JavaScript-код, который использовал этот конкретный ORM, и измерял:
- Сколько времени потребуется, чтобы создать запись
- Сколько времени потребуется, чтобы обновить запись
- Сколько времени потребуется, чтобы обновить вложенную запись (связь и/или ключ-значение в JSON)
- Сколько времени потребуется, чтобы удалить запись
- Сколько времени потребуется, чтобы запросить/получить запись
Я создал репозитории для каждой тестовой среды ORM. Я бы с радостью поделился этими репозиториями, но технически они принадлежат eBay, поэтому я не могу ими поделиться.
Результаты
Примерно 15 мая 2023 года я решил, что Sequelize — лучший ORM для нашего случая использования и что именно он будет использоваться для нашей миграции с MongoDB на Postgres. В конечном итоге я выбрал Sequelize, потому что:
- Это был «по-настоящему открытый исходный код», и за ним не стоит финансируемый стартап.
- Поддерживал большинство возможностей Postgres.
- Показал хорошую производительность, особенно по сравнению с Prisma.
- Имеет хорошую документацию, хотя и не настолько хорошо документированную, как документация Prisma.
Я остановился на Sequelize, но я также составил список плюсов и минусов для каждого ORM, который тестировал, в надежде, что это поможет людям лучше определить, подойдёт ли Sequelize или Prisma для вашего случая использования.
Плюсы и минусы Sequelize
Плюсы:
- Имеет функцию sync(), которая автоматически создаёт и обрабатывает таблицы для вас
- Может обрабатывать сложные соединения (вложенные данные)
- Поддерживает множество вариантов фильтрации (например, Regex)
- Представление модели/схемы выполняется на чистом JavaScript с использованием классов, которые обладают высокой степенью настраиваемости.
- Sequelize обрабатывает подключения для выбранной вами базы данных(баз данных).
- Sequelize поддерживает несколько подключений для чтения
- Поддерживает сырые SQL-запросы.
- По состоянию на 15 мая 2023 года:
- На NPM Sequelize в последний раз обновлялся «14 дней назад» и получает 1 505 835 еженедельных загрузок.
- На GitHub Sequelize в последний раз обновлялся «вчера», имеет 4,2 тыс. форков и 27,9 тыс. звёзд.
- У Sequelize лицензия MIT, и он является открытым исходным кодом уже более 10 лет. Поэтому весьма вероятно, что он останется открытым исходным кодом и в обозримом будущем.
Минусы:
- Представление модели/схемы может стать очень сложным и раздутым. Например, представление нашего большого набора данных в Mongoose занимало около 262 строк (включая пробелы). Тот же набор данных, представленный через Sequelize, занимает 564 строки (включая пробелы).
- Синтаксис Sequelize в некоторых случаях становится очень запутанным и сложным.
- Миграция вашей базы данных (её редактирование) очень утомительна. Вы можете использовать sequelize-cli для генерации шаблонных JavaScript-скриптов миграции. НО похоже, что это характерно почти для всех ORM. Миграция в реляционной базе данных в большинстве случаев — непростая задача.
- Документация не так уж хороша. Она стала лучше, но всё ещё требует доработки. Но с такими инструментами, как ChatGPT, это уже не такая большая проблема, как раньше, поскольку ChatGPT очень хорошо понимает Sequelize, вероятно, из-за того, что Sequelize существует уже десять лет.
- Sequelize не настолько чувствителен к типам по сравнению с Prisma, что может привести к проблемам.
- Он плохо поддерживает TypeScript, что для моего проекта не является проблемой, но для многих других проектов может стать серьёзной проблемой.
Плюсы и минусы Prisma
Плюсы:
- Имеет собственный язык схем. Это означает, что вы можете более легко и аккуратно создавать свою схему/модель. Например, представление нашего большого набора данных в Mongoose занимало около 262 строк (включая пробелы). Но тот же набор данных, представленный в Prisma, занимал всего 221 строку (включая пробелы).
- У Prisma есть CLI-инструмент, который упрощает создание и миграцию (модификацию) вашей базы данных. Это очень удобно. Это не серебряная пуля, но это лучшее, что я пока видел среди ORM.
- Поддерживает сырые SQL-запросы.
- Код Prisma чистый и простой. Вам всё равно нужно будет освоить синтаксис Prisma и привыкнуть к нему, но его гораздо легче понять, чем синтаксис Sequelize.
- У Prisma есть клиент, который автоматически генерирует конструкторы запросов для Node.js и TypeScript.
- Документация очень-очень хорошая и понятная. ChatGPT всё ещё может помочь, но он не так актуален в отношении Prisma, как в отношении Sequelize.
- По состоянию на 15 мая 2023 года:
- На NPM Prisma в последний раз обновлялся «6 дней назад» и получает 1 344 705 еженедельных загрузок.
- На GitHub Prisma в последний раз обновлялся «3 часа назад», имеет 1,1 тыс. форков и 31,3 тыс. звёзд.
Минусы:
- Не поддерживает фильтрацию Regex для Postgres, но имеет варианты фильтрации «contains», «includes» и «startsWith».
- По моим тестам, Prisma значительно медленнее создаёт записи нашего большого набора данных в Postgres. Sequelize создавал эти большие записи со скоростью примерно 2,26 секунды на запись (JSON-файл). В то время как Prisma показывал скорость примерно 11,21 секунды на запись (JSON-файл). Судя по этим результатам, Prisma примерно в 5 раз медленнее Sequelize в этой задаче.
- Также удаление одной записи из большого набора данных приводило к ожиданию почти 4 минуты, что очень-очень плохо.
- Sequelize был намного быстрее при удалении записи в самом большом и сложном наборе данных в моих тестах. Sequelize не имел преимущества перед Prisma, когда дело доходило до построения набора данных. Оба должны были работать с отношением глубиной в три уровня для этого большого набора данных, так что я бы сказал, что это было справедливое сравнение.
- Prisma — это стартап, то есть Prisma является коммерческой компанией с финансированием в размере 56,5 миллиона долларов. Учитывая это, основной ORM-код/пакет Prisma имеет открытый исходный код и лицензию Apache-2.0. Это хорошо, но поскольку у Prisma есть инвесторы, я бы не удивился, если бы они поступили как MongoDB, когда дело дойдёт до их лицензии.
Источники
- https://www.bitovi.com/blog/battle-of-the-node.js-orms-objection-prisma-sequelize
- https://www.prisma.io/docs/orm/more/comparisons/prisma-and-sequelize
- https://github.com/prisma/prisma
- https://github.com/sequelize/sequelize
- https://www.youtube.com/watch?v=rLRIB6AF2Dg
- https://www.youtube.com/watch?v=RebA5J-rlwg
- https://www.youtube.com/watch?v=a5Wh_LDXtLc
- https://www.youtube.com/watch?v=4QN1BzxF8wM