7 ฐานข้อมูลสำหรับปี 2025
(matt.blwt.io)- แนะนำฐานข้อมูล 7 ตัวที่ควรค่าแก่การจับตามองเพื่อใช้แก้ปัญหาที่หลากหลาย
- นี่ไม่ใช่ลิสต์ "ฐานข้อมูลที่ดีที่สุด" แต่เป็นเครื่องมือที่มอบมุมมองใหม่และมีประโยชน์
- ในปี 2025 อยากชวนให้ลองลงทุนเวลาอย่างละหนึ่งสัปดาห์กับฐานข้อมูลแต่ละตัว (7 DBs in 7 Weeks)
1. PostgreSQL: ฐานข้อมูลพื้นฐาน
- PostgreSQL เป็นเทคโนโลยีที่มั่นคงและถูกใช้เป็นค่าเริ่มต้น
- วลี "Just use Postgres" เป็นทั้งมีมที่รู้จักกันอย่างแพร่หลายและสื่อถึงความน่าเชื่อถือ
- รองรับ ACID และมีความสามารถที่แข็งแกร่ง รวมถึงการทำ replication ทั้งแบบ physical และ logical
- เป็นฐานข้อมูลที่เสถียรและได้รับการสนับสนุนอย่างกว้างขวางจากผู้ให้บริการรายหลัก
- เสน่ห์สำคัญที่สุดของ PostgreSQL: ความสามารถในการขยาย
- สามารถเพิ่มความสามารถเฉพาะทางได้ผ่าน Extensions
- ตัวอย่าง extension หลัก:
AGE: รองรับโครงสร้างข้อมูลกราฟและภาษา query แบบ CypherTimescaleDB: รองรับการทำงานกับข้อมูลอนุกรมเวลาHydra Columnar: มอบเอนจินจัดเก็บข้อมูลแบบคอลัมน์
- Extensions คือองค์ประกอบหลักที่ทำให้ PostgreSQL แตกต่างจากฐานข้อมูลอื่น
- ประโยชน์ใช้สอยและความยืดหยุ่นของ PostgreSQL
- มี ecosystem ที่หลากหลาย พร้อมค่าเริ่มต้นที่สมเหตุสมผลและเป็นมิตรต่อผู้ใช้
- แม้แต่บริการที่ไม่ใช่ PostgreSQL ก็ยังใช้ Postgres wire protocol เพื่อให้เข้ากันได้กับไคลเอนต์
- เบาพอที่จะติดตั้งได้แม้ในสภาพแวดล้อม WebAssembly (Wasm)
- แนะนำให้เรียนรู้ PostgreSQL
- คุ้มค่าที่จะลงทุนเวลาเพื่อเข้าใจศักยภาพและข้อจำกัดของ PostgreSQL
- ตัวอย่าง: ทำความเข้าใจความซับซ้อนของ MVCC(Multi-Version Concurrency Control)
- แนะนำให้ลองพัฒนาแอป CRUD แบบง่าย ๆ หรือเขียน PostgreSQL extension เอง
2. SQLite: ฐานข้อมูลแบบ local-first
- SQLite เป็นฐานข้อมูลแบบ "local-first" ที่ทำงานได้อย่างอิสระ
- ไม่ยึดติดกับโมเดล client-server และทำงานอยู่ในสภาพแวดล้อมเดียวกับแอปพลิเคชัน
- ตัวอย่าง: WhatsApp และ Signal ใช้ SQLite ภายในอุปกรณ์เพื่อเก็บข้อมูลแชต
- กรณีการใช้งาน SQLite ที่พัฒนาไปไกลกว่าเดิม
- นำไปใช้เชิงสร้างสรรค์ได้มากกว่าการเป็นฐานข้อมูลที่รองรับ ACID พื้นฐาน
- เครื่องมือและ extension ใหม่ ๆ:
Litestream: ทำ streaming backup ให้ SQLiteLiteFS: รองรับ distributed access เพื่อให้สร้าง topology ที่ยืดหยุ่นขึ้นได้CR-SQLite: ใช้ CRDT(Conflict-free Replicated Data Types) เพื่อตัดความจำเป็นในการแก้ conflict ตอนรวม change set
- การกลับมาได้รับความนิยมของ SQLite
- กำลังกลับมาได้รับความสนใจอีกครั้งจาก Ruby on Rails 8.0
- 37signals: พัฒนาโมดูล Rails (เช่น Solid Queue) บนพื้นฐานของ SQLite
- รองรับการจัดการฐานข้อมูล SQLite หลายตัวใน Rails (
database.yml)
- รองรับการจัดการฐานข้อมูล SQLite หลายตัวใน Rails (
- Bluesky: ใช้ฐานข้อมูล SQLite แยกต่อผู้ใช้เป็น Personal Data Servers
- แนะนำให้เรียนรู้การใช้งาน SQLite
- ลองทดลองสถาปัตยกรรมแบบเน้น local ด้วย SQLite
- ทดสอบว่าสามารถแทนที่โมเดล client-server ที่เดิมใช้ PostgreSQL ด้วย SQLite ได้หรือไม่
3. DuckDB: ฐานข้อมูลที่ query ได้กับทุกสิ่ง
- DuckDB เป็นฐานข้อมูลแบบ embedded ที่เชี่ยวชาญด้าน OLAP
- คล้าย SQLite ตรงที่ทำงานร่วมกับแอปพลิเคชัน แต่เน้นงาน OLAP แทน OLTP
- เป็นระบบที่ออกแบบมาโดยเน้นการวิเคราะห์ข้อมูลและการ query
- คุณสมบัติ "Query-Anything" ของ DuckDB
- สามารถ query แหล่งข้อมูลหลากหลายได้โดยตรงด้วย SQL:
- ฟอร์แมตไฟล์ทั่วไป เช่น CSV, TSV, JSON
- รองรับฟอร์แมตขั้นสูงอย่าง Parquet
- ความสามารถนี้ให้ความยืดหยุ่นสูง เช่น ใช้วิเคราะห์สตรีมข้อมูลของ Bluesky
- สามารถ query แหล่งข้อมูลหลากหลายได้โดยตรงด้วย SQL:
- ความสามารถในการขยายและ ecosystem
- DuckDB ก็มี extensions เช่นกัน แต่ยังไม่หลากหลายเท่า Postgres (เพราะเป็นโปรเจ็กต์ที่อายุน้อยกว่า)
- มี extension จากชุมชนจำนวนมาก โดย
gsheets(เชื่อมต่อ Google Sheets) น่าสนใจเป็นพิเศษ
- แนะนำให้เรียนรู้การใช้ DuckDB
- ทดลองวิเคราะห์และประมวลผลข้อมูลผ่าน Python notebook หรือ Evidence
- ใช้ร่วมกับ SQLite: โยน analytical query ของฐานข้อมูล SQLite ไปให้ DuckDB เพื่อเพิ่มประสิทธิภาพ
4. ClickHouse: ฐานข้อมูลแบบคอลัมน์
- ClickHouse เป็นฐานข้อมูลที่เชี่ยวชาญด้านงาน OLAP
- การจับคู่ PostgreSQL สำหรับ OLTP และ ClickHouse สำหรับ OLAP ถือว่าเหมาะมาก
- รองรับ workload เชิงวิเคราะห์ขนาดใหญ่ และรองรับความเร็วในการเขียนข้อมูลสูงผ่านการขยายแนวนอนและ sharding
- คุณลักษณะสำคัญของ ClickHouse
- รองรับ hierarchical storage:
- แยกจัดเก็บ "hot data" และ "cold data" ได้
- ตัวอย่าง: เอกสารของ GitLab อธิบายกรณีใช้งานนี้ไว้อย่างละเอียด
- รองรับ dataset ขนาดใหญ่และการวิเคราะห์แบบเรียลไทม์:
- เหมาะกับ dataset ที่ใหญ่เกินกว่าที่ DuckDB จะจัดการได้สะดวก
- ให้ประสิทธิภาพสูงในสถานการณ์ที่ต้องการการวิเคราะห์แบบเรียลไทม์
- รองรับ hierarchical storage:
- ความสะดวกในการดูแลระบบ
- เอกสารด้านปฏิบัติการ เช่น การ deploy, scale, backup มีโครงสร้างดีและละเอียด
- ตัวอย่าง: มีเอกสารที่ลงลึกถึงวิธีตั้งค่า CPU ที่เหมาะสม
- แนะนำให้เรียนรู้ ClickHouse
- ลองทดลองกับ dataset เชิงวิเคราะห์ขนาดใหญ่ หรือแปลงงานวิเคราะห์ที่ทำใน DuckDB มาใช้กับ ClickHouse
- ใช้
chDBซึ่งเป็นเวอร์ชัน embedded ของ ClickHouse เพื่อเปรียบเทียบกับ SQLite ได้โดยตรงมากขึ้น
5. FoundationDB: ฐานข้อมูลแบบ layered
- FoundationDB เป็นระบบที่มีเอกลักษณ์เฉพาะตัวในฐานะ "รากฐานของฐานข้อมูล"
- ถูกออกแบบเป็น key-value store แต่ทำงานเหมือน "พื้นฐาน" สำหรับสร้างฐานข้อมูล มากกว่าจะเป็นฐานข้อมูลแบบเรียบง่าย
- ถูกใช้งานโดยบริษัทใหญ่ เช่น Apple, Snowflake และ Tigris Data
- คุณสมบัติสำคัญและข้อจำกัด
- ข้อจำกัด:
- ข้อมูลธุรกรรมต้องไม่เกิน 10MB
- ธุรกรรมต้องไม่เกิน 5 วินาทีนับจากการอ่านครั้งแรก
- ข้อจำกัดเหล่านี้ทำให้สามารถรองรับ ธุรกรรม ACID แบบสมบูรณ์ในสเกลขนาดใหญ่ ได้
- ตัวอย่าง: มีกรณีการรันคลัสเตอร์ขนาดมากกว่า 100TiB
- ข้อจำกัด:
- การออกแบบและการทดสอบของ FoundationDB
- ออกแบบมาให้เหมาะกับ workload เฉพาะประเภท
- พิสูจน์ความเสถียรและความสามารถในการขยายด้วย simulation testing:
- Antithesis และฐานข้อมูลอื่น ๆ ก็ใช้ระเบียบวิธีการทดสอบแบบเดียวกัน
- เอกสารอ้างอิงที่เกี่ยวข้อง: เอกสารของ Tyler Neely และ Phil Eaton
- FoundationDB ในฐานะฐานข้อมูลแบบ "layered"
- การผูกกันระหว่าง storage engine กับ data model ค่อนข้างหลวม:
- สามารถ remap storage engine ได้ในหลายเลเยอร์
- ตัวอย่าง: Record Layer, Document Layer (จัดทำโดยองค์กร FoundationDB)
- กรณีศึกษาการออกแบบเลเยอร์จาก Tigris Data ก็น่าอ่านเช่นกัน
- การผูกกันระหว่าง storage engine กับ data model ค่อนข้างหลวม:
- แนะนำให้เรียนรู้ FoundationDB
- ลองทำตาม tutorial และสำรวจความเป็นไปได้ในการใช้แทนระบบอย่าง RocksDB
- อ่านแนวทางการออกแบบ (Design Recipes) และงานวิจัยที่เกี่ยวข้อง
- ทำความเข้าใจข้อจำกัดการใช้งานและปัญหาที่แก้ได้ผ่านเอกสาร Anti-Features และ Features
6. TigerBeetle: ฐานข้อมูลที่ถูกต้องแม่นยำอย่างถึงที่สุด
- TigerBeetle เป็นฐานข้อมูลแบบ single-purpose ที่เชี่ยวชาญด้านธุรกรรมทางการเงิน
- แตกต่างจากฐานข้อมูลเอนกประสงค์ โดยมุ่งเน้นเป้าหมายเฉพาะ โดยเฉพาะ ธุรกรรมทางการเงิน
- เปิดเป็นโอเพนซอร์ส และออกแบบมาโดยมีเป้าหมายเรื่องความน่าเชื่อถือและความถูกต้องในระดับสูง
- ปรัชญาการออกแบบเพื่อความถูกต้องอย่างเข้มงวด
- นำ Power of Ten Rules ของ NASA และ Protocol-Aware Recovery มาใช้
- ใช้ strict serialisability และ Direct I/O เพื่อหลีกเลี่ยงปัญหาที่เกี่ยวข้องกับ kernel page cache
- สามารถเห็นความพิถีพิถันนี้ได้จากเอกสารด้านความปลอดภัย (Safety doc) และรูปแบบการเขียนโปรแกรมเฉพาะตัวอย่าง "Tiger Style"
- แนวทางที่ล้ำสมัยด้วยการพัฒนาในภาษา Zig
- Zig เป็นภาษาสำหรับ system programming ที่ยังค่อนข้างใหม่ แต่เหมาะอย่างยิ่งกับเป้าหมายของ TigerBeetle
- ใช้จุดเด่นของ Zig เพื่อเพิ่มทั้งความกระชับและประสิทธิภาพให้สูงสุด
- ข้อเสนอแนะในการเรียนรู้และใช้งาน TigerBeetle
- ทดลองจำลองโมเดลบัญชีการเงินในสภาพแวดล้อมติดตั้งแบบ local:
- ติดตั้งและลองใช้งานตาม Quick Start
- อ่านเอกสารสถาปัตยกรรมระบบ (System Architecture docs) เพื่อสำรวจความเป็นไปได้ในการใช้ร่วมกับฐานข้อมูลเอนกประสงค์
- ตัวอย่าง: ใช้งานร่วมกับ PostgreSQL หรือ FoundationDB เพื่อขยายกรณีใช้งาน
- ทดลองจำลองโมเดลบัญชีการเงินในสภาพแวดล้อมติดตั้งแบบ local:
7. CockroachDB: ฐานข้อมูลระดับโลก
- CockroachDB เป็นฐานข้อมูลแบบกระจายระดับโลก
- รองรับ PostgreSQL wire protocol พร้อมการขยายแนวนอนและความสอดคล้องที่เข้มแข็ง
- เป็นการออกแบบที่ได้แรงบันดาลใจจาก Google Spanner ทำให้ขยายฐานข้อมูลข้ามหลายภูมิภาคได้
- ลักษณะทางเทคนิคสำคัญของ CockroachDB
- เทคโนโลยีการซิงก์เวลา:
- Google Spanner ใช้นาฬิกาอะตอมและ GPS clock แต่ CockroachDB ถูกออกแบบให้ทำงานได้บนฮาร์ดแวร์ทั่วไป
- มีการชดเชยความหน่วงของการซิงก์ด้วย NTP, เปรียบเทียบ clock drift ระหว่างโหนด และตัดสมาชิกออกเมื่อเกิน maximum offset
- การตั้งค่าหลายภูมิภาค:
- ฟีเจอร์ Table Localities ช่วยให้ปรับแต่งตาม trade-off ระหว่างการอ่านและการเขียนได้
- กระจายข้อมูลตามตำแหน่งทางภูมิศาสตร์ของผู้ใช้เพื่อปรับปรุงประสิทธิภาพและ latency
- เทคโนโลยีการซิงก์เวลา:
- ข้อเสนอแนะในการเรียนรู้การใช้ CockroachDB
- นำตัวอย่าง MovR มาสร้างใหม่:
- ใช้ภาษาและเฟรมเวิร์กที่ต้องการเพื่อสร้าง MovR (ตัวอย่างแอปพลิเคชันแบบกระจาย)
- ทดลองออกแบบแอประดับโลกโดยใช้กลยุทธ์ multi-region และ scaling ของ CockroachDB
- นำตัวอย่าง MovR มาสร้างใหม่:
- เหตุผลที่เลือก CockroachDB
- ต่างจากฐานข้อมูลแบบกระจายอื่นอย่าง DynamoDB ตรงที่สามารถรันฟรีในเครื่อง local ได้
- มอบคุณสมบัติที่แตกต่างทั้งด้านความสอดคล้องที่เข้มแข็งและการรองรับการกระจายแบบ global
Wrap Up
- ฐานข้อมูลที่แนะนำแต่ละตัวถูกออกแบบมาเพื่อแก้ปัญหาและตอบโจทย์ความต้องการที่แตกต่างกัน
- ในปี 2025 ลองเรียนรู้ฐานข้อมูลเหล่านี้และสำรวจวิธีแก้ปัญหาที่น่าสนใจและสร้างสรรค์ยิ่งขึ้นกัน!
14 ความคิดเห็น
สอบถามอะไรก็ได้! 😆🐤
ผมประหลาดใจมากที่ Duckdb มีประสิทธิภาพด้านการวิเคราะห์ที่ยอดเยี่ยมกว่าที่คิดไว้
หลายเดือนมานี้ผมใช้ sqlite อยู่ครับ เป็นงานที่ประมวลผลข้อมูลตามวันที่ ระดับประมาณ 2 ล้านรายการ ขนาดราว 5GB
ความเร็วในการประมวลผลก็น่าพอใจนะครับ.. แต่หลังจากแปลงข้อมูลแล้ว เวลาที่ใช้สร้างเป็นไฟล์ Excel อีกครั้งเพื่อส่งให้ผู้มีส่วนเกี่ยวข้องนั้นนานเกินไป
ดูเหมือนว่าคงต้องลองศึกษาแนวทางการใช้ OpenPyXl เพิ่มเติมหน่อยครับ
ไม่รู้ว่ามีเวทมนตร์อะไรอยู่เบื้องหลัง แต่เขาบอกว่าใช้ชุดผสม duckDB + sqlite กันครับ
น่าแปลกที่ไม่มีการพูดถึง MongoDB เลย
ถ้าเป็นสภาพแวดล้อมที่กังวลเรื่องช่วงเรียนรู้ของนักพัฒนา ขอแนะนำ SQLite ครับ เพราะเป็นแบบไฟล์จึงใช้งานง่าย
ถ้ามั่นใจว่าไม่มีความต้องการการเข้าถึงระยะไกล นี่คือโซลูชันที่น่าพอใจมากจริง ๆ จุดที่ต้องดูแลจัดการ DB หายไป แถมยังแก้ไขข้อมูล รวมถึงสำรอง/กู้คืนได้ง่าย จึงดีมาก
พอพูดว่าจะใช้ SQLITE ก็มักจะโดนด่าได้ง่าย ๆ แต่ก่อนจะบอกว่าใช้ SQLITE ก็ไม่มีใครรู้เหมือนกันนะ... SQLITE ดีกว่าที่คิดครับ
ผมใช้แต่ MySQL มาหลายสิบปี(??)แล้วครับ
อยากทราบว่า PostgreSQL เป็นอย่างไรบ้าง และหวังว่าจะมีคอมเมนต์จากหลาย ๆ ท่านที่ใช้งาน PostgreSQL ในโปรดักชันจริงอยู่ในสายงานมาแชร์กันครับ
"ช้างเหนือกว่าแมวน้ำ"
นี่เป็นความจริงในสถานการณ์ส่วนใหญ่
ฮ่าๆๆๆ
ฉันย้ายจาก mysql ที่เต็มไปด้วยบั๊กในปี 2001 (ตอนนั้นเป็น v3.x) มาใช้ pgsql
แม้จะมีหลายจุดที่คิดว่าเหนือกว่า.. แต่ในโลกความเป็นจริง ฉันคิดว่าการมีอยู่ของ Partial Index คือฟีเจอร์ที่ทรงพลังที่สุด
เพราะงานที่บริษัท ผมเคยใช้แค่ Oracle กับ Sqlserver พอลองจะใช้ MySQL ก็เจอหลายอย่างมากที่ทำให้คิดว่า "ทำไมอันนี้ใช้ไม่ได้?" ตอนนี้ผมเองก็จำรายละเอียดได้ไม่แม่นแล้ว
สุดท้ายก็ย้ายมาใช้ Postgres ครับ
พอย้ายจากที่ใช้ Postgres มาอยู่ที่ที่ใช้ MySQL ก็มีหลายอย่างที่ทำให้รู้สึกว่า ทำไมอันนี้ถึงทำไม่ได้? ทำไมประสิทธิภาพถึงไม่ออกมาแบบนี้?
จำไม่ได้ชัดเจนว่าเป็นเรื่องอะไรบ้าง (อาจจะเป็นเรื่องเล็กน้อยหรือไม่ก็ได้)