Sequelize laban sa Prisma
Pagsisimula
Sa kasalukuyan sa eBay, inililipat ko ang aming mga panloob na kasangkapan mula sa paggamit ng MongoDB patungo sa Postgres. Isang proyektong napakahirap ngunit sabik akong harapin nang buong tapang. Habang nagsasaliksik, natukoy ko na para sa aming codebase, ang paggamit ng isang ORM ang pinakamainam dahil ang codebase ay idinisenyo na upang gumamit ng Mongoose. Ngunit ngayon ang hamon ay, aling ORM ang pinakamainam para sa aming codebase? Sa blog na ito, susuriin ko ang tanong na iyon. Pakitandaan na hindi ko maibubunyag ang lahat sa blog na ito dahil sa kalikasan ng aking pakikipag-ugnayan sa aking employer.
Mga Kinakailangan
Pagkatapos ng masusing pagsusuri sa mga pangangailangan ng proyekto, itinakda ko ang sumusunod na mahahalagang pamantayan na kailangang matugunan ng anumang solusyon ng ORM:
- Maging isang pakete ng JavaScript; dahil karamihan sa code ay nakasulat sa JavaScript
- Dapat suportahan ang Postgres at karamihan sa mga tampok nito
- Dapat ay hindi bababa sa kasinghusay o mas mahusay ang performance kaysa sa Mongoose
- Dapat ay open source at pinananatili
Mga ORM
Pagkatapos gumawa ng maraming pananaliksik, natukoy ko na ang nangungunang tatlong ORM na tumutugma sa mga kinakailangan ay: Sequelize, Prisma, at TypeORM. Sa huli, nagpasya akong tumuon na lang sa Sequelize at Prisma dahil wala akong oras upang ganap na masubukan ang tatlong magkakaibang ORM dahil sa mga takdang panahon.
Kapaligiran ng Pagsubok
Para sa aking kapaligiran ng pagsubok, pinatakbo ko ang Postgres sa pamamagitan ng Docker. Kinuha ko ang aming pinakamalaki at mas kumplikadong dataset, inilipat ito mula sa istruktura ng dokumento tungo sa istruktura ng talahanayan, at idinagdag ito sa aking lokal na instance ng Postgres. Inilipat ko ang dataset sa pamamagitan ng paggamit ng mga column, one-to-one na relasyon, one-to-many na relasyon, at ilang mga column ng JSONB.
Mula roon, susulatan ko ng JavaScript code na gagamit ng partikular na ORM na iyon at susukatin ko:
- Gaano katagal bago makalikha ng isang entry
- Gaano katagal bago mag-update ng isang entry
- Gaano katagal bago mag-update ng isang nested na entry (relasyon at/o key-value sa isang JSON)
- Gaano katagal bago mag-delete ng isang entry
- Gaano katagal bago mag-query/makakuha ng isang entry
Gumawa ako ng mga repo para sa bawat kapaligiran ng pagsubok ng ORM. Gusto ko sanang ibahagi ang mga repo na ito ngunit sa teknikal na aspeto ay pagmamay-ari ang mga ito ng eBay, kaya hindi ko sila maibabahagi.
Mga Resulta
Bandang Mayo 15, 2023, nagpasya ako na ang Sequelize ang mas mahusay na ORM para sa aming use case at na ito ang ORM na gagamitin para sa aming paglilipat mula sa MongoDB patungo sa 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 sa mga tampok ng Postgres.
- May magandang performance, lalo na kung ikukumpara sa Prisma.
- May mahusay na dokumentasyon, kahit na hindi kasinghusto ng dokumentasyon ng Prisma.
Nagpasya ako sa Sequelize, ngunit gumawa rin ako ng listahan ng mga kalamangan at kahinaan para sa bawat ORM na sinubukan ko sa pag-asang makatutulong ito sa mga tao na mas matukoy kung ang Sequelize o Prisma ay gagana para sa kanilang use case.
Mga Kalamangan at Kahinaan ng Sequelize
Mga Kalamangan:
- Mayroong sync() function na awtomatikong gumagawa at humahawak ng mga table para sa iyo
- Kayang humawak ng kumplikadong joins (nested na data)
- Sumusuporta sa maraming opsyon sa pag-filter (tulad ng Regex)
- Ang representasyon ng model/schema ay ginagawa sa raw na JavaScript gamit ang mga klase na lubos na nako-customize.
- Hinahawakan ng Sequelize ang mga koneksyon para sa iyong napiling database(s).
- Sinusuportahan ng Sequelize ang maramihang read-connections
- Sinusuportahan ang raw na SQL queries.
- Noong Mayo 15, 2023:
- Sa NPM, ang Sequelize ay huling na-update “14 days ago” at may 1,505,835 lingguhang downloads.
- Sa GitHub, ang Sequelize ay huling na-update “yesterday”, may 4.2k Forks, at 27.9k Stars.
- Ang Sequelize ay may MIT license at mahigit 10 taon nang open source. Kaya malamang na mananatili itong open source sa nakikitang hinaharap.
Mga Kahinaan:
- Ang representasyon ng model/schema ay maaaring maging napakakomplikado at sobrang laki. Halimbawa, ang representasyon ng Mongoose ng aming malaking dataset ay humigit-kumulang 262 linya (kasama ang mga espasyo). Ang parehong dataset na nirepresenta sa pamamagitan ng Sequelize ay 564 linya (kasama ang mga espasyo).
- Ang syntax ng Sequelize ay nagiging talagang nakakalito at kumplikado sa ilang mga kaso.
- Ang paglilipat ng iyong database (pag-eedit nito) ay napakasalimuot. Maaari mong gamitin ang sequelize-cli upang lumikha ng mga template script ng migration sa JavaScript. PERO, tila ganito rin ang kaso sa halos lahat ng ORM. Ang paglilipat sa isang relational database ay hindi madali sa karamihan ng mga kaso.
- Ang dokumentasyon ay hindi ganoon kaganda. Gumanda na ito ngunit kailangan pa rin ng pagbuti. Ngunit sa mga kasangkapan tulad ng ChatGPT, hindi na ito kasinglaki ng isyu tulad ng dati dahil ang ChatGPT ay may napakahusay na pag-unawa sa Sequelize, malamang dahil ang Sequelize ay umiiral na sa loob ng isang dekada.
- Ang Sequelize ay hindi kasing-sensitibo sa uri kumpara sa Prisma, na maaaring magdulot ng mga isyu.
- Hindi nito sinusuportahan nang maayos ang 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 ay mas madali at mas malinis mong magagawa ang iyong schema/model. Halimbawa, ang representasyon ng Mongoose ng aming malaking dataset ay humigit-kumulang 262 linya (kasama ang mga espasyo). Pero ang parehong dataset na nirepresenta ng Prisma ay 221 linya lamang (kasama ang mga espasyo).
- May CLI tool ang Prisma na nagpapadali sa paglikha at paglilipat (pagbabago) ng iyong database. Na napakakombinyente. Hindi ito isang silver bullet ngunit ito ang pinakamahusay na nakita ko hanggang ngayon mula sa isang ORM.
- Sinusuportahan ang raw na SQL queries.
- Malinis at simple ang code para sa Prisma. Kailangan mo pa ring matuto at masanay sa syntax ng Prisma ngunit mas madaling unawain ito kaysa sa syntax ng Sequelize.
- May client ang Prisma na awtomatikong lumilikha ng query builders para sa Node.js at TypeScript.
- Napakaganda at napakalinis ng dokumentasyon. Makakatulong pa rin ang ChatGPT ngunit hindi ito kasing-up to date tungkol sa Prisma gaya nito sa Sequelize.
- Noong Mayo 15, 2023:
- Sa NPM, ang Prisma ay huling na-update “6 days ago” at may 1,344,705 lingguhang downloads.
- Sa GitHub, ang Prisma ay huling na-update “3 hours ago”, may 1.1k Forks, at 31.3k Stars.
Mga Kahinaan:
- Hindi nito sinusuportahan ang Regex filtering para sa Postgres ngunit mayroon itong mga opsyon sa filter na “contains”, “includes”, at “startsWith”.
- Batay sa aking pagsubok, mas mabagal nang malaki ang Prisma sa paglikha ng mga entry ng aming malaking dataset sa Postgres. Ang Sequelize ay nakalikha 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 resultang ito, ang Prisma ay humigit-kumulang 5x na mas mabagal kaysa sa Sequelize sa gawaing ito.
- Bukod dito, ang pagbura ng isang entry mula sa malaking dataset ay nagresulta sa oras ng paghihintay na halos 4 minuto, na napakasama.
- Mas mabilis nang husto ang Sequelize sa pagbura ng isang entry sa pinakamalaki at pinakamakumplikadong dataset sa aking mga pagsubok. Walang bentahe ang Sequelize laban sa Prisma pagdating sa pagbuo ng dataset. Pareho nilang kinailangang harapin ang 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. Dahil dito, ang pangunahing ORM code/package ng Prisma ay open source na may Apache-2.0 license. Maganda ito, ngunit dahil may mga mamumuhunan ang Prisma, hindi ako magugulat kung gagayahin nila ang MongoDB pagdating sa kanilang lisensya.
Mga Pinagmulan
- 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