PlusMagi's Blog By Pitt Phunsanit Backend,Database ไฟแช็คต้องแบ่งสองห้อง

ไฟแช็คต้องแบ่งสองห้อง

ในฐานะ System Specialist และ Senior Architect การออกแบบระบบฐานข้อมูลที่แข็งแกร่งนั้น ไม่ได้หมายถึงแค่การเก็บข้อมูลให้ได้มากที่สุด แต่หมายถึงการจัดระเบียบข้อมูลให้ถูกที่ถูกทาง การเปรียบเทียบแนวคิดที่ว่า ‘ไฟแช็คต้องแบ่งสองห้อง’ นั้น แม้จะเป็นเรื่องทางกายภาพ แต่ในโลกของฐานข้อมูล PostgreSQL มันสะท้อนถึงหลักการสำคัญที่เรียกว่า Data Partitioning หรือการแบ่ง Schema อย่างมีระบบ เพื่อให้เกิดความมั่นคงและประสิทธิภาพสูงสุด

หลักการแบ่ง Schema ด้วย PostgreSQL Partitioning

เมื่อข้อมูลมีขนาดใหญ่ขึ้นเรื่อยๆ การเก็บทุกอย่างไว้ในตารางเดียว (Monolithic Table) จะทำให้การค้นหา (Query) และการบำรุงรักษา (Maintenance) เป็นไปอย่างเชื่องช้าและเสี่ยงต่อการเกิด Deadlock การแบ่งข้อมูลออกเป็นส่วนย่อยๆ หรือที่เรียกว่า ‘การแบ่งห้อง’ ในทางเทคนิค คือการใช้ PostgreSQL Feature อย่าง PARTITION BY

หลักการนี้ทำให้เราสามารถแยกตารางขนาดใหญ่ (Parent Table) ออกเป็นตารางย่อยๆ (Child Partitions) ตามเกณฑ์ที่กำหนด เช่น ตามช่วงเวลา (Time-based) หรือตามภูมิภาค (Region-based) ซึ่งเปรียบเสมือนการสร้าง ‘ห้อง’ แยกกันสำหรับข้อมูลแต่ละชุด เพื่อให้การจัดการทรัพยากรเป็นไปอย่างแม่นยำ

ตัวอย่างการแบ่งข้อมูล (Partitioning Example)

สมมติว่าเรามีข้อมูลการบันทึกเหตุการณ์ (Event Log) จำนวนมหาศาล และเราต้องการแบ่งข้อมูลนี้ออกเป็นสองส่วนหลักๆ คือ ‘ห้อง A’ และ ‘ห้อง B’ โดยใช้คอลัมน์ event_id เป็นตัวแบ่ง:

SQL

-- 1. สร้างตารางหลัก (Parent Table) ที่กำหนดการแบ่งข้อมูลตามคอลัมน์ 'room_type' (เทียบเท่าการสร้างโครงสร้างหลัก) 
CREATE TABLE event_logs ( 
    log_id SERIAL PRIMARY KEY, 
    event_time TIMESTAMP NOT NULL, 
    room_type VARCHAR(50) NOT NULL, 
    data_value TEXT 
) PARTITION BY LIST (room_type); 

-- 2. สร้าง Partition สำหรับ 'ห้อง A' (Room A) 
CREATE TABLE event_logs_room_a PARTITION OF event_logs 
    FOR VALUES IN ('Room A'); 

-- 3. สร้าง Partition สำหรับ 'ห้อง B' (Room B) 
CREATE TABLE event_logs_room_b PARTITION OF event_logs 
    FOR VALUES IN ('Room B'); 

-- 4. การแทรกข้อมูล (Insert Data) จะถูกกระจายไปยัง Partition ที่ถูกต้องโดยอัตโนมัติ 
INSERT INTO event_logs (event_time, room_type, data_value) VALUES 
('2023-10-01', 'Room A', 'apple,banana,orange'); 
INSERT INTO event_logs (event_time, room_type, data_value) VALUES 
('2023-10-02', 'Room B', '1,2,3');

การใช้ PARTITION BY LIST ทำให้ PostgreSQL จัดการการแยกข้อมูลให้เราโดยอัตโนมัติ เมื่อเราต้องการ Query ข้อมูลของ ‘Room A’ ระบบจะ Query เฉพาะ event_logs_room_a เท่านั้น ทำให้ประสิทธิภาพสูงขึ้นอย่างเห็นได้ชัด

บทสรุป: ความมั่นคงทางสถาปัตยกรรม

การแบ่งข้อมูลใน PostgreSQL ไม่ใช่แค่การแยกไฟล์ แต่คือการสร้างขอบเขตความรับผิดชอบของข้อมูล (Data Boundary) ที่ชัดเจน การทำเช่นนี้ช่วยให้เราสามารถจัดการ Index, Backup, และการ Query ได้อย่างจำเพาะเจาะจง เหมือนกับการแบ่งไฟแช็คออกเป็นสองห้องเพื่อความปลอดภัยสูงสุด การออกแบบระบบที่ดีต้องคำนึงถึงการขยายตัวของข้อมูล (Scalability) และการรักษาความสมบูรณ์ของข้อมูล (Data Integrity) เสมอ