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

Джерела