PlusMagi's Blog By Pitt Phunsanit Database Version Control (หรือ Source Control )

Version Control (หรือ Source Control )

Version Control คืออะไร? คู่มือสำหรับนักพัฒนาและสถาปนิกข้อมูล

ในโลกของการพัฒนาซอฟต์แวร์และการจัดการฐานข้อมูลขนาดใหญ่ การเปลี่ยนแปลงคือสิ่งที่เกิดขึ้นตลอดเวลา แต่การเปลี่ยนแปลงเหล่านั้นอาจนำมาซึ่งความผิดพลาดร้ายแรงได้ Version Control (VC) หรือที่รู้จักกันในชื่อ Source Control คือระบบที่ทำหน้าที่บันทึกประวัติการเปลี่ยนแปลงของไฟล์โค้ด โครงสร้างฐานข้อมูล (Schema) และข้อมูลต่าง ๆ อย่างเป็นระบบ

ระบบนี้เปรียบเสมือน ‘เครื่องไทม์แมชชีน’ ที่ช่วยให้ทีมพัฒนาสามารถย้อนกลับไปดู แก้ไข หรือกู้คืนโปรเจกต์ในเวอร์ชันที่สมบูรณ์ที่สุดได้ตลอดเวลา โดยเฉพาะอย่างยิ่งเมื่อทำงานกับฐานข้อมูลที่ซับซ้อนอย่าง PostgreSQL การควบคุมเวอร์ชันจึงเป็นหัวใจสำคัญของความมั่นคงของระบบ

ทำไม Version Control จึงสำคัญต่อการทำงานกับ PostgreSQL?

หากคุณเคยทำการแก้ไข Schema ของตารางหลักใน PostgreSQL แล้วเกิดข้อผิดพลาดจนระบบล่ม การมี Version Control ที่ดีจะช่วยให้คุณสามารถกู้คืนโครงสร้างฐานข้อมูล (Schema) และข้อมูล (Data) ไปยังจุดที่เคยใช้งานได้ปกติภายในไม่กี่วินาที นี่คือเหตุผลหลักที่ว่าทำไม VC จึงจำเป็น:

  • การกู้คืนความผิดพลาด (Rollback): เมื่อคำสั่ง SQL ที่รันไปทำให้ข้อมูลเสียหาย สามารถย้อนกลับไปใช้ Schema หรือข้อมูลก่อนหน้าได้ทันที
  • การตรวจสอบประวัติ (Audit Trail): ทราบอย่างชัดเจนว่าใคร (User ID) เป็นผู้แก้ไขอะไร (Query) ที่บรรทัดไหน และแก้ไขไปเมื่อไหร่
  • การทำงานร่วมกัน (Collaboration): ทีมงานหลายคนสามารถพัฒนาฟีเจอร์ใหม่ ๆ บนฐานข้อมูลเดียวกันได้พร้อมกัน โดยระบบจะจัดการรวมการเปลี่ยนแปลงเหล่านั้นเข้าด้วยกันอย่างปลอดภัย
  • การแยกสายงาน (Branching): สามารถสร้างสภาพแวดล้อมจำลอง (Feature Branch) เพื่อทดลองฟีเจอร์ใหม่ ๆ โดยไม่กระทบต่อโค้ดหลัก (Production Code) ที่กำลังทำงานอยู่

หลักการทำงานของ Version Control ในบริบทของ PostgreSQL

แม้ว่า Version Control หลักอย่าง Git จะทำงานกับไฟล์โค้ดภายนอก แต่หลักการของมันก็สามารถนำมาประยุกต์ใช้กับการจัดการเวอร์ชันของ Schema และข้อมูลใน PostgreSQL ได้ โดยเรามักใช้กลไกที่เรียกว่า Auditing หรือ History Table เพื่อจำลองการทำงานของ VC ภายในฐานข้อมูลเอง

สมมติว่าเรามีตารางหลักชื่อ products และต้องการบันทึกประวัติการเปลี่ยนแปลงราคา (Price) ทุกครั้งที่ถูกอัปเดต เราจะสร้างตารางประวัติ (History Table) เพื่อเก็บข้อมูลเวอร์ชันเก่าไว้:

SQL

SQL

-- 1. สร้างตารางหลัก (Current Version) และตารางประวัติ (History)

SQL

SQL

CREATE TABLE products (

SQL

SQL

product_id SERIAL PRIMARY KEY,

SQL

SQL

name VARCHAR(100) NOT NULL,

SQL

SQL

price NUMERIC(10, 2)

SQL

SQL

);

SQL

SQL

CREATE TABLE product_history (

SQL

SQL

history_id SERIAL PRIMARY KEY,

SQL

SQL

product_id INTEGER,

SQL

SQL

old_price NUMERIC(10, 2),

SQL

SQL

changed_by VARCHAR(50),

SQL

SQL

change_timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP

SQL

SQL

);

จากนั้นเราใช้ Trigger เพื่อให้ PostgreSQL บันทึกการเปลี่ยนแปลงทุกครั้งที่เกิดการ UPDATE:

SQL

SQL

CREATE OR REPLACE FUNCTION log_price_change()

SQL

SQL

RETURNS TRIGGER AS $$

SQL

SQL

BEGIN

SQL

SQL

INSERT INTO product_history (product_id, old_price, changed_by)

SQL

SQL

VALUES (OLD.product_id, OLD.price, CURRENT_USER);

SQL

SQL

RETURN NEW;

SQL

SQL

END;

SQL

SQL

$$ LANGUAGE plpgsql;

SQL

SQL

CREATE TRIGGER product_update_trigger

SQL

SQL

AFTER UPDATE ON products

SQL

SQL

FOR EACH ROW

SQL

SQL

WHEN (OLD.price IS DISTINCT FROM NEW.price)

SQL

SQL

EXECUTE FUNCTION log_price_change();

บทสรุป: การบริหารความเสี่ยงด้วย Version Control

Version Control ไม่ได้เป็นเพียงเครื่องมือสำหรับนักพัฒนาเท่านั้น แต่ยังเป็นกลไกสำคัญในการบริหารความเสี่ยงของระบบฐานข้อมูลทั้งหมด การทำความเข้าใจหลักการของมัน ไม่ว่าจะเป็นการใช้ Git ในระดับโค้ด หรือการใช้ Trigger/History Table ในระดับ PostgreSQL จะช่วยให้คุณสร้างระบบที่แข็งแกร่ง ปลอดภัย และสามารถย้อนกลับไปสู่สถานะที่เชื่อถือได้เสมอเมื่อเกิดความผิดพลาด