🗄️ MySQL/MariaDB

เจาะลึก System-Versioned ใน MariaDB: วิธีสร้างตารางย้อนเวลาเก็บประวัติข้อมูลอัตโนมัติ

7 นาที 24 views บันทึกเป็น PDF
เจาะลึก System-Versioned ใน MariaDB: วิธีสร้างตารางย้อนเวลาเก็บประวัติข้อมูลอัตโนมัติ

เคยเผลอแก้ข้อมูลผิดแล้วกู้คืนไม่ได้ไหม? มาลองใช้ System-Versioned ใน MariaDB กันครับ ช่วยเก็บประวัติการเปลี่ยนแปลงอัตโนมัติ ย้อนดูข้อมูลเก่าได้ง่ายๆ

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 มากขึ้น การฝึกหัดใช้ฟีเจอร์เหล่านี้จะทำให้คุณก้าวข้ามจากการเขียนโค้ดแค่ให้รันได้ ไปสู่การเขียนโค้ดที่รองรับการใช้งานจริงและมีความปลอดภัยสูงครับ หากมีคำถามหรือติดขัดตรงไหน ลองนำไปทดลองรันในเครื่องตัวเองแล้วสังเกตผลลัพธ์ดูนะครับ

แชร์บทความ

Facebook X LINE

บทความที่เกี่ยวข้อง

MySQL/MariaDB

สอนวิธี Backup และ Restore ฐานข้อมูล MySQL/MariaDB ด้วย mysqldump บน Windows

มือใหม่หัดเขียนโปรแกรมต้องรู้! วิธีสำรองข้อมูล (Backup) และกู้คืน (Restore) ฐานข้อมูลด้วย mysqldump ผ่าน Command Line ป้องกันงานหาย ทำตามได้จริง

1 month ago 9 นาที
23 views
จัดการ User และสิทธิ์ใน MySQL/MariaDB ให้ปลอดภัยด้วยคำสั่ง GRANT และ REVOKE
MySQL/MariaDB

จัดการ User และสิทธิ์ใน MySQL/MariaDB ให้ปลอดภัยด้วยคำสั่ง GRANT และ REVOKE

มือใหม่หัดใช้ฐานข้อมูลต้องรู้! วิธีสร้าง User, กำหนดสิทธิ์ (Permission) และตั้งค่าความปลอดภัยให้ MySQL/MariaDB เพื่อป้องกันข้อมูลรั่วไหลแบบมือโปร

1 month ago 8 นาที
24 views
เข้าใจ MySQL และ MariaDB Trigger: เขียนคำสั่งอัตโนมัติให้ฐานข้อมูลทำงานแทนเรา
MySQL/MariaDB

เข้าใจ MySQL และ MariaDB Trigger: เขียนคำสั่งอัตโนมัติให้ฐานข้อมูลทำงานแทนเรา

อยากให้ฐานข้อมูลทำงานอัตโนมัติเมื่อมีการเพิ่มหรือลบข้อมูลไหม? มาเรียนรู้การใช้ Trigger (ตัวกระตุ้นการทำงาน) ใน MySQL และ MariaDB เพื่อลดภาระงานโค้ดกัน

1 month ago 8 นาที
23 views