จากการแบ่งปันการพัฒนา RESTful API ด้วยภาษา Go
มีคำถามว่า ในการจัดการข้อมูลใน database ควรใช้อะไรดี ?
จะใช้งาน ORM หรือ Native SQL ดี ?
จึงทำการสรุปคำตอบไว้นิดหน่อย
มาดูในภาษา Go หรือภาษาอื่น ๆ จะมีแนวทางจัดการข้อมูลใน database ดังนี้
- Native SQL คือ เขียนชุดคำสั่ง SELECT, INSERT, UPDATE และ DELETE เอง
- SQL Builder จะเป็น library ช่วยให้สร้างชุดคำสั่ง SQL ง่าย ๆ
- ORM เป็นตัวช่วยในการ mapping ระหว่าง table ใน database กับ Data/Entity class ในภาษาต่าง ๆ เช่น Go ก็คือ Struct ส่วนใน Java ก็เป็น Class หรือ record นั่นเอง เช่น GORM และ XORM
ถ้าแนะนำจากประสบการณ์นิดหน่อยที่ผ่านมานั้น
ให้เริ่มจากการใช้งานแบบ Native SQL ก่อน
เพื่อให้ให้รู้และเข้าใจว่าแต่ละขั้นตอนเป็นอย่างไร
ประกอบไปด้วย
- การ config พวก database driver
- การสร้าง database connection ไปจนถึงพวก connection pool
- การสร้าง statement สำหรับทำการ execute ชุดคำสั่ง SQL ทั้ง CRUD
- การดึงข้อมูลใน table มาอนู่ในรูปแบบของ data class และ struct
- การจัดการ transaction ของการทำงาน เพื่อให้เข้าใจ boundary ของ transaction
- การคิด resource ต่าง ๆ ที่สร้างออกมา เช่น database connection เป็นต้น
โดยตอนนี้เราสามารถมีเครื่องมือช่วยเหลือ
ทั้ง DBML และ sqlc
ต่อมาจึงเริ่มมาที่ SQL Builder และ ORM ต่อไป
แต่ก็มีทั้งข้อดีและข้อเสีย
ข้อดีคือ productivity ในการพัฒนาจะดีมาก ๆ
เพราะว่าช่วยลดขั้นตอนที่ไม่จำเป็นออกไปเยอะมาก ๆ
เราสนใจเพียงการออกแบบ และ mapping เท่านั้น
แต่สิ่งที่น่ากลัว หรือ ต้องพึงระวังคือ การทำงานภายในที่เราไม่รู้ !!
ต้องทำความเข้าใจอย่างมาก
ยกตัวอย่างเช่น
- การจัดการความสัมพันธ์ หรือ relation ของแต่ละ table/entity
- การดึงข้อมูลจาก table ที่มีความสัมพันธ์กันว่าดึงอย่างไร เยอะไหม เช่น eager และ lazy loading เป็นต้น
- อย่าลืมดูชุดคำสั่งที่ ORM ทำการ generate ออกมาด้วยเสมอ
- เมื่อมีข้อมูลเยอะขึ้น อย่าลืมทำการทดสอบ เพื่อดูเรื่อง performance ด้วย
- เรื่องของ explain หรือ analyze SQL ก็สำคัญมาก ๆ
- ยิ่งมีความซับซ้อนมากขึ้น ยิ่งต้องระวัง
อีกอย่างการใช้งาน ORM ต้องเข้าใจแนวคิดด้วย
ว่าพยายามให้เป็นการออกแบบ table ต่าง ๆ ด้วย code-first
จากนั้นทำการ generate ไปยัง database server อีกที
แต่สิ่งที่เจอบ่อยมาก ๆ มักจะตรงข้ามคือ
คนออกแบบ table ก็ไปทำที่ database server ไป
ส่วน developer ก็เขียน mapping เอาเอง
ต่างฝ่ายต่างทำ ทำให้ปัญหาเกิดขึ้นเยอะ !!
ลองศึกษาเพิ่มเติมกันดูครับ
เดี๋ยวนี้มีให้เลือกเยอะมาก ๆ
หรือดู library ของภาษา Go เพิ่มได้ที่ Awesome Go
Reference Websites