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, когда дело дойдёт до их лицензии.

Источники