ในฐานะ Senior Architect ที่ออกแบบระบบฐานข้อมูลขนาดใหญ่ ความท้าทายที่สำคัญที่สุดอย่างหนึ่งคือการรับประกันความสมบูรณ์ของข้อมูล (Data Integrity) เมื่อระบบต้องรองรับการเปลี่ยนแปลงข้อมูลพร้อมกันจากผู้ใช้งานหรือบริการหลายส่วน (Concurrent Operations) สถานการณ์ที่ข้อมูลกำลังถูกแก้ไขหรืออัปเดตในจุดเดียวกันนี้ เราเรียกมันว่า ‘Conflict’ (ความขัดแย้ง) ซึ่งเป็นหัวใจของการออกแบบระบบที่ต้องมีความทนทานสูง
สำหรับโลกของการพัฒนาแอปพลิเคชันที่ใช้ PostgreSQL การจัดการ Conflict Resolution ไม่ได้หมายถึงการรวมไฟล์โค้ด (Code Merge) แต่หมายถึงการจัดการความขัดแย้งของข้อมูล (Data Conflicts) หรือโครงสร้าง (Schema Conflicts) โดยมีเป้าหมายหลักคือการรับประกันว่าข้อมูลจะถูกอัปเดตอย่างถูกต้องและไม่สูญหาย แม้จะมีหลาย Transaction พยายามเขียนข้อมูลพร้อมกัน
หลักการทำงานของ Conflict Resolution ใน PostgreSQL
PostgreSQL มีกลไกที่แข็งแกร่งมากในการจัดการความขัดแย้งผ่านระบบ Transaction Isolation และ Constraint Checking โดยเฉพาะอย่างยิ่งการใช้คำสั่ง ON CONFLICT ซึ่งเป็นไวยากรณ์ที่ทรงพลังที่สุดในการจัดการสถานการณ์ที่ข้อมูลที่เราพยายามแทรกเข้าไปนั้นมี Primary Key หรือ Unique Constraint ที่ขัดแย้งกับข้อมูลที่มีอยู่แล้ว
การใช้ไวยากรณ์ ON CONFLICT (UPSERT)
คำสั่ง INSERT ... ON CONFLICT DO UPDATE หรือที่รู้จักกันในชื่อ UPSERT (Update or Insert) คือมาตรฐานในการจัดการ Merge ข้อมูลที่อาจซ้ำกันอย่างมีประสิทธิภาพ คำสั่งนี้ช่วยให้เราสามารถกำหนดพฤติกรรมที่ชัดเจนเมื่อเกิดความขัดแย้ง แทนที่จะปล่อยให้ระบบเกิดข้อผิดพลาด (Error) มันจะดำเนินการตามที่เรากำหนดไว้
สมมติว่าเรามีตาราง products ที่มีคอลัมน์ sku เป็น Unique Key หากเราพยายามแทรกข้อมูลที่มี sku ซ้ำกับข้อมูลเดิม เราสามารถสั่งให้ PostgreSQL ไม่เกิดข้อผิดพลาด แต่ให้ทำการอัปเดตค่าบางคอลัมน์แทนได้ทันที
SQL
-- 1. สร้างตารางตัวอย่างที่มี Unique Constraint บน sku<br>CREATE TABLE products (<code><br> sku VARCHAR(50) PRIMARY KEY,<br> name VARCHAR(100) NOT NULL,<br> price NUMERIC<br>);<br><br>-- 2. ตัวอย่างการใช้ ON CONFLICT (UPSERT)<br>INSERT INTO products (sku, name, price) VALUES ('123', 'apple', 1.00) ON CONFLICT (sku) DO UPDATE SET<br> name = EXCLUDED.name, -- EXCLUDED คือค่าที่พยายามแทรก<br> price = EXCLUDED.price;<br><br>-- หากรันครั้งที่สองด้วย sku '123' ระบบจะอัปเดต name และ price แทนการเกิด Error<br>INSERT INTO products (sku, name, price) VALUES ('123', 'apple_new', 1.50) ON CONFLICT (sku) DO UPDATE SET<br> name = EXCLUDED.name, <br> price = EXCLUDED.price;<br>
บทสรุป: การรับประกันความสมบูรณ์ของข้อมูล
การเข้าใจและใช้กลไก ON CONFLICT อย่างเชี่ยวชาญ ไม่เพียงแต่ช่วยป้องกันข้อผิดพลาดในการทำงานของระบบเท่านั้น แต่ยังเป็นเครื่องมือสำคัญที่ Senior Architect ใช้ในการออกแบบ Data Pipeline ที่มีความทนทาน (Resilient) และเชื่อถือได้ (Reliable) เสมอ การใช้ UPSERT อย่างถูกต้องจึงเป็นทักษะที่จำเป็นอย่างยิ่งในการจัดการข้อมูลในสภาพแวดล้อมที่มีการทำงานพร้อมกันสูง (High Concurrency) ใน PostgreSQL