ในการแบ่งปันเรื่องการจัดการข้อมูลใน PostgreSQL database
มีเรื่องพื้นฐานต่าง ๆ ที่น่าสนใจ
เพื่อช่วยให้จัดการข้อมูลดีขึ้นกว่าเดิม ไม่ใช่แค่ทำให้เสร็จ ๆ
แล้วรอแก้ไขปัญหา หรือ เราอาจจะกำลังสร้างระเบิดเวลาขึ้นมาก็ได้
จึงทำการสรุปสิ่งที่แบ่งปันไว้นิดหน่อย
เป็นเรื่องพื้นฐานล้วน ๆ

เรื่องแรกคือ ต้องตรวจสอบสิ่งที่ออกแบบและสร้างขึ้นมา

ยกตัวอย่างเช่น table ที่คุณออกแบบและสร้างขึ้นมา
ทำการเก็บข้อมูลอะไร อย่างไร
มีอัตราการเติบโดตของข้อมูลหรือ data growth rate อย่างไร
เช่นต่อวัน ต่อเดือน ต่อปี เพื่อให้เข้าใจข้อมูล
มีการใช้งานอย่างเช่น เช่น
การ read หรือ query เป็นอย่างไร ทำงานได้ตามที่เราควาดหวังไหม ?

เช่น เมื่อระบบมีข้อมูลมากขึ้น
ระบบดันทำงานช้าลงเรื่อย ๆ โดยไม่ได้ทำอะไร
แบบนี้เราจะเรียกว่า ระเบิดเวลา ซึ่งควรต้องรู้ตั้งแต่ออกแบบไหมนะ !!

ดังนั้นจึงแนะนำว่า ต้องรู้ก่อนเสมอ
ยกตัวอย่างเช่น

  • สร้าง table
  • generate data ไว้เพื่อทดสอบ
  • ทำการ explain sql query ที่ใช้งานในระบบ
  • ทำการ improve เช่น ใส่ index เป็นต้น

ตัวอย่างของ script พื้นฐานแบบง่าย ๆ

เรื่องที่สอง คือ data modeling หรือออกแบบโครงสร้างข้อมูลให้เหมาะสมกับงาน

เราทำงานออกแบบเพื่อให้ง่ายต่อการ read หรือ write กันแน่
ต้องเข้าใจ และ มองการทำงานของระบบ หรือ data flow ให้ออก
มิเช่นนั้น เรากำลังระเบิกเวลาขึ้นมาแน่นอน

เช่นถ้าการดึงข้อมูลต้อง join table เยอะมาก ๆ
ผมชอบเรียกว่า ลูกอิช่าง join
แบบนี้ไม่น่าจะออกแบบมาเพื่อการ read แน่นอน !!

ต้องออกแบบให้เหมาะสมไหม ?
ทั้ง denormalization
ทั้ง pre-aggregation
ทั้ง materialize view
ทั้ง partitioning
ทั้งการนำ NoSQL มาใช้งานบ้าง
ทั้งการนำ caching มาช่วย

เรื่องที่สาม ค่อยไปสิ่งที่ advance ขึ้นมา ทั้ง configuration และ scaling

เช่น

  • การจัดการ connection pool เช่น การใช้งาน proxy หรือ pg pool เป็นต้น
  • Database topology ต่าง ๆ เช่น master-slaves, replication, multi-master เป็นต้น
  • การ config database ต่าง ๆ เช่น shared_buffers และ การบีบอัดข้อมูล (data compression)
  • การทำ sharding data
  • การ config พวก OS ต่าง ๆ

จะเห็นได้ว่า ให้ค่อย ๆ ทำตั้งแต่พื้นฐานขึ้นไป
ถ้าต้นเหตุของปัญหา มันไม่ถูกแก้ไขแล้ว
จะแก้ไขอย่างไร ปัญหาเดิม ๆ มันยังคงอยู่
เผลอ ๆ การแก้ไขอาจจะเป็นเพียงแค่ปลายเหตุหรือไม่ ?
ดังนั้น พื้นฐาน สำคัญมาก ๆ