จากการแบ่งปันการพัฒนา 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