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.2k Forks и 27.9k Stars.
    • 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.1k Forks и 31.3k Stars.

Минусы:

  • Не поддерживает фильтрацию Regex для Postgres, но имеет варианты фильтров “содержит”, “включает” и “начинается с”.
  • По моим тестам, 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, когда дело касается их лицензии.

Источники