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, когда дело касается их лицензии.
Источники
- 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