Sequelize dhidi ya Prisma

Mwanzo

Hivi sasa kwenye eBay, ninabadilisha zana zetu za ndani kutoka kutumia MongoDB kwenda Postgres. Mradi ambao ni mgumu sana lakini nina msukumo wa kukabiliana nao moja kwa moja. Wakati wa kufanya utafiti, nilibaini kwamba kwa msimbo wetu wa msingi, kutumia ORM ingekuwa bora kwa sababu msimbo tayari ulikuwa umeundwa kutumia Mongoose. Lakini sasa changamoto ni, ni ORM gani itakayofaa zaidi kwa msimbo wetu wa msingi? Katika blogu hii, nitachunguza swali hilo. Tafadhali kumbuka kwamba siwezi kufichua kila kitu katika blogu hii kutokana na asili ya mawasiliano yangu na mwajiri wangu.

Mahitaji

Baada ya uchambuzi wa kina wa mahitaji ya mradi, nilianzisha vigezo muhimu vifuatavyo ambavyo suluhisho lolote la ORM lingetakiwa kutimiza:

  • Kuwa kifurushi cha JavaScript; kwa kuwa sehemu kubwa ya msimbo imeandikwa kwa JavaScript
  • Lazima iunge mkono Postgres na sifa zake nyingi
  • Utendaji wake lazima uwe angalau sawa au bora kuliko Mongoose
  • Lazima iwe chanzo wazi na iendelezwe/ientedeshwe

ORMs

Baada ya kufanya utafiti mwingi, nilibaini ORMs tatu za juu ambazo zinaendana na mahitaji ni: Sequelize, Prisma, & TypeORM. Hatimaye niliamua kuzingatia tu Sequelize na Prisma kwa sababu sikuwa na muda wa kupima ORMs tatu tofauti kikamilifu kutokana na tarehe ya mwisho.

Mazingira ya Upimaji

Kwa mazingira yangu ya upimaji, nilifanya Postgres kupitia Docker. Nilichukua seti yetu kubwa zaidi na yenye muundo mgumu zaidi wa data, nikaiwabadilisha kutoka muundo wa hati (document) kwenda muundo wa jedwali, na kuiongeza kwenye mfano wangu wa Postgres wa ndani. Nilibadilisha seti ya data kwa kutumia safu (columns), uhusiano wa moja kwa moja (one-to-one), uhusiano wa moja kwa wengi (one-to-many), na baadhi ya safu za JSONB.

Kutoka hapo, ningeandika msimbo wa JavaScript ambao unatumia ORM maalum hiyo na kupima:

  • Ni muda gani ungechukua kuunda kipengee
  • Ni muda gani ungechukua kusasisha kipengee
  • Ni muda gani ungechukua kusasisha kipengee kilicho ndani (uhusiano na/au ufunguo-thamani katika JSON)
  • Ni muda gani ungechukua kufuta kipengee
  • Ni muda gani ungechukua kuuliza/kupata kipengee

Niliunda repos kwa kila mazingira ya mtihani ya ORM. Ningependa kushiriki repos hizi lakini kwa kiufundi zinamilikiwa na eBay, hivyo siwezi kuzishiriki.

Matokeo

Kujaribu karibu Mei 15, 2023, niliamua kwamba Sequelize ilikuwa ORM bora kwa matumizi yetu na kwamba itatumika kwa uhamishaji wetu kutoka MongoDB hadi Postgres. Hatimaye, nilichagua Sequelize kwa sababu:

  • Ilikuwa “chanzo wazi kwa kweli” na haikuendelezwa na kampuni iliyopata ufadhili.
  • Ilikuwa inasaidia sifa nyingi za Postgres.
  • Ilikuwa na utendaji mzuri, hasa ikilinganishwa na Prisma.
  • Ina nyaraka nzuri, ingawa si za kiwango sawa na nyaraka za Prisma.

Niliamua kutumia Sequelize, lakini pia nilitayarisha orodha ya faida na hasara kwa kila ORM niliyopima kwa matumaini kuwa itawasaidia watu kuamua zaidi ikiwa Sequelize au Prisma itafaa kwa matumizi yao.

Faida na Hasara za Sequelize

Faida:

  • Ina kazi ya sync() ambayo huunda na kushughulikia meza (tables) kwako moja kwa moja
  • Inaweza kushughulikia joins ngumu (data zilizojengwa ndani)
  • Inaunga mkono chaguzi nyingi za kuchuja (kama Regex)
  • Uwawakilishi wa modeli/chema (model/schema) unafanywa kwa JavaScript mbichi kwa kutumia madarasa (classes) ambayo yanaweza kubadilishwa kwa urahisi.
  • Sequelize inashughulikia muunganisho kwa hifadhidata(za) ulizochagua.
  • Sequelize inaunga mkono muunganisho wa kusoma mara nyingi (multiple read-connections)
  • Inaunga mkono maswali ya SQL mbichi (raw SQL queries).
  • Kuanzia Mei 15, 2023:
    • Kwenye NPM, Sequelize ilisasishwa kwa mara ya mwisho “14 days ago” na inapata upakuaji wa 1,505,835 kwa kila wiki.
    • Kwenye GitHub, Sequelize ilisasishwa kwa mara ya mwisho “yesterday”, ina 4.2k Forks, na 27.9k Stars.
    • Sequelize ina leseni ya MIT na imekuwa chanzo wazi kwa zaidi ya miaka 10. Kwa hivyo kuna uwezekano mkubwa itaendelea kuwa chanzo wazi kwa muda unaoonekana mbele.

