PlusMagi's Blog By Pitt Phunsanit Backend,Database PHP: การทำ Database Migration แทนการรันคำสั่ง SQL สดบน Server

PHP: การทำ Database Migration แทนการรันคำสั่ง SQL สดบน Server

ในฐานะนักพัฒนา PHP ที่ต้องทำงานกับระบบที่เชื่อมต่อฐานข้อมูลอยู่เสมอ ปัญหาที่ใหญ่ที่สุดอย่างหนึ่งคือการจัดการโครงสร้างตาราง (Schema Evolution) เมื่อแอปพลิเคชันของเราเติบโตขึ้น โครงสร้างของฐานข้อมูลก็จะเปลี่ยนแปลงตามไปด้วย ไม่ว่าจะเป็นการเพิ่มคอลัมน์, การเปลี่ยนชนิดข้อมูล, หรือการสร้างความสัมพันธ์ใหม่ การรันคำสั่ง SQL (Raw SQL) โดยตรงบน Production Server จึงเป็นแนวทางที่เสี่ยงและไม่สามารถควบคุมได้

ทางออกที่ถูกต้องและเป็นมาตรฐานคือการใช้ระบบ Database Migration ซึ่งเป็นกระบวนการที่ช่วยให้เราสามารถบันทึก (version control) และจัดการการเปลี่ยนแปลงโครงสร้างของฐานข้อมูลได้อย่างเป็นระเบียบ มีลำดับขั้นตอน และมีความปลอดภัย ทำให้มั่นใจได้ว่าทุกสภาพแวดล้อม (Local, Staging, Production) จะมี Schema ที่สอดคล้องกันเสมอ

หลักการทำงานของ Database Migration ใน PostgreSQL

ระบบ Migration ไม่ใช่แค่การรันคำสั่ง SQL แต่คือการสร้างระบบที่จัดการการรันคำสั่งเหล่านั้นให้เป็นเวอร์ชัน (Versioned) โดยมีหลักการสำคัญ 3 ส่วน:

  • 1. Versioning (การกำหนดเวอร์ชัน): การเปลี่ยนแปลงทุกครั้งจะถูกบันทึกเป็นไฟล์ที่มีชื่อระบุวันที่และเวลา (เช่น 20231027_add_user_email.php) ทำให้เกิดลำดับขั้นตอนที่ชัดเจนในการอัพเกรด
  • 2. Up/Down Migration: แต่ละไฟล์จะประกอบด้วยฟังก์ชัน up() (สำหรับนำไปใช้จริง) และ down() (สำหรับย้อนกลับ/Rollback) ซึ่งสำคัญมากสำหรับการแก้ไขข้อผิดพลาด
  • 3. Migration Tracker: ระบบจะสร้างตารางพิเศษในฐานข้อมูลเพื่อติดตามว่า เวอร์ชันใดบ้างที่ได้ถูกนำไปใช้แล้ว (Applied Versions) เพื่อป้องกันการรันคำสั่งซ้ำหรือข้ามเวอร์ชัน

ตัวอย่างการใช้ PostgreSQL Migration

สมมติว่าเราต้องการเพิ่มคอลัมน์ phone_number ให้กับตาราง users โดยใช้ PostgreSQL Migration ใน PHP โค้ดจะถูกจัดเก็บในไฟล์ที่ระบุเวอร์ชัน และใช้คำสั่ง ALTER TABLE ที่ถูกต้องของ PostgreSQL:

PHP

// File: 20231027_add_phone_number.php

public function up(): void {
    // PostgreSQL Syntax: ALTER TABLE
    $sql = "ALTER TABLE users ADD COLUMN phone_number VARCHAR(20) NULL;";
    // Execute $sql ผ่าน PDO หรือ ORM
}

public function down(): void {
    // Rollback: ลบคอลัมน์ที่เพิ่มไป
    $sql = "ALTER TABLE users DROP COLUMN phone_number;";
    // Execute $sql
}

การใช้ Migration Framework (เช่น Doctrine Migrations หรือ Laravel Migrations) จะจัดการการรันคำสั่งเหล่านี้ให้เป็นระบบอัตโนมัติ ทำให้เราไม่ต้องกังวลเรื่องการรันคำสั่ง SQL ด้วยมืออีกต่อไป

บทสรุป: ทำไมต้องใช้ Migration

การใช้ระบบ Database Migration ไม่เพียงแค่ทำให้โค้ดดูเป็นระเบียบเท่านั้น แต่ยังเป็นหลักประกันความเสถียรของระบบทั้งหมด มันช่วยให้ทีมงานหลายคนสามารถทำงานกับฐานข้อมูลพร้อมกันได้อย่างปลอดภัย และที่สำคัญที่สุดคือการทำให้สภาพแวดล้อมการพัฒนา (Local) และสภาพแวดล้อมจริง (Production) มีโครงสร้างฐานข้อมูลที่ตรงกันเสมอ ทำให้การ Deploy ระบบเป็นไปอย่างราบรื่นและลดโอกาสเกิดข้อผิดพลาดร้ายแรงได้อย่างมาก

Exit mobile version