เรื่องของเรื่องคือ ตอนนี้กำลังทำโปรเจ็คส่วนตัวอยู่ โดยจากทราฟฟิคที่เคยทำได้จากเว็บ kratooded.com นั้น เคยพีคๆอยู่ที่ราวๆ 200,000 unique IP ในเวลาเดียวกัน ซึ่งตอนนั้นยังใช้แค่ VPS ในไทยธรรมดา แถมไม่ได้ใช้ Cloudflare เพื่อทำ Caching อะไรเลย สุดท้ายก็อย่างที่รู้ๆกัน พัง ค้างจ้าา

หลังจากนั้น ผมก็เปลี่ยนมาใช้ VPS ใน DigitalOcean และใช้ Cloudflare เข้าช่วย เพื่อทำ CDN ปรากฏว่าแก้ปัญหาไปได้เกือบ 80% เลยทีเดียว แต่จากปัญหาที่เจอในครั้งนั้น ทำให้ผมยังหลอนอยู่จนถึงทุกวันนี้ จนถึงคราวที่มีโอกาสทำโปรเจ็คของตัวเอง ก็เลยเป็นอะไรที่อยากเตรียมความพร้อมรับมือกับ concurrent ระดับสูงให้ได้มากที่สุดเท่าที่จะรับได้

นั่นคือที่มาของการใช้ MongoDB ที่ผมเคยได้ยินชื่อมานานแล้วว่า เหมาะกับงานในสเกลใหญ่มากกว่า MySQL

MongoDB คืออะไร?

MongoDB เป็นฐานข้อมูลอีกประเภทหนึ่งที่แตกต่างจาก MySQL โดยฐานข้อมูลประเภทนี้จะอยู่ในประเภท NoSQL ซึ่ง MySQL นั้นจะเป็นประเภท RDBMS หรือ Relational Database Management System ซึ่งแปลง่ายๆว่า ระบบฐานข้อมูลที่สัมพันธ์กัน

โดยปกติแล้ว ถ้าเราคุ้นเคยกับการใช้ MySQL เราจะคุ้นเคยกับการทำ Relation หรือที่เรียกว่า Join Relation ระหว่าง table ซึ่งนั่นคือข้อดีที่ได้จากฐานข้อมูลประเภท RDBMS นี้ แต่พอมาเป็นฐานข้อมูลแบบ NoSQL แล้ว จะไม่มีการเก็บข้อมูลแบบ Relation เลย (อันที่จริงมันก็มีวิธี แต่ต้องเข้าใจว่า มันไม่ได้เกิดมาเพื่อเป็นฐานข้อมูลประเภทนั้น)

MongoDB นั้นเก็บข้อมูลเป็นแบบ JSON Document ในขณะที่ MySQL เก็บข้อมูลแบบ Table และ Row ซึ่งข้อแตกต่างที่เห็นได้อย่างชัดเจนที่สุด คือการเก็บข้อมูลแบบ JSON Document ใน MongoDB นั้น ไม่จำเป็นต้องกำหนดโครงสร้าง (Structure) ของ Collections ก่อนแบบ MySQL (ใน MongoDB นั้น เราจะเรียก table ว่า collections และเรียก row ว่า document)

และสิ่งที่สำคัญกว่ามากสำหรับ MongoDB คือ มันเร็วกว่ามาก มาก มากกกกก ด้วยความที่ MongoDB นั้นไม่มีการ Relation เหมือนอย่าง RDBMS อย่าง MySQL ทำให้โครงสร้างของมันที่เป็น JSON Object นั้นสามารถอ่านได้เร็วกว่ามากๆ แต่นั่นก็ขึ้นอยู่กับวิธีการเขียนและการออกแบบฐานข้อมูลของเราเช่นกัน

เปรียบเทียบ MongoDB และ MySQL

ลองมาดูรูปตารางเปรียบเทียบกันก่อน เพื่อความเข้าใจตรงกัน ว่าโครงสร้างใน MongoDB นั้นจะเปรียบเทียบได้กับอะไรใน MySQL

MongoDB ไม่ใช่เทพเจ้า บางโปรเจ็คมันก็ไม่เหมาะ!

