ป้ายกำกับ: Cte

สมควร ?สมควร ?

ในฐานะสถาปนิกระบบ (System Architect) การรักษาความสมบูรณ์และความถูกต้องของข้อมูล (Data Integrity) คือหัวใจสำคัญที่สุดของการออกแบบฐานข้อมูลใดๆ คำถามที่ว่า ‘ข้อมูลนี้สมควรที่จะถูกบันทึกหรือไม่?’ หรือ ‘การดำเนินการนี้มีเงื่อนไขครบถ้วนหรือไม่?’ ไม่ใช่แค่คำถามเชิงตรรกะ แต่เป็นรากฐานทางสถาปัตยกรรมที่ต้องถูกบังคับใช้ในระดับของระบบฐานข้อมูล

สำหรับ PostgreSQL ซึ่งเป็นระบบจัดการฐานข้อมูลเชิงสัมพันธ์ (Relational Database Management System – RDBMS) ที่ทรงพลัง เรามีเครื่องมือระดับสูงหลายอย่างที่ช่วยให้เราสามารถกำหนด ‘กฎเกณฑ์’ เหล่านี้ได้อย่างเข้มงวด บทความนี้จะเจาะลึกถึงวิธีการใช้คุณสมบัติของ PostgreSQL เพื่อตรวจสอบและบังคับใช้เงื่อนไขข้อมูลที่ถูกต้องตามหลักการทางวิศวกรรมซอฟต์แวร์

→ การบังคับใช้กฎเกณฑ์ด้วย Constraints (ระดับโครงสร้าง)

วิธีพื้นฐานที่สุดในการตอบคำถามว่า ‘สมควรหรือไม่’ คือการใช้ Constraints ซึ่งเป็นการกำหนดข้อจำกัดในระดับตาราง (Table Level) หรือคอลัมน์ (Column Level) เพื่อป้องกันข้อมูลที่ผิดพลาดตั้งแต่ต้นทาง

→ 1. CHECK Constraint: ตรวจสอบเงื่อนไขเฉพาะ

หากคุณต้องการให้ค่าในคอลัมน์ใดๆ ต้องอยู่ในช่วงที่กำหนด หรือต้องเป็นไปตามสูตรทางธุรกิจบางอย่าง คุณควรใช้ `CHECK` constraint ตัวอย่างเช่น เราต้องการให้คะแนนสินค้า (score) ต้องมีค่ามากกว่าหรือเท่ากับ 0 เสมอ

SQL

CREATE TABLE products ( product_id INT PRIMARY KEY, name VARCHAR(100), score NUMERIC CHECK (score >= 0));

หากพยายามแทรกค่า `score` ที่เป็นลบ ระบบ PostgreSQL จะปฏิเสธการดำเนินการทันที ทำให้มั่นใจได้ว่าข้อมูลที่ถูกบันทึกนั้น ‘สมควร’ ตามกฎเกณฑ์ที่กำหนดไว้

→ 2. FOREIGN KEY Constraint: รักษาความสัมพันธ์ (Referential Integrity)

นี่คือการตรวจสอบความสัมพันธ์ระหว่างตาราง หากเรามีตาราง `orders` และต้องอ้างอิงถึง `customers` เราต้องมั่นใจว่า Customer ID ที่ระบุใน `orders` นั้นมีอยู่จริงในตาราง `customers` เสมอ

SQL

CREATE TABLE customers ( customer_id INT PRIMARY KEY, name VARCHAR(100)); CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT REFERENCES customers(customer_id));

การใช้ `FOREIGN KEY` ทำให้มั่นใจว่าทุกคำสั่งที่เกี่ยวข้องกับการสร้างหรือลบข้อมูล จะต้องผ่านการตรวจสอบความสัมพันธ์ก่อนเสมอ

→ การตรวจสอบเงื่อนไขที่ซับซ้อนด้วย CTE และ CASE (ระดับตรรกะ)

ในบางครั้ง เงื่อนไข ‘สมควร’ ไม่ใช่แค่เรื่องของค่าข้อมูล แต่เป็นเรื่องของสถานะหรือการเปรียบเทียบข้อมูลหลายชุดพร้อมกัน ในกรณีนี้ เราสามารถใช้ Common Table Expressions (CTEs) ร่วมกับคำสั่ง `CASE` เพื่อสร้างตรรกะการตรวจสอบที่ซับซ้อน

สมมติว่าเราต้องการทราบว่าพนักงานคนใด ‘สมควร’ ได้รับโบนัสหรือไม่ โดยมีเงื่อนไขว่าต้องทำงานครบ 1 ปี และยอดขายรวมต้องเกิน 500,000 บาท:

SQL

WITH EmployeeSales AS ( SELECT employee_id, SUM(sale_amount) AS total_sales FROM sales WHERE sale_date >= CURRENT_DATE - INTERVAL '1 year' GROUP BY employee_id) SELECT e.employee_name, es.total_sales, CASE WHEN es.total_sales > 500000 AND e.hire_date <= CURRENT_DATE - INTERVAL '1 year' THEN 'Eligible for Bonus' ELSE 'Not Eligible' END AS bonus_status FROM employees e JOIN EmployeeSales es ON e.employee_id = es.employee_id;

ในตัวอย่างนี้ CTE ช่วยรวมข้อมูลยอดขายทั้งหมดในช่วง 1 ปี และคำสั่ง `CASE` จะทำหน้าที่เป็น Logic Gate ที่ตรวจสอบเงื่อนไขทางธุรกิจที่ซับซ้อน เพื่อตัดสินว่าสถานะของพนักงาน ‘สมควร’ ได้รับโบนัสหรือไม่

→ สรุป: การออกแบบที่มั่นคงด้วย PostgreSQL

การใช้ PostgreSQL ในการจัดการข้อมูลไม่ได้หมายถึงแค่การบันทึกข้อมูลเท่านั้น แต่คือการสร้างระบบที่มีความน่าเชื่อถือสูง (High Reliability) การผสมผสานระหว่าง `CHECK` constraints สำหรับการตรวจสอบระดับค่า, `FOREIGN KEY` สำหรับการรักษาความสัมพันธ์, และ CTE/`CASE` statements สำหรับตรรกะทางธุรกิจที่ซับซ้อน ทำให้เราสามารถตอบคำถามว่า ‘ข้อมูลนี้สมควรหรือไม่’ ได้อย่างแม่นยำและเป็นระบบ

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