ป้ายกำกับ: Schema Isolation

config codeigniter by environmentsconfig codeigniter by environments

ในโลกของการพัฒนาซอฟต์แวร์ระดับองค์กร (Enterprise-level) การแยกสภาพแวดล้อม (Environment) เช่น Development, Testing, และ Production ถือเป็นหลักการความปลอดภัยและเสถียรภาพที่สำคัญอย่างยิ่ง เพื่อให้แน่ใจว่าการเปลี่ยนแปลงโค้ดในสภาพแวดล้อมใดจะไม่ส่งผลกระทบต่อข้อมูลจริงใน Production

แม้ว่า CodeIgniter จะมีกลไกในการจัดการ Environment ผ่านไฟล์ PHP แต่ในมุมมองของ Senior Architect และการออกแบบระบบที่ยั่งยืน ข้อมูลการตั้งค่า (Configuration) ที่สำคัญที่สุดควรถูกจัดการและแยกออกจากกันในระดับฐานข้อมูล (Database Level) โดยเฉพาะอย่างยิ่งเมื่อใช้ PostgreSQL ซึ่งมีความสามารถในการจัดการ Schema และ Role ที่ยอดเยี่ยม

⚙️ หลักการแยก Config Environment ใน PostgreSQL

แทนที่จะพึ่งพาการเปลี่ยนตัวแปรในไฟล์ `index.php` เพียงอย่างเดียว การออกแบบระดับสถาปัตยกรรมที่ถูกต้องคือการใช้หลักการ Isolation โดยใช้คุณสมบัติของ PostgreSQL เช่น Schemas และ Roles เพื่อแยกข้อมูลการตั้งค่าออกจากกันอย่างชัดเจน

1. การใช้ Schemas เพื่อแยก Config

แนวทางที่แนะนำที่สุดคือการสร้าง Schema แยกสำหรับแต่ละ Environment (เช่น `dev_schema`, `test_schema`, `prod_schema`) เพื่อเก็บตาราง Config หลัก แทนที่จะใช้ตาราง Config เดียวกัน

SQL

-- 1. สร้าง Schema สำหรับแต่ละ Environment<br>CREATE SCHEMA dev_schema;<br>CREATE SCHEMA test_schema;<br>CREATE SCHEMA prod_schema;

เมื่อแอปพลิเคชันเชื่อมต่อกับฐานข้อมูล จะต้องระบุ Schema ที่ถูกต้องตาม Environment ที่กำลังทำงานอยู่ ซึ่งจะช่วยจำกัดขอบเขตการมองเห็นข้อมูล (Visibility) ได้อย่างมีประสิทธิภาพ

2. การจัดการ Connection และ Roles

ในระดับการเชื่อมต่อ (Connection String) ควรมีการกำหนด Role ที่แตกต่างกันสำหรับแต่ละ Environment Role เหล่านี้จะถูกจำกัดสิทธิ์ (Permissions) ให้เข้าถึงเฉพาะ Schema ของตนเองเท่านั้น

SQL

-- ตัวอย่างการกำหนด Role และสิทธิ์ (Permissions)<br>CREATE ROLE ci_dev_user WITH LOGIN PASSWORD 'dev_password';<br>GRANT CONNECT ON DATABASE your_db TO ci_dev_user;<br>GRANT USAGE ON SCHEMA dev_schema TO ci_dev_user;<br>GRANT SELECT, INSERT, UPDATE ON dev_schema.settings TO ci_dev_user;

การทำเช่นนี้ทำให้แม้ว่าโค้ดจะมีการเรียกใช้คำสั่ง Config แต่ Role ที่ถูกกำหนดให้ก็สามารถมองเห็นและแก้ไขได้เฉพาะข้อมูลใน Schema ที่ได้รับอนุญาตเท่านั้น

💡 ตัวอย่างการดึงค่า Config ตาม Environment (Conceptual)

หากคุณต้องการให้แอปพลิเคชันดึงค่า Config เช่น รายชื่อ API endpoint หรือค่าลิมิตการใช้งาน (Limit) คุณสามารถสร้างตาราง Config หลักในแต่ละ Schema และใช้ฟังก์ชันของ PostgreSQL ในการกำหนดค่าเริ่มต้น (Default Values) หรือการตรวจสอบความถูกต้องของข้อมูล

SQL

-- ตัวอย่างการสร้างตาราง Config ใน Production Schema<br>CREATE TABLE prod_schema.api_settings (id SERIAL PRIMARY KEY, key_name VARCHAR(100) UNIQUE, value TEXT);<br>INSERT INTO prod_schema.api_settings (key_name, value) VALUES ('api_endpoint', 'https://api.prod.com');

เมื่อแอปพลิเคชันทำงานใน Production (โดยที่ `search_path` ถูกตั้งค่าเป็น `prod_schema`) มันจะดึงค่าจากตารางนี้โดยอัตโนมัติ ทำให้มั่นใจได้ว่าค่าที่ใช้คือค่าที่ถูกต้องสำหรับ Production เท่านั้น

🚀 บทสรุปสำหรับ Senior Architect

การจัดการ Environment Config ในระดับสถาปัตยกรรมที่แข็งแกร่งควรย้ายจากการพึ่งพาตัวแปร PHP ไปสู่การใช้คุณสมบัติระดับฐานข้อมูลของ PostgreSQL เช่น Schemas และ Roles เพื่อให้เกิดการแยกข้อมูลอย่างสมบูรณ์ (Data Isolation) การทำเช่นนี้ไม่เพียงแต่เพิ่มความปลอดภัย แต่ยังทำให้ระบบมีความยืดหยุ่นสูง พร้อมรองรับการขยายตัวของแอปพลิเคชันในอนาคตได้อย่างไร้รอยต่อ