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 форків і 27.9k зірок.
    • 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 форків і 31.3k зірок.

Мінуси:

  • Не підтримує фільтрацію 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, коли йдеться про їхню ліцензію.

Джерела