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 ที่ดีกว่าสำหรับกรณีการใช้งานของเรา และจะเป็น 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 อัปเดตล่าสุดเมื่อ “เมื่อวานนี้” มี Fork 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 ของ ChatGPT ไม่เป็นปัจจุบันเท่ากับข้อมูลเกี่ยวกับ Sequelize
- ณ วันที่ 15 พฤษภาคม 2023:
- บน NPM Prisma อัปเดตล่าสุดเมื่อ “6 วันที่แล้ว” และมียอดดาวน์โหลดรายสัปดาห์ 1,344,705 ครั้ง
- บน GitHub Prisma อัปเดตล่าสุดเมื่อ “3 ชั่วโมงที่แล้ว” มี Fork 1.1k รายการ และมีดาว 31.3k ดวง
ข้อเสีย:
- ไม่รองรับการกรองด้วย Regex สำหรับ Postgres แต่มีตัวเลือกการกรอง “contains”, “includes” และ “startsWith”
- จากการทดสอบของฉัน Prisma ช้ากว่ามากในการสร้างรายการจากชุดข้อมูลขนาดใหญ่ของเราใน Postgres โดย Sequelize สร้างรายการขนาดใหญ่เหล่านั้นด้วยอัตราประมาณ 2.26 วินาทีต่อรายการ (ไฟล์ JSON) ในขณะที่ Prisma มีอัตราประมาณ 11.21 วินาทีต่อรายการ (ไฟล์ JSON) จากผลลัพธ์เหล่านี้ Prisma ช้ากว่า Sequelize ประมาณ 5 เท่าสำหรับงานนี้
- นอกจากนี้ การลบรายการหนึ่งรายการจากชุดข้อมูลขนาดใหญ่ส่งผลให้ต้องรอเกือบ 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