Sequelize vs Prisma

Początek

Obecnie w eBay migruję nasze wewnętrzne narzędzia z używania MongoDB do Postgresa. To projekt, który jest bardzo trudny, ale chętnie podejmuję go bezpośrednio. Podczas badań ustaliłem, że dla naszej bazy kodu najlepsze będzie użycie ORM, ponieważ baza kodu była już zaprojektowana do używania Mongoose. Ale teraz wyzwanie brzmi: który ORM będzie najlepszy dla naszej bazy kodu? W tym blogu zagłębię się w to pytanie. Proszę zauważyć, że nie mogę ujawnić wszystkiego w tym blogu ze względu na charakter mojego kontaktu z moim pracodawcą.

Wymagania

Po starannej analizie potrzeb projektu ustaliłem następujące podstawowe kryteria, które każde rozwiązanie ORM musiałoby spełnić:

  • Być pakietem JavaScript; ponieważ większość kodu jest napisana w JavaScript
  • Musi obsługiwać Postgresa i większość jego funkcji
  • Jego wydajność musi być co najmniej na równi z Mongoose lub lepsza
  • Musi być otwartoźródłowy i utrzymywany

ORM-y

Po przeprowadzeniu wielu badań ustaliłem, że trzy najlepsze ORM-y, które spełniają te wymagania, to: Sequelize, Prisma i TypeORM. Ostatecznie zdecydowałem się skupić tylko na Sequelize i Prisma, ponieważ nie miałem czasu, aby w pełni przetestować trzy różne ORM-y z powodu terminów.

Środowisko testowe

Dla mojego środowiska testowego uruchomiłem Postgresa przez Dockera. Wziąłem nasz największy i najbardziej złożony zbiór danych, przekonwertowałem go ze struktury dokumentów na strukturę tabel i dodałem go do mojej lokalnej instancji Postgresa. Zbiór danych przekonwertowałem, używając kolumn, relacji jeden-do-jednego, relacji jeden-do-wielu oraz niektórych kolumn JSONB.

Następnie pisałbym kod JavaScript, który używał tego konkretnego ORM-u, i mierzył:

  • Jak długo zajmie utworzenie wpisu
  • Jak długo zajmie zaktualizowanie wpisu
  • Jak długo zajmie zaktualizowanie zagnieżdżonego wpisu (relacji i/lub klucza-wartości w JSON)
  • Jak długo zajmie usunięcie wpisu
  • Jak długo zajmie wykonanie zapytania/pobranie wpisu

Utworzyłem repozytoria dla każdego środowiska testowego ORM. Bardzo chciałbym udostępnić te repozytoria, ale technicznie należą one do eBay, więc nie mogę ich udostępnić.

Wyniki

Około 15 maja 2023 roku zdecydowałem, że Sequelize jest lepszym ORM-em dla naszego przypadku użycia i że to właśnie on będzie używany do naszej migracji z MongoDB do Postgresa. Ostatecznie wybrałem Sequelize, ponieważ:

  • Był „naprawdę otwartoźródłowy” i nie był utrzymywany przez finansowany startup.
  • Obsługiwał większość funkcji Postgresa.
  • Miał dobrą wydajność, zwłaszcza w porównaniu z Prisma.
  • Ma dobrą dokumentację, choć nie tak dobrze opracowaną jak dokumentacja Prisma.

Zdecydowałem się na Sequelize, ale sporządziłem też listę zalet i wad dla każdego testowanego ORM-u, mając nadzieję, że pomoże to ludziom lepiej ocenić, czy Sequelize lub Prisma będą działać w ich przypadku użycia.

Zalety i wady Sequelize

Zalety:

  • Ma funkcję sync(), która automatycznie tworzy i obsługuje tabele za ciebie
  • Potrafi obsługiwać złożone złączenia (dane zagnieżdżone)
  • Obsługuje wiele opcji filtrowania (takich jak Regex)
  • Reprezentacja modelu/schematu odbywa się w czystym JavaScript przy użyciu klas, które są bardzo konfigurowalne.
  • Sequelize obsługuje połączenia dla wybranej bazy danych.
  • Sequelize obsługuje wiele połączeń odczytu
  • Obsługuje surowe zapytania SQL.
  • Na dzień 15 maja 2023:
    • W NPM Sequelize był ostatnio zaktualizowany „14 dni temu” i ma 1 505 835 tygodniowych pobrań.
    • Na GitHubie Sequelize był ostatnio zaktualizowany „wczoraj”, ma 4,2 tys. forków i 27,9 tys. gwiazdek.
    • Sequelize ma licencję MIT i jest otwartoźródłowy od ponad 10 lat. Więc najprawdopodobniej pozostanie otwartoźródłowy w dającej się przewidzieć przyszłości.

