MongoDB

Document store database ที่ใช้ JSON/BSON — วิวัฒนาการจาก schema-less + ไม่มี transaction มาเป็น ACID-compliant + clustered collections

วิวัฒนาการ

Version 1.x (~2009-2014)

  • Storage engine: MMAPv1 (memory-mapped files)
  • ไม่มี document-level locking → table-level lock → write throughput ต่ำ

Version 3.0 (2015)

  • เปลี่ยน default engine เป็น WiredTiger — ใช้ B+Tree เหมือน MySQL InnoDB
  • รองรับ document-level locking → concurrent writes ดีขึ้นมาก

Version 4.0 (2018)

  • เพิ่ม multi-document transactions (ACID-compliant!)
  • ก่อนหน้านี้มีแค่ atomic operation ภายใน 1 document

Version 5.3+ (2022)

  • เพิ่ม Clustered Collections — clustered index บน _id (คล้าย InnoDB)
  • ลด IO overhead เพราะไม่ต้อง lookup collection แยกหลัง index lookup

Page Size

  • 32 KB (WiredTiger) — ใหญ่ที่สุดในตาราง

SQL vs NoSQL — มุมมอง Hussein Nasser

database แบ่งเป็น 2 ส่วน:

  1. Frontend/API — วิธีที่ app พูดกับ DB (SQL, document API, command-style)
  2. Storage Engine/Backend — วิธีเก็บ data ลง disk (B-Tree, LSM-Tree)

Storage engine ไม่สนใจ data format — เห็นเป็น bytes ใน pages เท่านั้น → MongoDB ใช้ WiredTiger (B+Tree) เหมือน MySQL

ทำไมคนหนีไป NoSQL? (และทำไมหลายคนกลับมา)

เหตุผลย้ายไป:

  1. Flexible schema — ไม่ต้อง migration ทุกครั้ง
  2. Horizontal scaling built-in (sharding)
  3. High write throughput
  4. Eventual consistency รับได้สำหรับบาง use case

เหตุผลกลับมา SQL:

  1. JOIN ซับซ้อน — NoSQL ทำได้ยาก ต้อง denormalize
  2. ACID transactions ข้าม collection
  3. PostgreSQL + JSONB — ได้ทั้ง SQL power + flexible schema
  4. เครื่องมือ + community ของ SQL ครบกว่า

Pitfall ที่เกิดขึ้นจริง

บริษัทหลายแห่งในยุค 2010s ย้ายไป MongoDB แล้ว develop แบบ relational (joins เยอะ, transactions เยอะ) → ปวดหัวมาก → Modern wisdom: เริ่มจาก Postgres ก่อน

Key Points

  • MongoDB ค่อย ๆ เพิ่ม SQL-like features (transactions, $lookup joins, schema validation) → เส้นแบ่ง SQL/NoSQL เลือนลาง
  • WiredTiger engine ใช้ B+Tree เหมือน MySQL InnoDB
  • Document-level locking ตั้งแต่ v3.0 — ก่อนหน้านี้ table-level lock
  • Multi-document ACID transactions ตั้งแต่ v4.0
  • Clustered collections ตั้งแต่ v5.3+ ลด IO overhead
  • NoSQL — MongoDB เป็น document store ประเภทหนึ่ง
  • PostgreSQL — ทางเลือกที่แนะนำ (Postgres + JSONB)
  • Database Engines — WiredTiger, B+Tree
  • ACID — MongoDB v4.0+ รองรับ multi-document transactions