PlusMagi's Blog By Pitt Phunsanit Database Database: Soft Constraints

Database: Soft Constraints

ในโลกของการออกแบบฐานข้อมูล (Database Design) การรักษาความสมบูรณ์ของข้อมูล (Data Integrity) เป็นรากฐานที่สำคัญที่สุด โดยทั่วไปแล้วเราจะใช้ Foreign Key (FK) เพื่อบังคับความสัมพันธ์ระหว่างตารางในระดับ Physical Database อย่างไรก็ตาม เมื่อระบบต้องรองรับข้อมูลขนาดใหญ่มาก (Big Data) หรือมีปริมาณ Transaction สูงมาก (High Throughput) การตรวจสอบความสัมพันธ์ด้วย FK ในระดับ Database Engine อาจกลายเป็นคอขวด (Bottleneck) ที่ส่งผลกระทบต่อ Performance อย่างรุนแรง

นี่คือจุดที่แนวคิดของ Soft Constraints หรือที่เรียกว่า Application-Level Integrity เข้ามามีบทบาท Soft Constraints ไม่ได้หมายถึงการยกเลิกกฎความสัมพันธ์ แต่เป็นการย้ายหน้าที่ในการตรวจสอบความถูกต้องของข้อมูลจากตัว Database Engine ไปไว้ที่ระดับ Application Layer หรือ Business Logic แทน ทำให้เราสามารถคงความยืดหยุ่นและความเร็วในการทำงานของฐานข้อมูลได้สูงสุด โดยยังคงรับประกันความถูกต้องตามหลักตรรกะ (Logical Consistency) ของข้อมูลไว้ได้

Soft Constraints คืออะไร และทำงานอย่างไรใน PostgreSQL?

Soft Constraints คือการนิยามความสัมพันธ์เชิงตรรกะว่าข้อมูลในคอลัมน์หนึ่งควรจะเชื่อมโยงกับข้อมูลในอีกคอลัมน์หนึ่ง แม้ว่าเราจะไม่ได้ใช้คำสั่ง ALTER TABLE ADD CONSTRAINT FOREIGN KEY เพื่อบังคับในระดับ Physical Database ของ PostgreSQL ก็ตาม

แทนที่จะพึ่งพาข้อจำกัดทางกายภาพ (Physical Constraint) เราจะใช้กลไกที่เรียกว่า Database Triggers ร่วมกับฟังก์ชัน (Function) ที่เขียนด้วยภาษา PL/pgSQL ของ PostgreSQL เพื่อทำการตรวจสอบความสัมพันธ์ก่อนที่จะอนุญาตให้มีการ INSERT หรือ UPDATE ข้อมูลจริง

ตัวอย่างการใช้งานใน PostgreSQL (Trigger Mechanism)

สมมติว่าเรามีตาราง products และตาราง orders โดยที่ทุกรายการสั่งซื้อ (Order) จะต้องอ้างอิงถึง Product ID ที่มีอยู่จริงในตาราง products

เราสามารถจำลอง Soft Constraint นี้ได้ดังนี้:

SQL

-- 1. สร้างตารางหลัก (Parent Table) และตารางที่ต้องตรวจสอบ (Child Table)

SQL

CREATE TABLE products (product_id INT PRIMARY KEY, name VARCHAR(100));

SQL

CREATE TABLE orders (order_id SERIAL PRIMARY KEY, product_id INT, quantity INT);

-- 2. สร้างฟังก์ชันตรวจสอบ (The Soft Constraint Logic)

ฟังก์ชันนี้จะตรวจสอบว่า product_id ที่กำลังจะถูกแทรกเข้ามานั้น มีอยู่จริงในตาราง products หรือไม่

SQL

CREATE OR REPLACE FUNCTION check_product_exists()

SQL

RETURNS TRIGGER AS $$
BEGIN
    IF NOT EXISTS (SELECT 1 FROM products WHERE product_id = NEW.product_id)
    THEN
        RAISE EXCEPTION 'Product ID % does not exist. Soft Constraint Violation.', NEW.product_id;
    END IF;
    RETURN NEW;
END;$$ LANGUAGE plpgsql;

-- 3. สร้าง Trigger เพื่อผูกฟังก์ชันเข้ากับตาราง orders

SQL

CREATE TRIGGER trg_check_order_product

SQL

BEFORE INSERT ON orders

SQL

FOR EACH ROW <code> EXECUTE FUNCTION check_product_exists();

-- การทดสอบ: หากพยายาม INSERT product_id=999 (ซึ่งไม่มีอยู่) จะถูกบล็อกด้วย Exception

SQL

INSERT INTO orders (product_id, quantity) VALUES (999, 5);

-- ผลลัพธ์ที่ได้คือ: ERROR: Product ID 999 does not exist. Soft Constraint Violation.

บทสรุป: เมื่อใดควรใช้ Soft Constraints?

Soft Constraints เป็นเครื่องมือทางสถาปัตยกรรมที่ทรงพลังอย่างยิ่งในการออกแบบระบบที่ต้องการความสามารถในการขยายตัว (Scalability) สูง โดยเฉพาะอย่างยิ่งในระบบ Big Data หรือ Microservices ที่มีการประมวลผลข้อมูลข้ามบริการ (Cross-Service Transaction) การใช้ Soft Constraints ช่วยให้เราสามารถรักษาสมรรถนะ (Performance) ของฐานข้อมูลหลักได้ ในขณะที่ยังคงรับประกันความถูกต้องของข้อมูลตามหลักธุรกิจ (Business Logic) ได้อย่างสมบูรณ์ ดังนั้น การทำความเข้าใจความแตกต่างระหว่าง Physical Constraint และ Soft Constraint จึงเป็นทักษะสำคัญสำหรับ Senior Database Architect ทุกคน