mongoDB คือชื่อของ Database แบบ NoSQL แบบหนึ่ง (อ่านต่อเรื่อง NoSQL กับ NoSQL คืออะไร) โดยเราไม่ต้องเตรียมสร้าง table , field เอาไว้รอก่อน เหมือนอย่าง Database ทั่วไป คิดอยากจะเก็บอะไรก็เก็บเข้าไปได้เลย
มันไม่ใช่ Relational database ดังนั้นไม่ต้องสร้างโครงสร้างก่อนใช้
หรือพูดง่ายๆคือ ไม่ต้องกำหนดโครงสร้างข้อมูลที่เราจะเก็บ แค่คิดอยากจะเก็บอะไรก็เก็บเข้าไปได้เลย
เร็วกว่า MySQL เหรอ? ถูกแค่ครึ่งเดียว
ขอเปรียบเทียบความเร็วกับ MySQL แล้วกัน จะได้เข้าใจง่ายๆ ซึ่งมีคนทำเอาไว้แล้วเมื่อประมาณ ปลายปี 2015 [https://github.com/webcaetano/mongo-mysql] โดยเค้าทดสอบ การเขียน (insert) และอ่าน (select) ด้วย node.js (อ่านเพิ่มเติม node.js คืออะไร) พบว่า mongoDB ใช้เวลาน้อยกว่า ในการเขียนข้อมูลอย่างเห็นได้ชัด แต่ว่า การอ่านข้อมูลออกมา ยังช้ากว่าอย่างเห็นได้ชัดเช่นกัน ดังนั้น มันไม่ได้เร็วกว่า MySQL ไปซะทั้งหมด
เหมาะสำหรับงานเก็บข้อมูลแบบ Document base
ถ้านึกไม่ออกให้นึกข้อมูลแบบโครงสร้าง JSON ครับดังรูป
image from : https://www.flickr.com/photos/bionicteaching/19898528539
จะเห็นได้ว่า ข้อมูลมีการเก็บเป็นโครงสร้าง ลำดับขั้น และเราก็สามารถเรียกข้อมูลได้ด้วยการ เชื่อม dot ลงไปเรื่อยๆครับ การเก็บข้อมูลของ mongoDB เป็นแบบนั้นเลย เมื่อเราเก็บข้อมูลเข้าไป หรืออ่านออกมา เราจะได้ข้อมูลดิบหน้าตาแบบฝั่งซ้ายของรูป แล้วการจะเรียกข้อมูลบางค่าออกมาใช้ ก็เรียกได้ด้วยหน้าตาแบบขวามือ นั่นคือการเจาะจง
หน้าตาแบบนี้ ให้นึกถึงกระทู้พันทิปครับ ที่จะมีคำถาม แล้วคนตอบ ก็ตอบต่อๆกันไป มันจะเก็บลงแค่ document เดียวเท่านั้นครับ แต่ถ้าเราเขียนแบบ relation เช่น MySQL คงต้องสร้างหลาย table แล้วต้องเอามา Join กันอีก แต่ mongoDB แค่ document เดียวอยู่เลย
การอ่านข้อมูลที่ relate ระหว่าง collection อาจจะเกิดความยุ่งยาก
ก็เพราะว่ามันแยกเก็บจากกันนี่แหล่ะ และรวมกับไม่มีการ Join กันของข้อมูลได้ ดังนั้น เวลาใช้ mongoDB หากเราแยกเก็บ collection user profile กับ user activity ออกจากกัน เมื่ออยากรู้ว่า user profile ไหน มีการเล่นกิจกรรมอะไรบ้าง ก็ join กันไม่ได้ ทำให้ mongoDB ต้องอ่านข้อมูล profile id ออกมาก่อนแล้วค่อยเอา profile id ไปหาใน collection activity ที่มี profile id ตรงกันอีกทีหนึ่ง (ทำสอง step)
ต้องเข้าใจโครงสร้าง และการเขียนให้ดี ไม่งั้น งง
เราต้องเรียนรู้การตั้งชื่อ collection ที่ดี และสื่อความหมายด้วย เช่น user.profile ก็คือเก็บแค่ user profile เท่านั้น เพราะว่าเวลาเราจะเก็บ activity ที่เค้าเคยทำไว้ เราก็ควรแยก collection กันเราก็จะเขียนได้ว่า user.activity ก็จะเข้าใจได้ว่า นี่คือ activity ทั้งหมด เพื่อให้แยกข้อมูลกันอย่างชัดเจน และยังสามารถทำงานเชื่อมโยงกันได้ เมื่อเราต้องการเรียกข้อมูล user สักคนนึง พร้อม activity เราต้องเรียกจาก user.profile และ user.activity ที่มี id = 19 คือต้องเรียกสองครั้ง เพราะว่า join กันไม่ได้
เขียนไม่ถูกหลัก จะทำให้ช้ากว่าเดิมอีก
หากผมคิดแค่ว่า user.profile คือเก็บข้อมูลทุกอย่างของ user แล้วล่ะก็ บอกเลยว่า ผลที่ได้ในระยะยาวมันจะช้ากว่าการใช้ MySQL อย่างแน่นอน(จริงๆมันก็ช้ากว่าอยู่แล้วนะ)เพราะว่า การที่เราเรียกข้อมูลจาก user.profile ออกมา ข้อมูลมันจะส่งออกมาเยอะมากๆทุกครั้ง แล้วนั่นคือการเปลือง resouce โดยไม่จำเป็นครับ เราจึงต้องเรียนรู้ว่า การจะอ่านข้อมูลแต่ละส่วนออกมาได้แบบเฉพาะเจาะจงต้องทำอย่างไรบ้าง
ต้องออกแบบ index เหมือนกันนะ
mongoDB เองก็มีการให้เรากำหนด field ที่เป็น index เช่นกัน เพื่อการเรียกข้อมูลที่มีเงื่อนไขให้รวดเร็วขึ้น ดังนั้น ก็ต้องเข้าใจเรื่อง index และการทำงานเชิงลึกด้วยเพื่อให้ทำงานเร็วอย่างที่เราอยากให้เป็น
เลือกใช้ให้เหมาะกับงาน
อย่างที่บอกว่ามันเขียนได้เร็วมาก หากเราเอามาใช้งานปริมาณจำนวนครั้งของการอ่านข้อมูลสูงกว่าการเขียนข้อมูลมากๆแล้วล่ะก็อาจจะไม่คุ้มก็ได้ ดังนั้น มันไม่ใช่อะไรที่เจ๋งสุดยอด เราต้องใช้อย่างเหมาะสม แต่บางคนอาจจะบอกว่า ไม่เป็นไรเดี๋ยวไปทำ caching เพิ่ม อ่านช้าแค่ครั้งเดียว ที่เหลืออ่านจาก caching เอา ก็ไม่ว่ากันครับ (ใช้ตัวอื่นที่เหมาะสมกว่านี้ดีกว่ามั้ย)
mongoDB เขียนแบบนี้ด้วยจึงจะถูกต้องที่สุด
หลายคนเขียนผิดๆถูกๆ ต้องเขียน mongoDB แบบนี้ถึงจะถูกต้องที่สุดครับ
ก็คิดว่าน่าจะเข้าใจ mongoDB มากขึ้นแล้วผมเองเคยใช้มาก่อน ก็พบว่ามันก็แปลกดีนะครับ เพราะว่าปกติไม่ค่อยมี database เก็บ Document base แบบนี้เท่าไร (จริงๆหลังๆ ทั้ง MySQL, MSSQL ทำได้หมดแล้วล่ะ) ก็ย้ำอีกที อยากให้เลือกใช้ให้เหมาะกับงานจะดีที่สุดครับ
One thought on “mongoDB คืออะไร และตัวอย่าง mongoDB”