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