ทำความรู้จักกับ Prisma
technical review
ทำความรู้จักกับ Prisma
หากทุกคนรู้จัก Graphcool หรือ GraphQL แล้วตามหา Server ที่สามารถทำได้อย่าง Graphcool ละก็ Prisma มีคำตอบให้
อะไรคือ Prisma?
Prisma มาแทน ORMs ดั้งเดิมที่ลดความซ้ำซ้อนของการทำงานกับ database โดยที่สามารถ
- มี Type-safe database ที่ได้จากการทำ auto-generated ของ Prisma client
- ความสามารถที่จะทำ Migrate ข้อมูลได้จากข้อมูลที่มีอยู่แล้ว
- มี Prisma Admin ไว้ management ข้อมูล
การใช้งาน
Prisma สามารถใช้ได้ทุก context ที่ใช้ทำงานกับ database
- สร้างเป็น GraphQL server Prisma เหมาะมากที่จะเป็นเครื่องมือในการสร้าง GraphQL server สามารถที่จะใช้งานเข้าได้ดีกับ Apollo ecosystem ซึ่งโดยพื้นฐานจะรองรับ GraphQL subscription และ Relay style pagination มี end-to-end type safe และ build-in dataloader ที่แก้ปัญหา N+1 problem
- สร้างเป็น REST & gRPC APIs Prisma เข้ากันได้ดีสำหรับการสร้าง REST & gRPC APIs ซึ่งมันจะถูกใช้แทน ORMs ดั้งเดิม และมีความสามารถ type-safe มี modern API ที่ยืดหยุ่นในการเขียนและอ่านความสำพันธ์ของข้อมูล
แล้วทำไมต้องใช้ Prisma?
-
Simple database workflows เป้าหมายของ Prisma ลดความซับซ้อนของการทำงาน Database ดั้งเดิมและทำให้เข้าถึงข้อมูลได้ง่ายขึ้น ด้วย
- การทำ Type-safe Database ที่สามารถใช้ทำ auto-generated จาก Prisma Client
- สามารถที่จะสร้าง relation และ transaction data ได้
- มีความสามารถที่จะทำ Realtime streaming และ event system จาก database อาทิการรับรู้ถึงการอัปเดตหรือสร้างของข้อมูล
- ความสามารถที่ทำ database migration ได้อัตโนมัติผ่านการใช้
GraphQL's schema definition language (SDL)
-
Clean and layered architecture
ในการพัฒนาโปรแกรม มักจะมีความซับซ้อนในการเข้าถึงฐานข้อมูลที่ปลอดภัย การจัดการการ synchronization การ query ข้อมูล การ optimization และ performance ซึ่งก็ขึ้นยากง่ายแตกต่างกันไปแต่ละ database ที่เลือกใช้
หนึ่งในการแก้ไขปัญหานี้คือการใช้
data access layer (DAL)
ที่จะเอาความซับซ้อนของการเข้าถึงฐานข้อมูลออกไป โดย API ของ DAL ถูกใช้ด้วย Application Server ซึ่งให้นักพัฒนาสามารถเข้าถึงและใช้งานโดยไม่ต้องกังวลถึงความปลอดภัยและประสิทธิภาพในการเข้าถึง databasePrisma มีความสามารถที่จะ Auto-generated DAL ตามหลักการของผู้นำเทคโนโลยีอย่าง Twitter และ Facebook นี่จึงนำไปสู่การสร้างโปรเจคที่ Clean Architecture ช่วยให้เริ่มต้นและมี Boilerplate ประหยัดในการเขียนต้นแบบในการเขียนต่อกับ Database กับ Application Server
มีอะไรภายใต้หน้ากาก
Prisma ใช้ GraphQL ในการนิยามมาตราฐานการสร้าง database หมายความว่ามันสามารถทำอะไรที่ GraphQL API ทำได้ อาทิ
- การอ่านและการเขียน จะใช้ GraphQL queries และ mutations
- การได้รับ database event แบบ realtime ผ่าน GraphQL subscriptions
- การ Migration และ model ข้อมูลโดยการใช้ SDL
เมื่อ Prisma Client ทำการร้องขอ Prisma Server แท้จริงแล้วมันจะ Generate GraphQL Operations แล้วส่งไปที่ GraphQL API ของ Prisma เอง และ Client เมื่อได้ จะแปลงผลลัพธ์ผ่าน GraphQL Response ให้เป็นโครงสร้างที่คาดหวังและส่งคืน Method ที่เรียกใช้
Get Started
คงไม่ต้องเขียน demo ให้ดูเพราะเขามี demo ให้เสร็จสรรพ แถมมี ตัวอย่าง อีกมากมายให้ใช้สอย
Pros and Cons
-
Pros
- สามารถ Implement Database ได้ทั้ง MySQL, PostgreSQL และ MongoDB โดยใช้การเขียนการ Query แบบเดียวที่เรียกว่า Data access layer (DAL)
- หากทำเพียง CRUD กระบวนการ สร้าง แสดง อัปเดต หรือลบ แม้กระทั่งกระ Subscribe เพื่อทำ realtime ก็ตาม เหมาะมากที่จะใช้
- สามารถเขียนไปเชื่อมต่อเป็น GraphQL หรือ Rest API หรือใดๆตาม API Server นั้นๆ
- หากใช้ GraphQL เป็น API ขอแนะนำ nexus-prisma ที่จะใช้ช่วย generate เป็น schema ของ graphQL จาก SDL ของ prisma เอง
-
Cons
- ด้วยความที่เป็น Tools ที่ใช้หลักการ DAL ฉะนั้นหากจำเป็นจะต้อง customize ข้อนี้ถึงค่อนข้างลำบาก
- Prisma ดูเหมือนจะเป็นของใหม่อยู่ ซึ่งนั่นมักจะมี Bug ที่ไม่ได้คาดฝันได้
- Prisma หากใช้ Database MongoDB จะใช้การเขียน SDL ได้ไม่เต็มความสามารถ บางฟีเจอร์ที่เกี่ยวข้องกับ Relation จะไม่สมบูรณ์ เช่น ในตอนนี้ไม่สามารถ save แบบ transaction ได้ หรือแม้กระทั่งกระบวน migration ของ Prisma เองในการปรับแต่ง DAL
- Prisma กำลังปรับเปลี่ยน version 1 ไป 2 นี่ทำให้ version แรกจะไม่ได้อัปเดตแล้วหากจะมีเพียงปรับแก้บัคเท่านั้น และเวอร์ชั่นใหม่ยังไม่สมบูรณ์ ก็ต้องรอกันต่อไป
สรุปในสรุป
Prisma ค่อนข้างน่าสนใจมาก หากต้องการเขียน Server ในการใช้ GraphQL ควบคู่ไปด้วย (ถึงแม้ว่าจะเขียนเป็น REST API ก็ได้) แต่ก็ยังมีจุดที่กำลังปรับปรุงพอสมควร ทั้งยังกำลังมี Prisma version 2 ที่กำลังพัฒนารอๆกันต่อไป :D
Reference
- https://www.prisma.io/
-
https://nexus.js.org/docs/nexus-prisma
ส่วนมากแล้วจะเป็นการแปลจาก document ของเว็บที่ได้ reference ซึ่งได้มีปรับไปบ้าง ซึ่งอาจจะไม่เหมือนซะทีเดียวตามความเข้าใจของผู้เขียน
หากไม่เข้าใจ อะไรอย่างไรติชมได้นะเพื่อที่จะปรับปรุงในครั้งหน้า
หวังว่าจะได้รับประโยชน์จากการอ่านครั้งนี้ครับ :)