System-Versioned คืออะไรและทำไมต้องรู้จัก
เวลาเราเขียนโปรแกรมจัดการฐานข้อมูล (ที่เก็บข้อมูลของแอปพลิเคชัน) ปกติเราจะสั่งอัปเดตข้อมูลทับของเดิมไปเลย ถ้าวันหนึ่งเราเผลอแก้ข้อมูลผิดไป หรือลูกค้าอยากรู้ว่าข้อมูลเมื่อเดือนที่แล้วหน้าตาเป็นยังไง เรามักจะกู้คืนไม่ได้เพราะมันถูกเขียนทับไปแล้ว นี่คือปัญหาที่ System-Versioned (ระบบเก็บประวัติการเปลี่ยนแปลงอัตโนมัติ) เข้ามาช่วยแก้ปัญหาตรงนี้ครับ
ลองนึกภาพว่าคุณกำลังเขียนไฟล์เอกสารใน Google Docs ที่มีระบบประวัติการแก้ไข (Version History) ให้เรากดดูได้ว่าใครแก้ตรงไหนเมื่อไหร่ System-Versioned Tables (ตารางเก็บประวัติการเปลี่ยนแปลง) ใน MariaDB ก็ทำงานคล้ายกันครับ มันจะเก็บข้อมูลเก่าไว้ให้อัตโนมัติทุกครั้งที่เรามีการแก้ไขหรือลบข้อมูลในตารางนั้นทิ้งไป
สำหรับมือใหม่ที่กำลังฝึกเขียนโค้ด การเข้าใจเรื่องนี้สำคัญมากเพราะในโลกการทำงานจริง ความผิดพลาดเกิดขึ้นได้เสมอ การมีระบบที่ย้อนเวลาข้อมูลได้จะช่วยให้คุณกลายเป็นโปรแกรมเมอร์ที่ทำงานได้อย่างมั่นใจมากขึ้น ไม่ต้องกังวลว่าข้อมูลจะหายไปตลอดกาลหากเกิดบั๊ก (ข้อผิดพลาดในโค้ด) ระหว่างการพัฒนาโปรเจกต์ครับ
การเตรียมตารางให้พร้อมเก็บประวัติ
การจะใช้งานฟีเจอร์นี้ใน MariaDB เราแค่ต้องบอกฐานข้อมูลตอนสร้างตารางว่าให้เปิดระบบ System-Versioned ไว้ด้วย คำสั่งที่ใช้ก็แทบไม่ต่างจากตารางปกติเลยครับ แค่เพิ่มเงื่อนไขพิเศษเข้าไปในตอนท้ายของคำสั่งสร้างตารางเท่านั้นเอง
ลองดูตัวอย่างการสร้างตารางเก็บข้อมูลพนักงานกันครับ เราจะสร้างตารางชื่อ employees ที่มีระบบเก็บประวัติการเปลี่ยนแปลงติดตัวมาด้วยตั้งแต่เริ่ม เพื่อให้ทุกการอัปเดตถูกจดบันทึกไว้ในระบบฐานข้อมูลโดยไม่ต้องเขียนโค้ดเพิ่มเอง
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
salary INT
) WITH SYSTEM VERSIONING; -- เปิดระบบเก็บประวัติอัตโนมัติ
อธิบายคำสั่ง: CREATE TABLE คือคำสั่งสร้างตาราง ส่วน WITH SYSTEM VERSIONING คือหัวใจสำคัญที่บอก MariaDB ว่าให้สร้างตารางนี้แบบพิเศษนะ ถ้ามีการแก้ข้อมูลให้เก็บเวอร์ชันเก่าไว้ในระบบเบื้องหลังทันที
ผลลัพธ์ที่ควรเห็น: เมื่อรันคำสั่งนี้สำเร็จ คุณจะได้ตาราง employees ที่พร้อมทำงาน หากคุณลองใช้คำสั่ง DESCRIBE employees คุณจะเห็นคอลัมน์พิเศษที่ MariaDB สร้างขึ้นมาเพื่อเก็บช่วงเวลาเริ่มต้นและสิ้นสุดของข้อมูลแต่ละบรรทัดครับ
การทำงานกับข้อมูลและดูประวัติย้อนหลัง
เมื่อเรามีตารางที่เปิด System-Versioned แล้ว การดึงข้อมูลมาดูจะสนุกขึ้นมากครับ เราสามารถสั่ง SELECT (คำสั่งดึงข้อมูล) แบบปกติเพื่อดูข้อมูลปัจจุบัน หรือจะเพิ่มคำสั่งพิเศษเพื่อระบุช่วงเวลาในอดีตที่เราอยากเห็นก็ได้
สมมติเรามีการแก้ไขเงินเดือนพนักงานไปแล้วหลายครั้ง เราอยากรู้ว่าพนักงานคนนี้เคยมีเงินเดือนเท่าไหร่บ้างในอดีต เราสามารถใช้คำสั่ง FOR SYSTEM_TIME (คำสั่งระบุช่วงเวลาที่ต้องการดู) เพื่อย้อนเวลากลับไปดูข้อมูล ณ จุดนั้นได้ทันที
-- ดูข้อมูลทั้งหมดที่เคยเกิดขึ้นในช่วงเวลานั้น
SELECT * FROM employees
FOR SYSTEM_TIME AS OF '2023-01-01 00:00:00';
อธิบายคำสั่ง: FOR SYSTEM_TIME คือการบอกฐานข้อมูลว่าไม่ต้องดูข้อมูลปัจจุบัน ให้ไปดูข้อมูล ณ ช่วงเวลาที่ระบุในวงเล็บแทน ส่วน AS OF คือการเลือกช่วงเวลาเจาะจงที่เราสนใจครับ
ผลลัพธ์ที่ควรเห็น: คุณจะได้รายชื่อพนักงานและเงินเดือน ณ วันที่ 1 มกราคม 2023 ออกมา แม้ว่าปัจจุบันข้อมูลในตารางจะถูกอัปเดตให้เป็นปัจจุบันไปแล้วก็ตาม เป็นการย้อนเวลาที่ง่ายและแม่นยำมากครับ
ข้อควรระวังสำหรับมือใหม่
ฟีเจอร์นี้ดูเหมือนวิเศษมากแต่ก็มีสิ่งที่มือใหม่ต้องระวัง คือเรื่องของ Storage (พื้นที่จัดเก็บข้อมูล) ครับ เพราะทุกครั้งที่คุณอัปเดตข้อมูลเดิม ระบบจะสร้างแถวใหม่เก็บประวัติไว้ ทำให้ขนาดของฐานข้อมูลโตขึ้นเรื่อยๆ เร็วกว่าตารางปกติหลายเท่าตัว
อีกจุดที่ต้องระวังคือการ Delete (ลบ) ข้อมูลครับ หลายคนเข้าใจผิดว่าลบแล้วจะหายไปเลย แต่ในตารางแบบนี้ ข้อมูลที่ถูกลบจะถูกย้ายไปเก็บในประวัติแทน คุณยังสามารถกู้คืนข้อมูลที่เผลอลบไปได้ด้วยการค้นหาประวัติย้อนหลังครับ
คำแนะนำคืออย่าเปิด System-Versioned กับทุกตารางในโปรเจกต์ของคุณ ให้เลือกใช้เฉพาะตารางที่สำคัญจริงๆ เช่น ตารางข้อมูลผู้ใช้งาน ตารางธุรกรรมการเงิน หรือตารางการตั้งค่าระบบ เพื่อไม่ให้ฐานข้อมูลบวมจนเครื่องเซิร์ฟเวอร์เต็มเร็วเกินไปครับ
ความแตกต่างระหว่างตารางปกติและตารางย้อนเวลา
เพื่อให้เห็นภาพชัดเจน เรามาเปรียบเทียบกันครับ ตารางแบบเดิมคือการเขียนข้อมูลลงบนกระดานไวท์บอร์ด ถ้าคุณลบแล้วเขียนใหม่ ข้อมูลเก่าจะหายไปทันที แต่ตารางแบบ System-Versioned เหมือนการเขียนข้อมูลลงในสมุดบันทึกที่ทุกหน้ามีการประทับตราเวลาไว้
ตารางปกติ:
- ใช้พื้นที่น้อยกว่า
- อัปเดตข้อมูลได้เร็ว
- กู้คืนข้อมูลเก่าไม่ได้หากไม่มีระบบสำรองข้อมูลภายนอก
ตารางแบบย้อนเวลา:
- ใช้พื้นที่มากกว่าเพราะเก็บประวัติไว้ทั้งหมด
- สามารถตรวจสอบความผิดพลาดหรือการแก้ไขย้อนหลังได้
- เหมาะสำหรับระบบที่เน้นความปลอดภัยของข้อมูลสูง
โปรแกรมเมอร์มือใหม่มักจะมองหาทางเลือกที่ง่ายที่สุด แต่การเลือกใช้ฟีเจอร์ให้เหมาะกับงานเป็นทักษะที่สำคัญกว่าครับ ถ้าโปรเจกต์ของคุณเป็นแค่แอปบันทึกรายการสิ่งที่ต้องทำ (To-do list) ก็อาจไม่จำเป็นต้องใช้ แต่ถ้าทำแอปธนาคารหรือแอปจัดการคลังสินค้า นี่คือฟีเจอร์ที่คุณต้องมีครับ
สรุป: การนำไปใช้ในงานจริง
การใช้ System-Versioned ใน MariaDB ช่วยให้เราจัดการข้อมูลได้อย่างมืออาชีพมากขึ้น ลองจินตนาการว่าคุณทำแอปพลิเคชันขายสินค้าออนไลน์ แล้วลูกค้าแจ้งว่ายอดเงินในกระเป๋าสตางค์ดิจิทัลหายไป คุณสามารถย้อนเวลาดูข้อมูลย้อนหลังเพื่อหาจุดที่เงินถูกตัดออกไปได้ภายในไม่กี่วินาทีครับ
ขั้นตอนการเริ่มใช้งานจริงให้เริ่มจากสร้างตารางที่ต้องการเปิดระบบนี้ขึ้นมาก่อน จากนั้นเขียนโค้ดเชื่อมต่อฐานข้อมูลตามปกติ การดึงข้อมูลมาแสดงผลในหน้าเว็บก็ทำได้ง่ายเหมือนเดิม เพียงแค่เพิ่มคำสั่งย้อนเวลาเมื่อต้องการตรวจสอบประวัติเท่านั้นเองครับ
หวังว่าบทความนี้จะช่วยให้คุณเข้าใจพลังของ MariaDB มากขึ้น การฝึกหัดใช้ฟีเจอร์เหล่านี้จะทำให้คุณก้าวข้ามจากการเขียนโค้ดแค่ให้รันได้ ไปสู่การเขียนโค้ดที่รองรับการใช้งานจริงและมีความปลอดภัยสูงครับ หากมีคำถามหรือติดขัดตรงไหน ลองนำไปทดลองรันในเครื่องตัวเองแล้วสังเกตผลลัพธ์ดูนะครับ