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