PlusMagi's Blog By Pitt Phunsanit Database Rule Engine: ตัวอย่างง่าย ๆ

Rule Engine: ตัวอย่างง่าย ๆ

ในโลกของการพัฒนาซอฟต์แวร์ขนาดใหญ่ ธุรกิจมักจะมีกฎเกณฑ์ (Business Rules) ที่ซับซ้อนและเปลี่ยนแปลงอยู่เสมอ หากเราฝังกฎเหล่านี้ไว้ในโค้ดหลัก (Application Logic) เมื่อกฎเปลี่ยนแปลงเพียงเล็กน้อย เราจะต้องแก้ไขและ Deploy โค้ดหลักทั้งหมด ซึ่งเป็นกระบวนการที่ยุ่งยากและเสี่ยงสูง

นี่คือจุดที่ Rule Engine เข้ามามีบทบาท Rule Engine คือกลไกที่ออกแบบมาเพื่อแยกตรรกะทางธุรกิจ (Business Logic) ออกจากโค้ดหลัก ทำให้เราสามารถจัดการ, ทดสอบ, และอัปเดตกฎเกณฑ์ต่างๆ ได้อย่างอิสระ โดยไม่ต้องแตะต้องโค้ดส่วนอื่นเลย

Rule Engine คืออะไร และทำไมต้องใช้ใน PostgreSQL?

โดยพื้นฐานแล้ว Rule Engine คือระบบที่รับชุดของ เงื่อนไข (Conditions) และชุดของ การกระทำ (Actions) เมื่อเงื่อนไขเหล่านั้นเป็นจริง (True) ระบบก็จะทำการดำเนินการตามที่กำหนดไว้

แม้ว่า Rule Engine โดยเฉพาะจะถูกสร้างด้วยภาษาเฉพาะทาง (DSL) แต่ในบริบทของฐานข้อมูลเชิงสัมพันธ์อย่าง PostgreSQL เราสามารถจำลองการทำงานของ Rule Engine ได้อย่างมีประสิทธิภาพโดยใช้ฟังก์ชัน SQL ขั้นสูง เช่น CASE WHEN หรือการใช้ Stored Procedures เพื่อให้การตัดสินใจทางธุรกิจเกิดขึ้นที่ระดับฐานข้อมูล (Database Layer) ซึ่งมีความน่าเชื่อถือและเป็น Transactional มาก

ตัวอย่าง: ระบบอนุมัติการลา (Leave Approval)

เราจะจำลองการทำงานของตารางตัดสินใจ (Decision Table) ในการอนุมัติการลา โดยมีกฎดังนี้:

  • กฎที่ 1: หากแจ้งล่วงหน้า 3 วันขึ้นไป และ มีงานด่วน (Urgent Work) จะถูก ไม่อนุมัติ
  • กฎที่ 2: หากแจ้งล่วงหน้าไม่ถึง 3 วัน แต่ ไม่มีงานด่วน จะถูก อนุมัติ

เราสามารถใช้คำสั่ง SQL ของ PostgreSQL เพื่อประมวลผลกฎเหล่านี้ได้ดังนี้:

SQL

SQL

-- 1. สร้างตารางจำลองข้อมูลการลา (Leave Request) ภายใต้ PostgreSQL
CREATE TABLE leave_requests (
    request_id SERIAL PRIMARY KEY,
    is_advance_days_3_or_more BOOLEAN,
    has_urgent_work BOOLEAN,
    leave_days INTEGER
);

-- 2. ใส่ข้อมูลตัวอย่าง (สถานการณ์ที่ 1: ไม่อนุมัติ)
INSERT INTO leave_requests (is_advance_days_3_or_more, has_urgent_work, leave_days) VALUES
    (TRUE, TRUE, 2);

-- 3. การใช้ Rule Engine จำลองด้วย CASE WHEN
SELECT
    request_id,
    is_advance_days_3_or_more,
    has_urgent_work,
    CASE
        WHEN is_advance_days_3_or_more = TRUE AND has_urgent_work = TRUE THEN 'ไม่อนุมัติ (กฎ 1)'
        WHEN is_advance_days_3_or_more = FALSE AND has_urgent_work = FALSE THEN 'อนุมัติ (กฎ 2)'
        ELSE 'ต้องพิจารณาเพิ่มเติม'
    END AS approval_status
FROM
    leave_requests;

การวิเคราะห์โค้ด (The Logic Flow)

ในตัวอย่างข้างต้น เราใช้คำสั่ง CASE WHEN ซึ่งเป็นหัวใจสำคัญในการจำลอง Rule Engine ใน PostgreSQL:

  1. WHEN is_advance_days_3_or_more = TRUE AND has_urgent_work = TRUE THEN 'ไม่อนุมัติ...': นี่คือการตรวจสอบเงื่อนไขที่ 1 (AND Logic) เมื่อเงื่อนไขทั้งหมดเป็นจริง ระบบจะกำหนดผลลัพธ์เป็น ‘ไม่อนุมัติ’ ทันที
  2. WHEN is_advance_days_3_or_more = FALSE AND has_urgent_work = FALSE THEN 'อนุมัติ...': หากเงื่อนไขแรกไม่เป็นจริง ระบบจะตรวจสอบเงื่อนไขที่ 2 ต่อไป
  3. ELSE 'ต้องพิจารณาเพิ่มเติม': ส่วนนี้คือ Default Action หรือกฎสำรอง หากไม่เข้าเงื่อนไขใดๆ เลย

สรุป: ประโยชน์ของการใช้ Rule Engine ใน PostgreSQL

การใช้ตรรกะทางธุรกิจที่ซับซ้อนในรูปแบบของ Rule Engine ที่ฝังอยู่ใน PostgreSQL มีข้อดีหลายประการ:

  • ความยืดหยุ่น (Flexibility): นักธุรกิจสามารถปรับเปลี่ยนกฎเกณฑ์ได้โดยการแก้ไขข้อมูลหรือโค้ด SQL เพียงเล็กน้อย โดยไม่จำเป็นต้องรันการ Deploy โค้ดแอปพลิเคชันใหม่
  • ความน่าเชื่อถือ (Reliability): การตัดสินใจเกิดขึ้นที่ระดับฐานข้อมูล ทำให้มั่นใจได้ว่ากฎเกณฑ์จะถูกบังคับใช้อย่างสม่ำเสมอในทุก Transaction
  • ประสิทธิภาพ (Performance): การประมวลผลเงื่อนไขที่ระดับฐานข้อมูลมักจะเร็วกว่าการเรียกใช้ API ภายนอกเพื่อตัดสินใจ
Exit mobile version