ในโลกของการพัฒนาซอฟต์แวร์ขนาดใหญ่ การออกแบบสถาปัตยกรรมที่แข็งแกร่งและแยกส่วน (Decoupling) เป็นสิ่งสำคัญยิ่ง Clean Architecture คือแนวคิดที่ช่วยให้เราสร้างระบบที่หลักการทางธุรกิจ (Business Rules) ไม่ขึ้นอยู่กับรายละเอียดของเทคโนโลยีภายนอก ไม่ว่าจะเป็นฐานข้อมูล (Database) หรือ UI การนำแนวคิดนี้มาประยุกต์ใช้กับ PostgreSQL อย่างถูกต้อง จะช่วยให้ระบบของเรามีความยืดหยุ่นสูง ทดสอบง่าย และบำรุงรักษาได้ในระยะยาว บทความนี้จะเจาะลึกถึง 4 ชั้นวงแหวนหลัก (The 4 Layers) โดยเน้นการใช้งาน PostgreSQL เป็นแกนหลัก
→ 1. Entities (ชั้นโดเมน): หัวใจของระบบ
ชั้นนี้คือส่วนที่เก็บกฎเกณฑ์ทางธุรกิจหลักที่บริสุทธิ์ที่สุด ไม่ขึ้นอยู่กับเทคโนโลยีใดๆ ในบริบทของ PostgreSQL ชั้นนี้จะถูกกำหนดด้วยโครงสร้างข้อมูล (Schema) และข้อจำกัด (Constraints) ที่สำคัญที่สุดของข้อมูล เช่น การกำหนด Primary Key, Foreign Key, และการใช้ Check Constraints เพื่อรับประกันความสมบูรณ์ของข้อมูล
SQL
-- ตัวอย่างการกำหนดโครงสร้างโดเมนหลัก (Entities) ใน PostgreSQL<br>CREATE TABLE products (\n product_id SERIAL PRIMARY KEY, \n name VARCHAR(100) NOT NULL, \n price NUMERIC(10, 2) NOT NULL, \n stock_quantity INT CHECK (stock_quantity >= 0) \n);
→ 2. Use Cases (ชั้นกรณีการใช้งาน): การจัดการ Transaction
Use Cases คือชั้นที่ทำหน้าที่ประสานงาน (Orchestration) การทำงานทางธุรกิจที่ซับซ้อน โดยมันจะเรียกใช้ Entity และจัดการกับ Transaction ต่างๆ ใน PostgreSQL เราจะใช้ Stored Procedures หรือ Functions เพื่อรวมขั้นตอนการทำงานหลายอย่างเข้าด้วยกัน เช่น การสั่งซื้อสินค้า ซึ่งต้องลดสต็อกและบันทึกรายการสั่งซื้อพร้อมกัน
SQL
-- ตัวอย่าง Use Case: การลดสต็อกสินค้า (Transaction)<br>CREATE OR REPLACE FUNCTION process_order(p_product_id INT, p_quantity INT) RETURNS BOOLEAN AS $$<br>BEGIN<br> -- ตรวจสอบว่ามีสินค้าเพียงพอหรือไม่<br> IF (SELECT stock_quantity FROM products WHERE product_id = p_product_id) < p_quantity THEN<br> RAISE EXCEPTION 'Insufficient stock.';<br> END IF;<br> -- อัปเดตสต็อก<br> UPDATE products SET stock_quantity = stock_quantity - p_quantity WHERE product_id = p_product_id;<br> RETURN TRUE;<br>END; $$ LANGUAGE plpgsql;
→ 3. Interface Adapters (ชั้นอะแดปเตอร์อินเทอร์เฟส): การแปลงข้อมูล
ชั้นนี้ทำหน้าที่แปลงข้อมูลจากรูปแบบที่ Use Case ต้องการ ให้เป็นรูปแบบที่ Database หรือ API ต้องการ และในทางกลับกัน มันทำหน้าที่เป็นตัวเชื่อมต่อระหว่างชั้น Use Case กับชั้น Persistence โดยมักจะอยู่ในรูปแบบของฟังก์ชันที่รับ Input ที่เฉพาะเจาะจง
SQL
-- ตัวอย่าง Interface Adapter: การรับรายการ ID และแปลงเป็นข้อมูลที่ใช้ได้<br>CREATE FUNCTION get_product_details(p_ids TEXT) RETURNS TABLE (id INT, name VARCHAR) AS $$<br>BEGIN<br> RETURN QUERY SELECT p.product_id, p.name FROM products p WHERE p.product_id = ANY(string_to_array(p_ids, ','));<br>END; $$ LANGUAGE plpgsql;
→ 4. Framework & Database (ชั้นฐานข้อมูล): Persistence Layer
ชั้นนี้คือตัวเก็บข้อมูลจริง (Physical Storage) ซึ่งในกรณีนี้คือ Schema และ Tables ของ PostgreSQL โดยตรง การออกแบบชั้นนี้ต้องเคารพโครงสร้างของ Entities อย่างเคร่งครัด การใช้ Schema แยกต่างหาก (เช่น `inventory_schema`) จะช่วยให้การแยกส่วนชัดเจนยิ่งขึ้น
SQL
-- ตัวอย่างการสร้าง Schema และตาราง (Persistence Layer)<br>CREATE SCHEMA IF NOT EXISTS inventory_schema;<br>SET search_path TO inventory_schema;<br>CREATE TABLE orders (\n order_id SERIAL PRIMARY KEY, \n product_id INT REFERENCES products(product_id), \n quantity INT \n);
บทสรุป
การประยุกต์ใช้ Clean Architecture 4 ชั้นวงแหวนกับ PostgreSQL ทำให้เราได้ระบบที่มีความยืดหยุ่นสูง โดยที่กฎทางธุรกิจ (Entities และ Use Cases) จะถูกแยกออกจากรายละเอียดของ SQL และ Schema (Database) อย่างชัดเจน การออกแบบเช่นนี้ไม่เพียงแต่ทำให้โค้ดสะอาดขึ้น แต่ยังช่วยให้ทีมสามารถเปลี่ยนเทคโนโลยีฐานข้อมูลหรือภาษาโปรแกรมได้โดยกระทบกับแกนหลักของธุรกิจน้อยที่สุด