Mongo db อย่างโปร ตอน Data Model Design

KhunGames
SkillLane
Published in
2 min readJul 17, 2018

หนึ่งในสิ่งที่ 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 ฿ มีคนสอนคือ “สมชาย จริงแท้” ก็จะถูกแปลงเป็นข้อมูลได้ตามรูป

Embedded Document แบบใช้ array

ซึ่งถ้าเราอ่านข้อมูลที่เก็บไว้เราก็จะเข้าใจและแปลออกมาได้ทันทีโดยไม่ต้อง join ให้วุ่นวาย ซึ่งการเก็บข้อมูลแบบนี้จะเรียกว่า Embedded Document

ข้อดีของ Embedded Document คือมันทำ Insert/read ได้เร็วมากๆ แต่มันก็มีข้อเสียอยู่คือ เช่นถ้าเราจะ update นามสกุลของนายสมชาย เราก็จำเป็นจะต้องแก้หลายที่เลย ดังนั้นจึงควรใช้กับข้อมูลที่ไม่ค่อยถูก update หรือเป็นข้อมูลที่ผูกติดกับ user นั้นๆเลยเช่น address , contact

Embedded Document

เพื่อแก้ปัญหาความช้าในการ update เราสามารถแยกข้อมูลออกมาเป็น 2 collection แล้วเชี่อมโยงมันด้วย references key แทน

แปลงข้อมูลเป็น References Document

จากรูป 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 มาใช้เองอีกต่อไป

References Document

อ่านเพิ่มเติม -> https://docs.mongodb.com/manual/core/data-model-design/

--

--

KhunGames
SkillLane

Software Engineer@skilllane ผู้ชื่นชอบ ประวัติศาสตร์ การเมือง สังคม และ ไอที