Wady:

  • Reprezentacja modelu/schematu może stać się bardzo złożona i rozbudowana. Na przykład reprezentacja Mongoose naszego dużego zbioru danych miała około 262 linii (wliczając spacje). Ten sam zbiór danych przedstawiony przez Sequelize ma 564 linie (wliczając spacje).
  • Składnia Sequelize w pewnych przypadkach staje się naprawdę myląca i skomplikowana.
  • Migracja bazy danych (edytowanie jej) jest bardzo uciążliwa. Możesz użyć sequelize-cli do wygenerowania skryptów szablonu migracji JavaScript. ALE wygląda na to, że tak samo jest niemal we wszystkich ORM-ach. Migracja w relacyjnej bazie danych w większości przypadków nie jest łatwa.
  • Dokumentacja nie jest aż tak dobra. Poprawiła się, ale nadal wymaga pracy. Jednak dzięki narzędziom takim jak ChatGPT nie jest to już tak duży problem jak kiedyś, ponieważ ChatGPT bardzo dobrze rozumie Sequelize, najprawdopodobniej dlatego, że Sequelize istnieje od dekady.
  • Sequelize nie jest tak czuły na typy w porównaniu z Prisma, co może prowadzić do problemów.
  • Nie obsługuje dobrze TypeScriptu, co w moim projekcie nie stanowi problemu, ale dla wielu innych projektów może być dużym problemem.

Zalety i wady Prisma

Zalety:

  • Ma własny język schematu. Oznacza to, że możesz łatwiej i czyściej tworzyć swój schemat/model. Na przykład reprezentacja Mongoose naszego dużego zbioru danych miała około 262 linii (wliczając spacje). Ale ten sam zbiór danych przedstawiony przez Prisma miał tylko 221 linii (wliczając spacje).
  • Prisma ma narzędzie CLI, które ułatwia tworzenie i migrację (modyfikację) twojej bazy danych. To bardzo wygodne. To nie jest srebrna kula, ale to najlepsza rzecz, jaką dotąd widziałem w ORM-ie.
  • Obsługuje surowe zapytania SQL.
  • Kod Prisma jest czysty i prosty. Nadal trzeba nauczyć się składni Prisma i ją opanować, ale jest ona znacznie łatwiejsza do zrozumienia niż składnia Sequelize.
  • Prisma ma klienta, który automatycznie generuje budownicze zapytań dla Node.js i TypeScript.
  • Dokumentacja jest bardzo, bardzo dobra i przejrzysta. ChatGPT nadal może pomóc, ale nie jest tak aktualny w kwestii Prisma jak w przypadku Sequelize.
  • Na dzień 15 maja 2023:
    • W NPM Prisma był ostatnio zaktualizowany „6 dni temu” i ma 1 344 705 tygodniowych pobrań.
    • Na GitHubie Prisma był ostatnio zaktualizowany „3 godziny temu”, ma 1,1 tys. forków i 31,3 tys. gwiazdek.

Wady:

  • Nie obsługuje filtrowania Regex dla Postgresa, ale ma opcje filtrowania „contains”, „includes” i „startsWith”.
  • Z moich testów wynika, że Prisma jest znacząco wolniejsza przy tworzeniu wpisów naszego dużego zbioru danych w Postgresie. Sequelize tworzył te duże wpisy z szybkością około 2,26 sekundy na wpis (plik JSON). Natomiast Prisma miała szybkość około 11,21 sekundy na wpis (plik JSON). Na podstawie tych wyników Prisma jest około 5 razy wolniejsza niż Sequelize w tym zadaniu.
  • Ponadto usunięcie jednego wpisu z dużego zbioru danych skutkowało czasem oczekiwania prawie 4 minut, co jest bardzo, bardzo złe.
  • Sequelize był znacznie szybszy przy usuwaniu wpisu w największym i najbardziej złożonym zbiorze danych w moich testach. Sequelize nie miał przewagi nad Prisma, jeśli chodzi o konstrukcję zbioru danych. Oba musiały poradzić sobie z relacją zagłębioną na trzy poziomy dla tego dużego zbioru danych, więc powiedziałbym, że było to uczciwe porównanie.
  • Prisma jest startupem, co oznacza, że Prisma jest firmą nastawioną na zysk i ma finansowanie w wysokości 56,5 miliona dolarów. Wiedząc o tym, główny kod/pakiet ORM Prisma jest otwartoźródłowy i ma licencję Apache-2.0. To miłe, ale ponieważ Prisma ma inwestorów, nie zdziwiłbym się, gdyby poszli drogą MongoDB, jeśli chodzi o swoją licencję.

Źródła