ในโลกของการพัฒนาแอปพลิเคชันแบบ Desktop, การจัดการหน้าจอที่ซับซ้อนและมีหลายฟอร์มย่อยทำงานร่วมกันในหน้าต่างหลักเป็นสิ่งที่พบได้บ่อย รูปแบบการออกแบบที่เรียกว่า Multiple Document Interface (MDI) คือรูปแบบที่ช่วยให้ผู้ใช้สามารถทำงานกับเอกสารหรือฟอร์มย่อยหลายชุดพร้อมกันได้โดยไม่จำเป็นต้องสลับหน้าต่างไปมา
ในมุมมองของ System Architect, MDI เป็นเพียงส่วนของ User Interface (UI) ที่กำหนดประสบการณ์ผู้ใช้ (UX) แต่หัวใจสำคัญที่ทำให้ระบบนี้ทำงานได้อย่างเสถียรและสามารถจัดการสถานะ (State) ของเอกสารย่อยแต่ละชุดได้อย่างอิสระ คือระบบจัดการข้อมูล (Data Layer) ที่อยู่เบื้องหลัง ซึ่งในบทความนี้เราจะมาดูกลไกการจัดการข้อมูลที่รองรับ MDI โดยใช้ความสามารถของ PostgreSQL ซึ่งเป็นฐานข้อมูลเชิงสัมพันธ์ที่ทรงพลัง
หลักการทำงานของ MDI และบทบาทของ PostgreSQL
เมื่อระบบ MDI ถูกเรียกใช้งาน ฟอร์มย่อยแต่ละฟอร์ม (Document) จะต้องมีสถานะข้อมูล (State) และรอบการทำงาน (Session) ที่เป็นอิสระต่อกัน การที่ฟอร์มย่อย A ถูกแก้ไขข้อมูล จะต้องไม่กระทบต่อข้อมูลที่กำลังเปิดอยู่ในฟอร์มย่อย B ดังนั้น ฐานข้อมูลจึงต้องถูกออกแบบมาเพื่อรองรับการแยกสถานะข้อมูลเหล่านี้อย่างชัดเจน
PostgreSQL สามารถเข้ามาช่วยในส่วนนี้ได้โดยการใช้เทคนิคการจัดการ Session ID หรือการใช้ Schema แยกสำหรับแต่ละเอกสารย่อย ทำให้เราสามารถจำลองการทำงานของ ‘เอกสารหลายชุด’ ได้อย่างมีประสิทธิภาพ ตัวอย่างเช่น หากเรามีเอกสาร 3 ชุด (Document A, B, C) ที่มีข้อมูลที่เกี่ยวข้องกับลูกค้า, สินค้า, และคำสั่งซื้อ เราสามารถใช้ PostgreSQL เพื่อจัดการข้อมูลเหล่านี้แยกกันโดยใช้ Transaction หรือ Partitioning
ตัวอย่างการจัดการข้อมูลหลายเอกสารด้วย PostgreSQL
สมมติว่าเราต้องการบันทึกข้อมูลของ 3 เอกสารย่อย (เช่น ข้อมูลลูกค้า, ข้อมูลสินค้า, และข้อมูลธุรกรรม) ในระบบ MDI เราสามารถใช้ฟังก์ชันที่จัดการข้อมูลเหล่านี้แยกกันได้:
SQL
-- 1. สร้างตารางหลักสำหรับเก็บสถานะของเอกสารย่อย (Document State) และผูกกับ Session ID
CREATE TABLE document_session_state (
session_id VARCHAR(50) PRIMARY KEY,
document_type VARCHAR(50) NOT NULL,
last_modified TIMESTAMP DEFAULT NOW()
);
-- 2. บันทึกสถานะเริ่มต้นของ 3 เอกสารย่อย (A, B, C)
INSERT INTO document_session_state (session_id, document_type) VALUES
('session_123', 'CustomerProfile'),
('session_123', 'ProductInventory'),
('session_123', 'OrderTransaction');
-- 3. อัปเดตข้อมูลเฉพาะเอกสารที่ถูกแก้ไข (เช่น ProductInventory) โดยใช้ข้อมูลที่แยกกัน
UPDATE document_session_state
SET last_modified = NOW()
WHERE session_id = 'session_123' AND document_type = 'ProductInventory';
-- 4. ดึงข้อมูลที่เกี่ยวข้องกับเอกสารย่อยที่กำลังเปิดอยู่ทั้งหมด
SELECT
session_id,
document_type,
last_modified
FROM document_session_state
WHERE session_id = 'session_123';
จากโค้ดข้างต้น เราเห็นว่า PostgreSQL ทำหน้าที่เป็น Single Source of Truth ที่สามารถติดตามสถานะของ ‘หลายเอกสาร’ ภายใต้ Session เดียวกันได้อย่างแม่นยำ ทำให้แอปพลิเคชัน MDI ที่สร้างด้วย C# สามารถแสดงผลข้อมูลที่ถูกต้องและเป็นปัจจุบันสำหรับทุกฟอร์มย่อยได้
บทสรุป
การสร้างระบบ MDI ที่สมบูรณ์แบบต้องอาศัยการทำงานร่วมกันระหว่าง Frontend (C# GUI) และ Backend (PostgreSQL Data Layer) ในฐานะ Senior Architect เราต้องเข้าใจว่า MDI เป็นเพียงภาพลักษณ์ภายนอก แต่ความสำเร็จของระบบขึ้นอยู่กับความสามารถของฐานข้อมูลในการจัดการสถานะข้อมูล (State Management) ที่ซับซ้อนและเป็นอิสระ การใช้ PostgreSQL ในการจัดการ Session และ Document State อย่างเป็นระบบ จึงเป็นกุญแจสำคัญที่ทำให้แอปพลิเคชันขนาดใหญ่นี้มีความเสถียรและขยายตัวได้ในอนาคต