PlusMagi's Blog By Pitt Phunsanit Database ย้ายไฟล์ลง folder ตามวันที่

ย้ายไฟล์ลง folder ตามวันที่

ในฐานะ System Specialist และ Senior Architect เราทราบดีว่าการบริหารจัดการไฟล์สำรอง (Backup) ที่เพิ่มขึ้นทุกวันอย่างต่อเนื่องนั้น เป็นปัญหาคลาสสิกที่ทำให้ระบบจัดเก็บข้อมูลเกิดความยุ่งเหยิง (Clutter) เมื่อเวลาผ่านไป หากเรามีไฟล์ Backup จำนวนมากที่ถูกเก็บไว้ในโฟลเดอร์ระดับเดียว (Flat Directory) การค้นหาหรือการลบข้อมูลเก่าๆ จะกลายเป็นภารกิจที่ซับซ้อนและเสี่ยงต่อการลบผิดพลาด

แนวทางแก้ไขที่ดีที่สุดในเชิงสถาปัตยกรรมคือการจัดโครงสร้างไฟล์ให้เป็นลำดับชั้นตามวันที่ (Year/Month/Day) เพื่อให้ง่ายต่อการจัดการ การค้นหา และการทำ Retention Policy อย่างมีประสิทธิภาพ บทความนี้จะนำเสนอวิธีการคิดเชิงสถาปัตยกรรมและใช้พลังของ PostgreSQL ในการวางแผนและจำลองกระบวนการจัดระเบียบข้อมูลเหล่านี้

💡 หลักการออกแบบระบบ Backup แบบ Date-Structured

แทนที่จะเก็บไฟล์ทั้งหมดไว้ในที่เดียว (เช่น backup/) เราควรเปลี่ยนไปใช้โครงสร้างแบบลำดับชั้น: backup/YYYY/MM/DD/ การเปลี่ยนแปลงนี้ไม่ได้เป็นเพียงแค่เรื่องของการจัดระเบียบทางกายภาพเท่านั้น แต่ยังช่วยให้เราสามารถเขียน Logic ในการจัดการข้อมูลย้อนหลังได้ง่ายขึ้นด้วยฟังก์ชันของฐานข้อมูล

ในมุมมองของ PostgreSQL ซึ่งเป็นระบบจัดการฐานข้อมูล (DBMS) เราจะไม่ทำการ ‘ย้ายไฟล์’ จริงๆ ในระดับ OS แต่เราจะใช้ความสามารถของ SQL ในการ ‘ระบุ’ (Identify) และ ‘จัดกลุ่ม’ (Group) ข้อมูลตามวันที่ที่ต้องการ เพื่อให้ทราบว่าข้อมูลชุดนี้ควรถูกจัดเก็บในโฟลเดอร์ใด

🚀 PostgreSQL: การจำลองการจัดโครงสร้างไฟล์ด้วย SQL

เราสามารถใช้ฟังก์ชันขั้นสูงของ PostgreSQL เช่น generate_series, TO_CHAR(), และ Common Table Expressions (CTE) เพื่อจำลองการค้นหาและสร้างพาธของโฟลเดอร์เป้าหมาย (Target Folder Path) จากข้อมูลที่มีอยู่

สมมติว่าเรามีตารางชื่อ backup_files ที่มีคอลัมน์ file_id, file_name และ backup_timestamp ที่บันทึกเวลาที่ทำการสำรองข้อมูลไว้

SQL

-- 1. สร้าง CTE เพื่อจำลองการสร้างพาธโฟลเดอร์ตามวันที่ (YYYY/MM/DD) สำหรับข้อมูลที่ต้องการจัดกลุ่ม<br>WITH target_paths AS ( <br>    SELECT DISTINCT <br>        TO_CHAR(backup_timestamp, 'YYYY') || '/' || <br>        TO_CHAR(backup_timestamp, 'MM') || '/' || <br>        TO_CHAR(backup_timestamp, 'DD') AS target_folder_path <br>    FROM <br>        backup_files <br>    WHERE <br>        backup_timestamp >= CURRENT_DATE - interval '30 days' <br>)<br><br>-- 2. ใช้ CTE นี้เพื่อดึงข้อมูลและระบุพาธที่ถูกต้อง<br>SELECT <br>    t.file_id, <br>    t.file_name, <br>    tp.target_folder_path AS target_path <br>FROM <br>    backup_files t <br>JOIN <br>    target_paths tp ON <br>        TO_CHAR(t.backup_timestamp, 'YYYY') || '/' || <br>        TO_CHAR(t.backup_timestamp, 'MM') || '/' || <br>        TO_CHAR(t.backup_timestamp, 'DD') = tp.target_folder_path;

คำอธิบายโค้ด:

  • target_paths: CTE นี้จะรวบรวมพาธโฟลเดอร์ที่เป็นไปได้ทั้งหมด (เช่น 2023/10/25) จากข้อมูลที่มีอยู่
  • TO_CHAR(timestamp, 'format'): ฟังก์ชันนี้มีความสำคัญมาก เพราะมันแปลงค่า Timestamp ให้เป็น String ตามรูปแบบที่เรากำหนด (YYYY/MM/DD) ซึ่งใช้เป็นตัวระบุโฟลเดอร์
  • JOIN: เราใช้การ Join ระหว่างตารางหลักกับ CTE เพื่อให้ทุกไฟล์ถูกจับคู่กับพาธโฟลเดอร์ที่ถูกต้องตามวันที่ของมัน

✅ บทสรุปเชิงสถาปัตยกรรม

การจัดโครงสร้างข้อมูลตามวันที่ด้วย PostgreSQL ไม่ได้หมายถึงการใช้คำสั่ง MOVE แต่หมายถึงการสร้าง ‘Metadata Layer’ ที่แข็งแกร่ง ซึ่งช่วยให้แอปพลิเคชันหรือระบบภายนอก (เช่น Script ภาษา Python ที่เชื่อมต่อกับ DB) สามารถทราบได้อย่างแม่นยำว่าไฟล์ใดควรถูกจัดเก็บหรือถูกอ้างอิงในโฟลเดอร์ใด การใช้โครงสร้าง YYYY/MM/DD ทำให้การเขียน Logic สำหรับการทำ Retention Policy (เช่น การลบข้อมูลที่เก่ากว่า 90 วัน) มีประสิทธิภาพสูงขึ้นมาก เพราะสามารถ Query ได้ด้วยเงื่อนไขวันที่โดยตรงและรวดเร็ว