ใช่ครับ แม้ว่าบล็อคนี้ผมจะเขียนถึงข้อดีของการใช้ MongoDB แต่เราก็ต้องยอมรับความจริงว่า มันไม่ได้เกิดมาเพื่อเป็นเทพเจ้าที่สามารถแก้ปัญหาได้ทุกอย่าง ถ้าจะอธิบายให้เหมาะ ต้องย้อนกลับไปเล่าให้ฟังว่า แต่ก่อนนั้น MySQL ซึ่งเป็นฐานข้อมูลแบบเก่า เกิดมาในยุคที่ราคา Hardware แพงกว่า Software ซึ่งทำให้ฐานข้อมูลที่ถูกใช้กันในยุคนั้น ต้องสามารถใช้ประโยชน์จาก Hardware ให้ได้มากที่สุด ซึ่งหากในระยะยาว ฐานข้อมูลโตขึ้นเรื่อยๆ ก็มักจะใช้วิธีอัพเกรดเซิฟเวอร์แทน ซึ่งวิธีนี้ เราเรียกว่า Vertical Scaleble หรือการขยายในแนวตั้ง

ส่วน MongoDB นั้น ลดความสามารถด้าน Relation ลง เพื่อทำงานให้เร็วขึ้น หมายความว่า หากเราจำเป็นต้อง relate ระหว่าง collection จริงๆ ก็ต้องใช้วิธีดึงข้อมูล 2 ครั้ง (หรือใช้วิธี relation ที่ MongoDB มีให้ อย่าง embed , referencing) ซึ่งคอนเซ็ปแบบนี้ เกิดขึ้นในยุคปัจจุบัน ที่ราคา Hardwere นั้นถูกกว่า Software หรือ Business Model นั้นมีค่ามากกว่า

อย่างไรก็ตาม เหมือนในหัวข้อ บางโปรเจ็คนั้นก็ไม่ได้เหมาะที่จะใช้งาน MongoDB เท่าไหร่นัก แล้วอะไรบ้างที่ไม่เหมาะกับการใช้ MongoDB เช่น

– ระบบการเงิน ที่ต้องการทำงานแบบ transaction

– ระบบที่จำเป็นต้องมีการ JOIN relation เยอะๆ และซับซ้อน

อะไรที่เหมาะกับ MongoDB

– ระบบใหญ่ๆที่มีการอ่าน มากกว่าการเขียน (Insert มากกว่า Query นั่นแหละ)

– ระบบใหญ่ๆที่ไม่จำเป็นต้องมีการ relation มากนัก (หรือสามารถออกแบบให้ไม่ต้อง relation ได้)

แล้วทำไม MongoDB คือคำตอบของโปรเจ็คที่ผมทำหละ?

อย่างที่ผมบอกตั้งแต่แรก ด้วยความที่ผมมีประสบการณ์แย่ๆจาก MySQL ตอนที่มี Concurrent ราว 2แสนในเวลาเดียวกัน ถึงแม้ว่าตอนนั้นจะเป็นความผิดพลาดที่ผมไม่ได้เตรียมพร้อมเรื่อง caching ไว้ก็ตาม แต่นั่นก็ทำให้ผมตระหนักได้ว่า MySQL มันน่าจะไม่ไหวจริงๆ บวกกับลองอ่านข้อมูลจากหลายๆแหล่ง ไม่ว่าจะเป็น Stackoverflow หรือ Medium จากโปรแกรมเมอร์เก่งๆทั้งในไทยและต่างประเทศ ทำให้ผมรู้สึกว่า เออ MongoDB นี่แหละ มันอาจจะตอบโจทย์เราได้ในระยะยาว

ลองใช้แล้วเป็นยังไง?

ตอนนี้โปรเจ็คยังไม่เสร็จครับ แต่เท่าที่ใช้มาในระหว่างที่กำลังพัฒนาโปรเจ็ค ยังไม่พบความแตกต่างอย่างมีนัยะสำคัญมากนัก เลยยังไม่สามารถบอกได้ว่ายังไง แต่อย่างไรก็ตาม คีย์เวิร์ดสำคัญอยู่ตรงนี้ เพราะผมกำลังจะใช้ MongoDB ร่วม GraphQL ซึ่งนั่นจะยิ่งทำให้ความเร็วในการทำงานของฐานข้อมูลนั้นยิ่งเร็วขึ้นไปอีก และบลดทรัพยากรลงไปได้อีก ส่วน GraphQL ใช้แล้วเป็นยังไง เดี๋ยวผมจะมาเหลาให้ฟังอีกทีครับ

สรุป

สำหรับผมแล้ว MongoDB นั้นไม่ได้ใช้ Learning Curve ที่สูงมากนักในการเรียนรู้ และที่สำคัญ มันยังสามารถทำงานได้กับหลายๆภาษาและเฟรมเวิร์คที่ผมถนัด อย่าง Codeigniter ซึ่งหากใครคิดว่า กำลังอยากลองอะไรใหม่ๆละก็ MongoDB ก็เป็นอะไรที่ผมแนะนำครับ