ป้ายกำกับ: SQL Triggers

WeakRef และ FinalizationRegistry: เครื่องมือขั้นสูงในการจัดการหน่วยความจำและ Garbage CollectionWeakRef และ FinalizationRegistry: เครื่องมือขั้นสูงในการจัดการหน่วยความจำและ Garbage Collection

ในฐานะสถาปนิกระบบ (System Architect) การจัดการหน่วยความจำและการปล่อยทรัพยากร (Resource Cleanup) อย่างมีประสิทธิภาพถือเป็นรากฐานของระบบที่เสถียร ไม่ว่าจะเป็นการเขียนโค้ดในภาษาโปรแกรมหรือการออกแบบฐานข้อมูลเชิงสัมพันธ์ (Relational Database) ปัญหาการรั่วไหลของทรัพยากร (Resource Leak) ยังคงเป็นภัยคุกคามที่ซ่อนเร้นที่สุด

แนวคิดของ Weak Reference และ Finalization Registry เป็นกลไกขั้นสูงที่ใช้ในการควบคุมวงจรชีวิตของวัตถุ (Object Lifecycle) เพื่อป้องกันไม่ให้วัตถุถูกยึดไว้โดยไม่จำเป็น (Unintended Retention) ซึ่งในโลกของ PostgreSQL แม้จะไม่มีคำสั่ง WeakRef โดยตรง แต่หลักการเหล่านี้ถูกแทนที่ด้วยกลไกการจัดการความสัมพันธ์และวงจรชีวิตของข้อมูลที่แม่นยำกว่า เช่น การใช้ Foreign Keys, Triggers, และ Transaction Management

Weak References: การอ้างอิงที่อ่อนแอในบริบทของฐานข้อมูล

ในเชิงแนวคิด Strong Reference คือการที่ตาราง A มี Foreign Key ชี้ไปยังตาราง B อย่างแข็งแกร่ง ทำให้ฐานข้อมูลเชื่อว่าข้อมูลใน B จะต้องอยู่ตราบใดที่ A ยังอ้างถึงมันอยู่เสมอ การที่ข้อมูลถูก ‘ยึด’ ไว้โดยไม่จำเป็นนี้คือสิ่งที่ต้องหลีกเลี่ยง

ใน PostgreSQL เราจัดการแนวคิดนี้โดยการกำหนดความสัมพันธ์ที่ชัดเจนและใช้กลไกการลบที่เหมาะสม เพื่อให้แน่ใจว่าเมื่อข้อมูลหลัก (Parent) ถูกลบ ข้อมูลที่อ้างอิง (Child) จะถูกจัดการอย่างถูกต้อง โดยไม่ทำให้เกิดการอ้างอิงที่ตายตัว (Orphaned Records) โดยไม่จำเป็น

การจำลอง Weak Reference ด้วย ON DELETE CASCADE

แทนที่จะใช้การอ้างอิงที่แข็งแกร่งตลอดไป เราสามารถกำหนดให้การลบข้อมูลหลักส่งผลกระทบต่อข้อมูลลูกอย่างเป็นระบบ:

SQL

-- สร้างตารางหลัก (Parent) และตารางรอง (Child) ที่มีความสัมพันธ์กัน<br>CREATE TABLE departments (department_id INT PRIMARY KEY, name VARCHAR(100));<br>CREATE TABLE employees (employee_id INT PRIMARY KEY, department_id INT, name VARCHAR(100));<br><br>-- การใช้ ON DELETE CASCADE คือการกำหนดให้เมื่อลบ Parent ข้อมูล Child ที่อ้างอิงจะถูกลบตามไปด้วย<br>ALTER TABLE employees ADD CONSTRAINT fk_department<br>FOREIGN KEY (department_id) REFERENCES departments (department_id) ON DELETE CASCADE;<br><br>-- ตัวอย่างการลบ: หากลบแผนก 101 ข้อมูลพนักงานทุกคนที่อยู่ในแผนกนี้จะถูกลบตาม<br>DELETE FROM departments WHERE department_id = 101;<br>

Finalization Registry: การรับประกันการทำความสะอาดทรัพยากร

Finalization Registry มีหน้าที่ในการเรียกใช้โค้ดทำความสะอาด (Cleanup) เมื่อวัตถุถูกเก็บขยะ (Garbage Collected) ใน PostgreSQL เราบรรลุเป้าหมายนี้ด้วยการใช้ Database Triggers และ Stored Procedures ซึ่งรับประกันว่าเมื่อมีการเปลี่ยนแปลงข้อมูลที่สำคัญ (INSERT, UPDATE, DELETE) จะมีการเรียกใช้ฟังก์ชันที่กำหนดไว้เพื่อจัดการทรัพยากรที่เกี่ยวข้องอย่างสมบูรณ์

ตัวอย่างการทำความสะอาดทรัพยากรด้วย Trigger

สมมติว่าเมื่อพนักงานถูกลบ จะต้องมีการอัปเดตสถานะการเข้าถึงทรัพยากรอื่น ๆ ด้วย:

SQL

-- 1. สร้างตารางทรัพยากรที่ต้องทำความสะอาด<br>CREATE TABLE resources (resource_id INT PRIMARY KEY, employee_id INT, resource_name VARCHAR(100));<br><br>-- 2. สร้างฟังก์ชันสำหรับทำความสะอาด (Cleanup Function)<br>CREATE OR REPLACE FUNCTION cleanup_resource_on_employee_delete() RETURNS TRIGGER AS $$
BEGIN
    -- นี่คือการจำลองการทำความสะอาดทรัพยากรที่ผูกกับพนักงานที่กำลังถูกลบ
    DELETE FROM resources WHERE employee_id = OLD.employee_id;
    RETURN OLD; -- ต้องคืนค่า ROW เก่า
END;$$ LANGUAGE plpgsql;<br><br>-- 3. ผูก Trigger เข้ากับตารางพนักงาน<br>CREATE TRIGGER trg_cleanup_resources<br>AFTER DELETE ON employees<br>FOR EACH ROW<br>EXECUTE FUNCTION cleanup_resource_on_employee_delete();<br>

บทสรุป

แม้ว่า PostgreSQL จะไม่มีคำสั่ง WeakRef หรือ FinalizationRegistry โดยตรง แต่หลักการพื้นฐานของการจัดการวงจรชีวิตของทรัพยากรยังคงเป็นสิ่งสำคัญอย่างยิ่ง การใช้ Foreign Keys อย่างเหมาะสม, การกำหนด ON DELETE CASCADE, และการใช้ Triggers คือเครื่องมือระดับสถาปัตยกรรมที่ช่วยให้เราสามารถสร้างระบบที่รับประกันการทำความสะอาดทรัพยากรได้อย่างแม่นยำและเชื่อถือได้ ทำให้แอปพลิเคชันของเรามีเสถียรภาพสูงสุดในระยะยาว