Hasara:

  • Uwawakilishi wa modeli/chema unaweza kuwa mgumu sana na kuongezeka kwa ukubwa. Kwa mfano, uwakilishi wa Mongoose wa seti yetu kubwa ya data ulikuwa takriban mistari 262 (ikiwa ni pamoja na nafasi). Seti ile ile ikiwakilishwa kupitia Sequelize ni mistari 564 (ikiwa ni pamoja na nafasi).
  • Sintaksia ya Sequelize inachanganya na kuwa ngumu kwa baadhi ya matukio.
  • Kuhamisha hifadhidata yako (kuirekebisha) ni kero kubwa. Unaweza kutumia sequelize-cli kuunda templeti za skripti za uhamisho wa JavaScript. LAKINI, hii inafanana katika karibu ORMs zote. Kuhamisha katika hifadhidata ya relational si rahisi katika mara nyingi ya matukio.
  • Nyaraka sio nzuri sana. Imeboreshwa lakini bado inahitaji kazi. Lakini kwa zana kama ChatGPT, hili sio shida kubwa kama ilivyokuwa hapo awali kwa kuwa ChatGPT ina ufahamu mzuri wa Sequelize, labda kutokana na Sequelize kuwepo kwa muongo mmoja.
  • Sequelize sio nyeti sana kuhusu aina (type-sensitive) ikilinganishwa na Prisma, jambo ambalo linaweza kusababisha matatizo.
  • Haikuunga mkono TypeScript vizuri, ambayo kwa mradi wangu sio tatizo lakini kwa miradi mingine mingi inaweza kuwa suala kubwa.

Faida na Hasara za Prisma

Faida:

  • Ina lugha yake ya schema. Hii inamaanisha kwamba unaweza kuunda schema/model kwa urahisi zaidi na usafi. Kwa mfano, uwakilishi wa Mongoose wa seti yetu kubwa ya data ulikuwa takriban mistari 262 (ikiwa ni pamoja na nafasi). Lakini seti ile ile ikiwakilishwa na Prisma ilikuwa mistari 221 tu (ikiwa ni pamoja na nafasi).
  • Prisma ina zana ya CLI ambayo inayonifanya iwe rahisi kuunda na kuhama (kurekebisha) hifadhidata yako. Ambayo ni ya kufaa sana. Si risasi ya fedha zote (silver bullet) lakini ni kitu bora nilichokiona hadi sasa kutoka kwa ORM.
  • Inaunga mkono maswali ya SQL mbichi.
  • Msimbo wa Prisma ni safi na rahisi. Bado unapaswa kujifunza na kuzoea sintaksia ya Prisma lakini ni rahisi kuelewa kuliko sintaksia ya Sequelize.
  • Prisma ina client ambayo inatengeneza mojawapo kwa moja majengo ya maswali kwa Node.js & TypeScript.
  • Nyaraka ni nzuri sana na safi. ChatGPT bado anaweza kusaidia lakini sio kila wakati za kisasa kuhusu Prisma kama ilivyo kwa Sequelize.
  • Kuanzia Mei 15, 2023:
    • Kwenye NPM, Prisma ilisasishwa kwa mara ya mwisho “6 days ago” na inapata upakuaji wa 1,344,705 kwa kila wiki.
    • Kwenye GitHub, Prisma ilisasishwa kwa mara ya mwisho “3 hours ago”, ina 1.1k Forks, na 31.3k Stars.

Hasara:

  • Haunga mkono kuchuja kwa Regex kwa Postgres lakini ina chaguzi za kuchuja kama “contains”, “includes”, na “startsWith”.
  • Kutokana na vipimo vyangu, Prisma ni polepole kwa kiasi kikubwa katika kuunda vipengee vya seti yetu kubwa ya data katika Postgres. Sequelize iliunda vipengee vikubwa hivyo kwa kiwango cha takriban sekunde 2.26 kwa kipengee (faili ya JSON). Wakati Prisma ilikuwa na kiwango cha takriban sekunde 11.21 kwa kipengee (faili ya JSON). Kulingana na matokeo haya, Prisma ni takriban mara 5 polepole kuliko Sequelize katika kazi hii.
  • Pia, kufuta kipengee kimoja kutoka kwa seti kubwa ya data kulisababisha wakati wa kusubiri wa karibu dakika 4, jambo ambalo ni mbaya sana.
  • Sequelize ilikuwa kwa kiasi kikubwa ya haraka zaidi katika kufuta kipengee katika seti kubwa na yenye muundo mgumu zaidi katika vipimo vyangu. Sequelize haikuwa na faida zaidi juu ya Prisma linapokuja uundaji wa seti ya data. Wote wawili walipaswa kushughulikia uhusiano uliofunganisha tabaka tatu kwa seti hii kubwa, hivyo ningesema ilikuwa kulinganisha haki.
  • Prisma ni kampuni ya kuanza (startup), ikimaanisha Prisma ni kampuni yenye faida na ufadhili wa $56.5 milioni. Ukiwa umefahamu hili, msimbo/mfuko mkuu wa ORM wa Prisma ni chanzo wazi chini ya leseni ya Apache-2.0. Hii ni nzuri, lakini kwa kuwa Prisma ina wawekezaji, singeshangaa iwapo wangefanya mabadiliko ya leseni kama MongoDB walivyofanya.

Vyanzo