Sequelize kumpara sa Prisma

Simula

Sa kasalukuyan sa eBay, inililipat ko ang aming mga internal na tool mula sa paggamit ng MongoDB papuntang Postgres. Isang proyektong napakahirap ngunit nasasabik akong harapin ito nang buong tapang. Habang nagsasaliksik, napagpasyahan ko na para sa aming codebase, ang paggamit ng isang ORM ang magiging pinakamainam dahil ang codebase ay dinisenyo na upang gamitin ang Mongoose. Ngunit ngayon ang hamon, aling ORM ang pinakamainam para sa aming codebase? Sa blog na ito, tutuklasin ko ang tanong na iyon. Pakiusap tandaan na hindi ko maihahayag ang lahat sa blog na ito dahil sa likas na katangian ng aking ugnayan sa aking employer.

Mga Kinakailangan

Matapos ang maingat na pagsusuri ng mga pangangailangan ng proyekto, itinakda ko ang mga sumusunod na mahahalagang pamantayan na kailangang matugunan ng anumang ORM solution:

  • Maging isang JavaScript package; dahil karamihan ng code ay nakasulat sa JavaScript
  • Dapat suportahan ang Postgres at karamihan ng mga tampok nito
  • Ang pagganap nito ay dapat hindi bababa sa katumbas o mas mabuti kaysa sa Mongoose
  • Dapat open source at pinananatili

Mga ORM

Matapos magsagawa ng maraming pananaliksik, natukoy ko ang tatlong nangungunang ORM na umaakma sa mga kinakailangan: Sequelize, Prisma, at TypeORM. Sa huli, nagpasya akong tumutok lamang sa Sequelize at Prisma dahil wala akong sapat na oras na lubusang subukan ang tatlong magkaibang ORM dahil sa mga deadline.

Kapaligiran ng Pagsubok

Para sa aking kapaligiran ng pagsubok, pinatakbo ko ang Postgres gamit ang Docker. Kinuha ko ang aming pinakamalaki at mas kumplikadong dataset, inilipat ito mula sa estrukturang dokumento patungo sa estrukturang talahanayan, at idinagdag ito sa aking lokal na Postgres instance. Inilipat ko ang dataset gamit ang mga kolum, one-to-one na relasyon, one-to-many na relasyon, at ilang JSONB na kolum.

Mula doon, magsusulat ako ng JavaScript na code na gumamit ng partikular na ORM na iyon at susukatin:

  • Gaano katagal aabutin upang gumawa ng isang entry
  • Gaano katagal aabutin upang i-update ang isang entry
  • Gaano katagal aabutin upang i-update ang isang nested na entry (relasyon at/o key-value sa isang JSON)
  • Gaano katagal aabutin upang tanggalin ang isang entry
  • Gaano katagal aabutin upang i-query/kunin ang isang entry

Nilikha ko ang mga repo para sa bawat kapaligiran ng pagsubok ng ORM. Gusto kong ibahagi ang mga repo na ito ngunit pag-aari teknikal sila ng eBay, kaya hindi ko maibabahagi ang mga iyon.

Mga Resulta

Bandang Mayo 15, 2023, nagpasya ako na ang Sequelize ang mas mahusay na ORM para sa aming kaso ng paggamit at na ito ang gagamitin para sa aming migrasyon mula MongoDB papuntang Postgres. Sa huli, pinili ko ang Sequelize dahil:

  • Ito ay “tunay na open-source” at hindi pinananatili ng isang startup na may pondo.
  • Sinusuportahan ang karamihan ng mga tampok ng Postgres.
  • May magandang pagganap, lalo na kumpara sa Prisma.
  • May magandang dokumentasyon, bagaman hindi kasing husay ng mga dokumento ng Prisma.

Nagdesisyon ako para sa Sequelize, ngunit gumawa rin ako ng listahan ng mga kalamangan at kahinaan para sa bawat ORM na sinubukan ko sa pag-asang makakatulong ito sa mga tao na mas mahusay na matukoy kung ang Sequelize o Prisma ang gagana para sa kanilang kaso ng paggamit.

Mga Kalamangan at Kahinaan ng Sequelize

Mga Kalamangan:

  • Mayroong sync() na function na awtomatikong lumilikha at humahawak ng mga talahanayan para sa iyo
  • Kayang hawakan ang mga kumplikadong joins (nested na data)
  • Sumusuporta sa maraming mga opsyon sa pag-filter (tulad ng Regex)
  • Ang representasyon ng modelo/schema ay ginagawa sa raw na JavaScript gamit ang mga klase na lubhang nako-customize.
  • Hinahandle ng Sequelize ang mga koneksyon para sa iyong piniling database(s).
  • Sumusuporta ang Sequelize sa maraming koneksyon sa pagbasa
  • Sumusuporta sa mga hilaw na SQL query.
  • Noong Mayo 15, 2023:
    • Sa NPM, ang Sequelize ay huling na-update “14 na araw na ang nakalipas” at nakakakuha ng 1,505,835 na lingguhang pag-download.
    • Sa GitHub, ang Sequelize ay huling na-update “kahapon”, may 4.2k mga Fork, at 27.9k mga Star.
    • Ang Sequelize ay may lisensyang MIT at open source na nang higit sa 10 taon. Kaya malamang na mananatiling open source ito sa nakikitang hinaharap.

