PlusMagi's Blog By Pitt Phunsanit Database SQL Server: เปลี่ยนชื่อตาม naming convention

SQL Server: เปลี่ยนชื่อตาม naming convention

ในฐานะ System Specialist และ Senior Architect การออกแบบฐานข้อมูลที่ดีไม่ได้วัดแค่ที่ความเร็วในการ Query เท่านั้น แต่ยังรวมถึงความสามารถในการบำรุงรักษา (Maintainability) ด้วย ฐานข้อมูลที่มีขนาดใหญ่และมีการพัฒนาอย่างต่อเนื่อง มักจะประสบปัญหาเรื่องความไม่สม่ำเสมอในการตั้งชื่อ Object ต่างๆ เช่น Index, Constraint, หรือ View ซึ่งทำให้การทำความเข้าใจ โค้ดดิ้ง และการแก้ไขปัญหาในอนาคตเป็นไปได้ยาก

การกำหนด Naming Convention ที่ชัดเจนสำหรับ Object ต่างๆ ใน PostgreSQL จึงเป็นสิ่งสำคัญอย่างยิ่ง บทความนี้จะนำเสนอแนวทางและโครงสร้างโค้ดเพื่อช่วยให้คุณสามารถค้นหาและปรับปรุงชื่อ Object เหล่านี้ให้เป็นระเบียบตามมาตรฐานองค์กรได้อย่างเป็นระบบ

💡 ทำไมต้องกำหนด Naming Convention ใน PostgreSQL?

เมื่อ Object ต่างๆ ในฐานข้อมูลขาดรูปแบบการตั้งชื่อที่เป็นมาตรฐาน (เช่น การขึ้นต้นด้วย Prefix ที่บ่งบอกประเภท Object) จะทำให้เกิดความสับสนอย่างมากเมื่อต้องตรวจสอบ Schema ด้วยเครื่องมืออย่าง pgAdmin หรือเมื่อต้องเขียนสคริปต์เพื่อจัดการ Object เหล่านั้น

  • ความสม่ำเสมอ (Consistency): ช่วยให้ผู้พัฒนาทุกคนเข้าใจได้ทันทีว่า Object นั้นคืออะไร (เช่น `idx_` สำหรับ Index, `fk_` สำหรับ Foreign Key)
  • การค้นหา (Searchability): ทำให้การค้นหา Object ที่ต้องการทำความสะอาดหรือแก้ไขทำได้ง่ายและรวดเร็ว
  • การบำรุงรักษา (Maintainability): ลดเวลาในการ Debugging และลดความเสี่ยงในการลบหรือแก้ไข Object ผิดตัว

🛠️ แนวทางการค้นหาและปรับปรุงชื่อ Object ด้วย PostgreSQL

ใน PostgreSQL เราสามารถใช้ System Catalogs เช่น information_schema หรือ pg_catalog ในการดึงข้อมูล Object ทั้งหมดออกมา จากนั้นจึงใช้คำสั่ง DO $$ ... END $$ หรือฟังก์ชันเฉพาะในการตรวจสอบและรันคำสั่ง ALTER TABLE หรือ ALTER INDEX เพื่อเปลี่ยนชื่อ

ตัวอย่างนี้แสดงการค้นหา Constraints และ Indexes ที่ไม่มี Prefix ตามมาตรฐาน (สมมติว่าเราต้องการให้ Index ขึ้นต้นด้วย idx_ เสมอ):

SQL

-- 1. กำหนดตัวแปรสำหรับ Filter ชื่อ Schema และ Prefix ที่ต้องการใช้ (Best Practice) 
-- ในการใช้งานจริง ควรใช้ PL/pgSQL Function เพื่อควบคุม Transaction

DO $$ 
DECLARE
    r record;
BEGIN
    -- ส่วนที่ 1: ตรวจสอบและเปลี่ยนชื่อ Indexes (Indexes)
    FOR r IN 
        SELECT 
            c.relname AS table_name,
            i.relname AS old_index_name
        FROM 
            pg_class c 
        JOIN 
            pg_index i ON i.indrelid = c.oid
        WHERE 
            c.relkind = 'r' -- 'r' = regular table
            AND i.indisprimary = FALSE -- ไม่ต้องเปลี่ยน Primary Key
            AND i.relname NOT LIKE 'idx_%' -- กรองเฉพาะ Index ที่ชื่อผิด
    LOOP
        -- คำสั่ง ALTER INDEX เพื่อเปลี่ยนชื่อ
        EXECUTE format('ALTER INDEX %I RENAME TO idx_%s_%s;', r.table_name, r.table_name, r.old_index_name);
        RAISE NOTICE 'Renamed Index: %', r.old_index_name; 
    END LOOP;

    -- ส่วนที่ 2: ตรวจสอบและเปลี่ยนชื่อ Constraints (Foreign Keys)
    -- (โค้ดส่วนนี้จะซับซ้อนกว่าและต้องใช้ pg_constraint ในการ Query)
    -- ... (เพิ่ม logic สำหรับ FK, PK, UQ) 
    
END $$;

⚠️ ข้อควรระวังระดับ Senior Architect

การรันสคริปต์เปลี่ยนชื่อ Object ทั้งหมดในฐานข้อมูล Production เป็นการกระทำที่มีความเสี่ยงสูงมาก ควรดำเนินการตามขั้นตอนเหล่านี้เสมอ:

  1. Backup: ทำการ Backup ฐานข้อมูลทั้งหมดก่อนเสมอ
  2. Test Environment: ทดสอบสคริปต์นี้ใน Staging Environment ที่จำลองข้อมูลจริง
  3. Transaction Control: ห่อหุ้มโค้ดทั้งหมดด้วย Transaction Block และตรวจสอบผลลัพธ์อย่างละเอียดก่อน Commit

✅ บทสรุป: การจัดการ Object Naming คือการลงทุนระยะยาว

การกำหนด Naming Convention ไม่ใช่แค่การทำความสะอาดโค้ดชั่วคราว แต่คือการสร้างมาตรฐานทางสถาปัตยกรรมให้กับฐานข้อมูลของคุณ เมื่อทีมงานทุกคนยึดถือรูปแบบเดียวกัน การทำงานร่วมกันจะราบรื่นขึ้นอย่างมาก ทำให้ฐานข้อมูล PostgreSQL ของคุณไม่เพียงแต่มีประสิทธิภาพ แต่ยังมีความเป็นระเบียบและง่ายต่อการดูแลรักษาในระยะยาว