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 ส่วน:
- Frontend/API — วิธีที่ app พูดกับ DB (SQL, document API, command-style)
- Storage Engine/Backend — วิธีเก็บ data ลง disk (B-Tree, LSM-Tree)
Storage engine ไม่สนใจ data format — เห็นเป็น bytes ใน pages เท่านั้น → MongoDB ใช้ WiredTiger (B+Tree) เหมือน MySQL
ทำไมคนหนีไป NoSQL? (และทำไมหลายคนกลับมา)
เหตุผลย้ายไป:
- Flexible schema — ไม่ต้อง migration ทุกครั้ง
- Horizontal scaling built-in (sharding)
- High write throughput
- Eventual consistency รับได้สำหรับบาง use case
เหตุผลกลับมา SQL:
- JOIN ซับซ้อน — NoSQL ทำได้ยาก ต้อง denormalize
- ACID transactions ข้าม collection
- PostgreSQL + JSONB — ได้ทั้ง SQL power + flexible schema
- เครื่องมือ + community ของ SQL ครบกว่า
Pitfall ที่เกิดขึ้นจริง
บริษัทหลายแห่งในยุค 2010s ย้ายไป MongoDB แล้ว develop แบบ relational (joins เยอะ, transactions เยอะ) → ปวดหัวมาก → Modern wisdom: เริ่มจาก Postgres ก่อน
Key Points
- MongoDB ค่อย ๆ เพิ่ม SQL-like features (transactions,
$lookupjoins, 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
Related
- NoSQL — MongoDB เป็น document store ประเภทหนึ่ง
- PostgreSQL — ทางเลือกที่แนะนำ (Postgres + JSONB)
- Database Engines — WiredTiger, B+Tree
- ACID — MongoDB v4.0+ รองรับ multi-document transactions