Custom Rules Validation

ในโลกของการพัฒนาซอฟต์แวร์ที่ต้องการความสมบูรณ์ของข้อมูล (Data Integrity) สูง การตรวจสอบความถูกต้องของข้อมูล (Validation) ไม่ได้จำกัดอยู่แค่การตรวจสอบรูปแบบพื้นฐาน (เช่น รูปแบบอีเมล หรือความยาวของสตริง) เท่านั้น แต่ยังรวมถึงการบังคับใช้กฎทางธุรกิจที่ซับซ้อนที่ต้องพิจารณาความสัมพันธ์ระหว่างข้อมูลหลายส่วนด้วย

สำหรับระบบฐานข้อมูลที่ทรงพลังอย่าง PostgreSQL การจัดการ Custom Rules Validation ถือเป็นหัวใจสำคัญในการรับประกันว่าข้อมูลที่ถูกบันทึกเข้าสู่ระบบนั้นเป็นไปตามข้อกำหนดทางธุรกิจที่กำหนดไว้ได้อย่างเคร่งครัด บทความนี้จะเจาะลึกวิธีการสร้างและใช้งาน Custom Validation ใน PostgreSQL โดยใช้ฟังก์ชัน (Functions) และข้อจำกัด (Constraints) เพื่อให้ระบบมีความเสถียรและน่าเชื่อถือในระดับ Senior Architect

หลักการทำงานของ Custom Validation ใน PostgreSQL

แทนที่จะพึ่งพาการตรวจสอบที่ชั้นแอปพลิเคชัน (Application Layer) เพียงอย่างเดียว การย้ายตรรกะการตรวจสอบที่ซับซ้อนลงไปที่ระดับฐานข้อมูล (Database Layer) เป็นแนวทางปฏิบัติที่ดีที่สุด (Best Practice) เพราะไม่ว่าข้อมูลจะถูกบันทึกผ่านช่องทางใด (API, GUI, Script) ก็ยังต้องผ่านกฎเกณฑ์เดียวกัน

ใน PostgreSQL เราสามารถบรรลุสิ่งนี้ได้โดยการสร้าง FUNCTION ที่เขียนด้วยภาษา PL/pgSQL เพื่อรับค่าที่ต้องการตรวจสอบ จากนั้นจึงนำฟังก์ชันนี้ไปผูกกับ CHECK CONSTRAINT หรือใช้ TRIGGER เพื่อให้ระบบบังคับใช้กฎนั้นๆ ก่อนการดำเนินการ INSERT หรือ UPDATE เสมอ

ตัวอย่างการสร้าง Custom Rule (PL/pgSQL)

สมมติว่าเรามีตาราง products และต้องการกำหนดกฎ 2 ข้อ:

  1. ราคาสินค้า (price) ต้องมากกว่าศูนย์เสมอ
  2. รหัสหมวดหมู่ (category_id) ที่ระบุต้องมีอยู่จริงในตาราง categories

เราจะสร้างฟังก์ชันที่รวมกฎทั้งสองเข้าด้วยกัน:

SQL

-- 1. สร้างฟังก์ชันสำหรับตรวจสอบกฎ (Custom Rule Function) -- <br>-- ฟังก์ชันนี้จะรับค่า price และ category_id มาตรวจสอบ<br>CREATE OR REPLACE FUNCTION validate_product_data(p_price NUMERIC, p_category_id INT) <br>RETURNS BOOLEAN AS $$<br>BEGIN<br>    -- กฎที่ 1: ตรวจสอบว่าราคาสินค้าต้องเป็นบวก<br>    IF p_price <= 0 THEN<br>        RAISE EXCEPTION 'Price must be greater than zero.';<br>    END IF;<br><br>    -- กฎที่ 2: ตรวจสอบว่า category_id ต้องมีอยู่ในตาราง categories<br>    IF NOT EXISTS (SELECT 1 FROM categories WHERE category_id = p_category_id) THEN<br>        RAISE EXCEPTION 'Invalid category ID provided. Must link to an existing category.';<br>    END IF;<br><br>    RETURN TRUE;<br>END;<br>$$ LANGUAGE plpgsql;<br><br>-- 2. นำฟังก์ชันไปผูกกับตาราง products ด้วย CHECK CONSTRAINT<br>ALTER TABLE products<br>ADD CONSTRAINT chk_product_validation<br>CHECK (validate_product_data(price, category_id));<br><br>-- การทดสอบ (ถ้าใส่ค่าผิด จะเกิดข้อผิดพลาดตามที่กำหนดในฟังก์ชัน)<br>INSERT INTO products (name, price, category_id) VALUES ('Test Item', -50, 1); -- จะล้มเหลวเพราะ Price <= 0<br>

สรุป: ประโยชน์ของการใช้ Custom Rules Validation

การใช้ Custom Validation ในระดับฐานข้อมูลด้วย PostgreSQL ไม่เพียงแต่ช่วยเพิ่มความสมบูรณ์ของข้อมูลเท่านั้น แต่ยังช่วยให้โค้ดในระดับแอปพลิเคชันมีความเรียบง่ายขึ้น เพราะไม่ต้องกังวลว่าจะมีใครส่งข้อมูลที่ขัดแย้งกับกฎทางธุรกิจเข้ามาได้ การใช้ CHECK CONSTRAINT ที่อ้างอิงฟังก์ชันที่ซับซ้อน ทำให้ PostgreSQL ทำหน้าที่เป็นผู้พิทักษ์ข้อมูลที่แข็งแกร่งที่สุด (Robust Data Guardian) อย่างแท้จริง

Exit mobile version