หนึ่งในสิ่งที่ MongoDb แตกต่างจาก database แบบปกติก็คือ ความสามารถในการทำ ข้อมูลซ้อนเข้าไปอยู่ในข้อมูลได้ (sub-document, nested document)
ประโยชน์ของ sub-document
สมมุติเรามีข้อมูลคอร์สเรียน โดยที่แต่ละคอร์สนั้นจะมีผู้สอน ได้มากกว่า 1 คน เช่น
- คอร์ส “ ปู่รวยสอนหลาน” ราคา 1,500 ฿ มีคนสอนคือ “สมชาย จริงแท้”
- คอร์ส “excel อย่างโปร” ราคา 100 ฿ มีคนสอนคือ “สมชาย จริงแท้” และ “สมหญิง ซะที่ไหน”
ถ้าจะเก็บข้อมูลของ คอร์ส เราจะต้องออกแบบเป็น RDBMS ได้ประมาณนี้
เราจะเห็นได้ว่าจากประโยคสั้นๆเหล่านี้ ถ้าเอามาทำเป็น RDBMS นั้นจะวุ่นวายมาก เนื่องจากมันเป็น many to many ทำให้ต้องมี join table และถ้าเราต้องการจะใช้ข้อมูลเหล่านี้เราจะต้องเขียน sql เพื่อ join 3 table ออกมา
บางท่านอาจจะบอกว่าชิวๆ join แค่ 3 table เอง
แต่ในชีวิตการทำงานของจริง เราไม่ได้ join กันแค่ 3 table หรอกนะ!!
แต่ถ้าใช้ mongo เราก็จับยัดทุกอย่างรวมๆกันได้เลย ก็จะช่วยลดการ join table ที่ไม่จำเป็นออกไปได้
จากประโยค คอร์ส “ ปู่รวยสอนหลาน” ราคา 1,500 ฿ มีคนสอนคือ “สมชาย จริงแท้” ก็จะถูกแปลงเป็นข้อมูลได้ตามรูป
ซึ่งถ้าเราอ่านข้อมูลที่เก็บไว้เราก็จะเข้าใจและแปลออกมาได้ทันทีโดยไม่ต้อง join ให้วุ่นวาย ซึ่งการเก็บข้อมูลแบบนี้จะเรียกว่า Embedded Document
ข้อดีของ Embedded Document คือมันทำ Insert/read ได้เร็วมากๆ แต่มันก็มีข้อเสียอยู่คือ เช่นถ้าเราจะ update นามสกุลของนายสมชาย เราก็จำเป็นจะต้องแก้หลายที่เลย ดังนั้นจึงควรใช้กับข้อมูลที่ไม่ค่อยถูก update หรือเป็นข้อมูลที่ผูกติดกับ user นั้นๆเลยเช่น address , contact
เพื่อแก้ปัญหาความช้าในการ update เราสามารถแยกข้อมูลออกมาเป็น 2 collection แล้วเชี่อมโยงมันด้วย references key แทน
จากรูป course ก็จะมี id ของ teacher ไว้เชื่อมโยงไปยัง collection teacher ตัวหลัก ข้อดีคือถ้ามีการ update มันก็จะแก้แค่ที่เดียว แล้วถ้าเราไปทำให้ id ของ teacher มันเป็น Indexes ก็จะทำให้การ read นั้นเร็วขึ้นจนเทียบเคียงแบบ Embedded Document ได้เลย
ส่วนข้อเสียก็เป็นเรื่องของเวลา Insert ที่จะต้องสร้างหลายที่ และถ้า data ซับซ้อน เวลาจะ read จะต้องเขียน join หลาย collection
เราสามารถใช้ _id (ObjectId) ที่ mongo สร้างให้มาเป็น reference key ได้ ข้อดีคือ _id นั้นคือมัน unique พร้อมกับเป็น index อยู่แล้ว ทำให้มันเร็วและทำให้เราไม่ต้องสร้าง id มาใช้เองอีกต่อไป
อ่านเพิ่มเติม -> https://docs.mongodb.com/manual/core/data-model-design/