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 } } }
]);