Mga Kahinaan:

  • Ang representasyon ng modelo/schema ay maaaring maging napaka-komplikado at malaki. Halimbawa, ang representasyon ng Mongoose ng aming malaking dataset ay humigit-kumulang 262 na linya (kasama ang mga puwang). Ang parehong dataset na inilarawan gamit ang Sequelize ay 564 na linya (kasama ang mga puwang).
  • Ang sintaks para sa Sequelize ay nagiging talagang nakalilito at kumplikado sa ilang mga kaso.
  • Ang pag-migrate ng iyong database (pag-edit nito) ay napakaabala. Maaari mong gamitin ang sequelize-cli upang makabuo ng mga JavaScript migration template script. NGUNIT, tila pareho ito sa halos lahat ng ORM. Ang pag-migrate sa isang relational na database ay hindi madali sa karamihan ng mga kaso.
  • Ang dokumentasyon ay hindi ganoon kaganda. Bumuti na ito ngunit kailangan pa rin ng trabaho. Ngunit sa mga tool tulad ng ChatGPT, hindi na ito kasinglaking isyu kagaya ng dati dahil ang ChatGPT ay may napakagandang pag-unawa sa Sequelize, malamang dahil umiiral ang Sequelize nang isang dekada.
  • Ang Sequelize ay hindi gaanong type-sensitive kumpara sa Prisma, na maaaring magdulot ng mga isyu.
  • Hindi ito sumusuporta nang mabuti sa TypeScript, na para sa aking proyekto ay hindi problema ngunit para sa maraming iba pang proyekto ay maaaring maging malaking isyu.

Mga Kalamangan at Kahinaan ng Prisma

Mga Kalamangan:

  • May sarili itong schema language. Ibig sabihin nito na mas madali at malinis mong magagawa ang iyong schema/model. Halimbawa, ang representasyon ng Mongoose ng aming malaking dataset ay humigit-kumulang 262 na linya (kasama ang mga puwang). Ngunit ang parehong dataset na inilarawan ng Prisma ay 221 na linya lamang (kasama ang mga puwang).
  • Ang Prisma ay may CLI tool na nagpapadali sa paglikha at pag-migrate (pagbabago) ng iyong database. Na napaka-maginhawa. Hindi ito solusyon sa lahat ng problema ngunit ito ang pinakamahusay na bagay na nakita ko mula sa isang ORM hanggang ngayon.
  • Sumusuporta sa mga hilaw na SQL query.
  • Ang code para sa Prisma ay malinis at simple. Kailangan mo pa ring matutunan at unawain ang sintaks ng Prisma ngunit mas madali itong maintindihan kaysa sa sintaks ng Sequelize.
  • Ang Prisma ay may client na awtomatikong nagge-generate ng mga query builder para sa Node.js at TypeScript.
  • Ang dokumentasyon ay napakaganda at malinis. Makakatulong pa rin ang ChatGPT ngunit hindi ito kasing napapanahon tungkol sa Prisma kumpara sa Sequelize.
  • Noong Mayo 15, 2023:
    • Sa NPM, ang Prisma ay huling na-update “6 na araw na ang nakalipas” at nakakakuha ng 1,344,705 na lingguhang pag-download.
    • Sa GitHub, ang Prisma ay huling na-update “3 oras na ang nakalipas”, may 1.1k mga Fork, at 31.3k mga Star.

Mga Kahinaan:

  • Hindi sumusuporta sa Regex filtering para sa Postgres ngunit mayroon itong mga opsyon sa pag-filter na “contains”, “includes”, at “startsWith”.
  • Mula sa aking pagsubok, ang Prisma ay makabuluhang mas mabagal sa paggawa ng mga entry ng aming malaking dataset sa Postgres. Ang Sequelize ay gumawa ng mga malalaking entry na iyon sa bilis na humigit-kumulang 2.26 segundo bawat entry (JSON file). Samantalang ang Prisma ay may bilis na humigit-kumulang 11.21 segundo bawat entry (JSON file). Batay sa mga resulta na ito, ang Prisma ay mga 5x na mas mabagal kaysa sa Sequelize sa gawain na ito.
  • Gayundin, ang pagtanggal ng isang entry mula sa malaking dataset ay nagresulta sa isang oras ng paghihintay na halos 4 na minuto, na napakasama talaga.
  • Mas mabilis nang malaki ang Sequelize sa pagtanggal ng isang entry sa pinakamalaki at pinaka-kumplikadong dataset sa aking mga pagsubok. Walang kalamangan ang Sequelize laban sa Prisma pagdating sa konstruksyon ng dataset. Parehong kinailangan nilang harapin ang isang tatlong-layer na malalim na relasyon para sa malaking dataset na ito, kaya masasabi kong patas ang paghahambing.
  • Ang Prisma ay isang startup, na nangangahulugang ang Prisma ay isang kumpanyang kumikita na may $56.5 milyon sa pondo. Batid ito, ang pangunahing ORM code/package ng Prisma ay open source na may lisensyang Apache-2.0. Maganda ito, ngunit dahil may mga investor ang Prisma, hindi ako mabibigla kung babaguhin nila ang lisensya nila tulad ng ginawa ng MongoDB.

Mga Pinagmulan