Everything Jingle Bell แบบครอบจักวาล MongoDB [ตอนที่ 3: การออกแบบ Schema]

หลังจากตอนที่ 2.2 link เรื่องการจัดการข้อมูลที่เป็นแบบ Array ตอนนี้เราจะมาดูกันต่อในเรื่องการออกแบบโครงสร้างของฐานข้อมูล (Schema) ซึ่งถ้าใครเคยทำ MySQL หรือฐานข้อมูลแบบ Relational มาแล้วก็จะมีความรู้เรื่องการออกแบบฐานข้อมูลมาพอสมควร แต่สำหรับคนที่ยังไม่เป็นเลย หรือยังไม่คล่องผมก็แนะนำว่าคุณก็สามารถอ่านได้เหมือนกันเพราะหลักการมันไม่ได้หนีห่างกันไปไหนครับ

Schema

การออกแบบ Schema ก็คือการระบุว่าในแต่ละ Collection( Table if MySQL) จะมีฟิลด์อะไรบ้าง และแต่ละฟิลด์เก็บข้อมูลแบบไหนนั่นเองครับ โดยในแต่ละภาษาจะมี Class ORM ให้ทำการประกาศ Schema ได้อยู่แล้วอย่าง Spring Boot ก็จะมีวิธีการแบบนี้ link หรือใครทำ NodeJs ก็จะรู้จักกันดีคือ Mongoose

 

One-To-One (1:1)

https://gist.github.com/avatarr/e51796961acaf0bb11fe8ddc1ade82c5#file-mongo1

 

เราสามารถใช้ความสามารถของ JSON (เพราะ mongodb เป็นการเก็บข้อมูลโดยเอาฟอร์แมตมาจาก JSON ) เข้ามาเก็บข้อมูลได้ด้วยแบบนี้ โดยการทำแบบนี้เขาเรียกว่าการทำ Embedding

https://gist.github.com/avatarr/e51796961acaf0bb11fe8ddc1ade82c5#file-mongo2

 

foreign key or Relationship 

https://gist.github.com/avatarr/e51796961acaf0bb11fe8ddc1ade82c5#file-mongo3

 

One-To-Many (1:N)

ปกติการออกแบบ MySQL เราะจะเอา ID ของ foreign key ไปเก็บใน table ที่เราต้องการเก็บข้อมูลแบบ 1:N ตัวอย่างเช่น

https://gist.github.com/avatarr/e51796961acaf0bb11fe8ddc1ade82c5#file-sql

 

ที่นี้ถ้าเป็น MongoDB ละ ก็แบบนี้ ซึ่งแบบนี้ก็ไม่ต่างไรกับการทำ MySQL สักนิด

https://gist.github.com/avatarr/e51796961acaf0bb11fe8ddc1ade82c5#file-mongo4

 

งั่นผมแนะนำให้เอาความสามารถของ JSON มาใช้ให้เกิดประโยชน์ดีกว่าซึ่ง MongoDB เองก็แนะนำให้ทำแบบนี้ คือจับเอาข้อมูลลงไปใน Array (Embedding) สะเลยพอจะดึงมาก็ query มันครั่งเดียวได้ข้อมูลครบเลย

ข้อดี มันทำให้เราไม่ต้อง query แยกกันระหว่างสอง table เพื่อดึงเอาข้อมูลที่เป็น Relation กัน ไม่ต้องสร้าง หลายๆ table

ข้อเสีย คือเราไม่สามารถเข้าถึงข้อมูลแค่บางชุดเพราะข้อมูลจะถูกส่งกลับมาทั่งหมด ดังนั่นจึงเป็นหน้าที่ client หรือ server เองต้องจัดการ Logic ตรงนี้เอง

https://gist.github.com/avatarr/e51796961acaf0bb11fe8ddc1ade82c5#file-mongo5

 

หรือเราจะทำการแยก Table แล้วใช้ foreign key ก็ได้เหมือนกันแบบนี้ และก็ยังใช้ Array มันเป็นการเก็บข้อมูล

https://gist.github.com/avatarr/e51796961acaf0bb11fe8ddc1ade82c5#file-mongo6

 

สำหรับการออกแบบ Schema พื้นฐานก็มีเท่านี้ครับ อธิบายเพิ่มเติมสำหรับคำว่า Embedding คือการเก็บข้อมูลแบบ key:value ในรูป { } ไว้ เช่น name: { fname :  “John”,  lname: “Doe” } เราเรียกว่า Embedding และ Array เองก็ทำ Embedding ได้คือ name: [{  .. }, { .. }, { .. }] …………… จบแล้วครับ แล้วผมกันใหม่ตอนที่ 4 วิธีการทำ Index นะครับ

Facebook Comments