~/VibeHandbook
PDF ฟรี

ฐานข้อมูล

mongodb.com

MongoDB

มันคืออะไร

ลองนึกภาพแฟ้มบัตรดัชนี (index card) ที่บัตรแต่ละใบมีข้อมูลต่างกันได้ แทนที่จะเป็นสเปรดชีตแบบตายตัวที่ทุกแถวต้องมีคอลัมน์เหมือนกันหมด MongoDB ทำงานเหมือนแฟ้มบัตรนั้นแหละ มันคือฐานข้อมูลแบบเอกสาร (document ) ที่เก็บข้อมูลเป็น "เอกสาร" (document) ที่มีรูปแบบยืดหยุ่นได้ (ให้นึกว่าแต่ละ "เอกสาร" คือบัตรหนึ่งใบ) แล้วรวมกลุ่มกันเป็น collection เอกสารเหล่านี้ถูกบันทึกในรูปแบบที่เรียกว่า BSON ซึ่งเป็นรูปแบบไบนารีของ (JavaScript Object Notation) ของ MongoDB เอง อันเป็นวิธีเขียนข้อมูลเป็นฟิลด์ที่มีชื่อกำกับที่ใช้กันทั่วไป แทนที่จะเป็นตารางและแถวที่ตายตัว เอกสารแต่ละชิ้นสามารถมีรูปทรงของตัวเองได้ ทำให้ปรับเปลี่ยนโมเดลข้อมูลได้อย่างรวดเร็ว จึงเป็นตัวเลือกยอดนิยมสำหรับแอปพลิเคชันที่ข้อมูลมีลักษณะเป็นอ็อบเจกต์ซ้อนกันตามธรรมชาติ

จุดแข็ง

  • สคีมายืดหยุ่น: เอกสารสามารถแตกต่างกันและวิวัฒนาการไปได้โดยไม่ต้องทำ migration
  • ข้อมูลตรงกับอ็อบเจกต์ในแอปพลิเคชันโดยตรง ลดโค้ดที่ต้องแปลงข้อมูลไปมา
  • ภาษาคิวรีที่หลากหลาย บวกกับ aggregation pipeline ที่ทรงพลัง
  • ขยายขนาดแนวนอน (horizontal scaling) ได้ผ่านการทำ sharding ในตัว
  • รองรับฟิลด์แบบซ้อน (nested) และอาร์เรย์ได้ดี

ข้อแลกเปลี่ยน

  • สร้างข้อมูลที่ไม่สอดคล้องกันได้ง่ายมาก หากไม่มีวินัยในการออกแบบสคีมา
  • ธุรกรรมข้ามหลายเอกสาร (multi-document transactions) มีให้ใช้ แต่หนักกว่าฐานข้อมูลเชิงสัมพันธ์ (relational store)
  • การ join ($lookup) มีข้อจำกัดเมื่อเทียบกับ (Structured Query Language) ข้อมูลจึงมักถูกทำให้ไม่เป็นบรรทัดฐาน (denormalized)
  • การ denormalize (การเก็บสำเนาของข้อมูลเดียวกันไว้มากกว่าหนึ่งที่เพื่อเลี่ยงการ lookup) อาจทำให้ข้อมูลซ้ำซ้อนและทำให้การอัปเดตซับซ้อนขึ้น

เมื่อไรควรใช้

เลือก MongoDB สำหรับระบบจัดการเนื้อหา แคตตาล็อกสินค้า โปรไฟล์ผู้ใช้ การบันทึกเหตุการณ์ (event logging) และแอปที่มีข้อมูลเปลี่ยนแปลงตลอดเวลาหรือมีลำดับชั้น ซึ่งเอกสารเหมาะกว่าตารางที่ทำ normalize แล้ว

เข้ากับ vibe coding แค่ไหน

เวลาสั่งงาน AI อย่าปล่อยให้คำว่า "ไม่มีสคีมา" กลายเป็น "ไม่มีแผน" ให้ขอให้ AI กำหนดรูปทรงเอกสารที่ชัดเจน แล้วบังคับใช้ด้วย JSON Schema validation หรือ ODM (Object-Document Mapper) อย่าง Mongoose รวมถึงกำหนดฟิลด์ที่จำเป็นและชนิดข้อมูล บอก AI ด้วยว่าจะฝังข้อมูลที่เกี่ยวข้องไว้ด้วยกัน (embed) หรืออ้างอิงด้วย id (reference) โดยพิจารณาจากรูปแบบการเข้าถึงข้อมูล และให้เพิ่ม index สำหรับฟิลด์ที่คุณใช้คิวรีและเรียงลำดับ เคล็ดลับดี ๆ คือ ให้ AI ใช้อ็อบเจกต์คิวรีแบบพารามิเตอร์ (parameterized query objects) หมายความว่าไม่ต้องสร้างคิวรีด้วยการต่อข้อความดิบจากผู้ใช้เข้าด้วยกันเด็ดขาด และให้ขอให้ AI อธิบายเหตุผลที่เลือก embed หรือ reference ด้วย เพื่อให้คุณเข้าใจต้นทุนของการอ่าน การเขียน และการอัปเดต

// Schema validation keeps documents consistent
db.createCollection("users", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["email", "createdAt"],
      properties: {
        email:     { bsonType: "string" },
        createdAt: { bsonType: "date" },
        roles:     { bsonType: "array", items: { bsonType: "string" } }
      }
    }
  }
});

db.users.createIndex({ email: 1 }, { unique: true });

// Aggregation: count active users per role
db.users.aggregate([
  { $match: { active: true } },
  { $unwind: "$roles" },
  { $group: { _id: "$roles", count: { $sum: 1 } } }
]);