ป้ายกำกับ: รียลไทม์

MSSQL: compare structure description in databasesMSSQL: compare structure description in databases

ในฐานะ Senior Architect และ Technical SEO Specialist เราทราบดีว่าการรักษาความสอดคล้องของโครงสร้างข้อมูล (Schema Consistency) ระหว่างสภาพแวดล้อมต่างๆ เช่น Development (Dev) และ Quality Assurance (QA) เป็นสิ่งสำคัญอย่างยิ่งในการพัฒนาซอฟต์แวร์ การเปลี่ยนแปลงแม้เพียงเล็กน้อยในคำอธิบายคอลัมน์ (Column Description) หรือชนิดข้อมูล (Data Type) อาจนำไปสู่ข้อผิดพลาดร้ายแรงได้

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

🔍 หลักการเปรียบเทียบ Schema ด้วย PostgreSQL

การเปรียบเทียบโครงสร้างระหว่างฐานข้อมูลใน PostgreSQL สามารถทำได้โดยการใช้ Common Table Expressions (CTEs) ร่วมกับมุมมองระบบ (System Views) เช่น information_schema ซึ่งเป็นแหล่งข้อมูลมาตรฐานที่เก็บรายละเอียดเกี่ยวกับโครงสร้างของวัตถุทั้งหมดในฐานข้อมูล การใช้ CTEs ช่วยให้เราสามารถดึงข้อมูลจากแหล่งที่มาที่แตกต่างกัน (เช่น DB_DEV และ DB_QA) มาเปรียบเทียบกันในชุดคำสั่งเดียว

หลักการทำงานคือการดึงข้อมูลคอลัมน์ (Column Name, Data Type) และคำอธิบาย (Description) ของตารางที่สนใจจากทั้งสองฐานข้อมูล จากนั้นใช้ FULL OUTER JOIN เพื่อระบุว่าคอลัมน์ใดที่มีอยู่เฉพาะในฐานข้อมูลใดฐานข้อมูลหนึ่ง หรือคอลัมน์ที่มีอยู่เหมือนกันแต่มีค่า Description หรือ Data Type ที่แตกต่างกัน

🛠️ ตัวอย่างโค้ด: การเปรียบเทียบโครงสร้างและ Description

โค้ดตัวอย่างนี้สาธิตการเปรียบเทียบโครงสร้างคอลัมน์ระหว่างสอง Schema (สมมติว่าเป็น dev_schema และ qa_schema) เพื่อค้นหาความแตกต่างของชื่อคอลัมน์, ชนิดข้อมูล, และคำอธิบายที่ถูกบันทึกไว้ในระบบ:

SQL

-- กำหนดชื่อ Schema ที่ต้องการเปรียบเทียบ (แทนการใช้ Database Name) <code>

WITH DevSchema AS (
    SELECT
        table_name, 
        column_name, 
        data_type, 
        -- ใน PostgreSQL, Description มักจะถูกเก็บใน pg_description หรือต้องใช้ฟังก์ชันที่ซับซ้อนกว่า 
        -- แต่เราจะจำลองการดึงค่า Description มาเพื่อการเปรียบเทียบ
        (SELECT description FROM pg_description WHERE objoid = c.attrelid AND attnum = c.attnum) AS Description
    FROM information_schema.columns c
    WHERE c.table_schema = 'dev_schema'
),

QASchema AS (
    SELECT
        table_name, 
        column_name, 
        data_type, 
        (SELECT description FROM pg_description WHERE objoid = c.attrelid AND attnum = c.attnum) AS Description
    FROM information_schema.columns c
    WHERE c.table_schema = 'qa_schema'
)

-- ใช้ FULL OUTER JOIN เพื่อหาความแตกต่างของโครงสร้าง
SELECT
    COALESCE(d.table_name, q.table_name) AS TableName,
    COALESCE(d.column_name, q.column_name) AS ColumnName,
    d.data_type AS Dev_DataType,
    q.data_type AS QA_DataType,
    CASE
        WHEN d.Description IS NULL AND q.Description IS NOT NULL THEN 'Missing Description in Dev'
        WHEN d.Description IS NOT NULL AND q.Description IS NULL THEN 'Missing Description in QA'
        WHEN d.Description <> q.Description THEN 'DESCRIPTION MISMATCH'
        ELSE 'MATCH'
    END AS Description_Status
FROM DevSchema d
FULL OUTER JOIN QASchema q
ON d.table_name = q.table_name
AND d.column_name = q.column_name
WHERE d.data_type <> q.data_type
OR d.Description IS DISTINCT FROM q.Description;

💡 การวิเคราะห์ผลลัพธ์และการนำไปใช้

ผลลัพธ์ที่ได้จากการใช้ FULL OUTER JOIN นี้จะแสดงรายการคอลัมน์ทั้งหมดที่มีความแตกต่างกัน ไม่ว่าจะเป็นการเปลี่ยนแปลงของชนิดข้อมูล (Data Type Mismatch) หรือการเปลี่ยนแปลงของคำอธิบาย (Description Mismatch) ซึ่งช่วยให้ทีมพัฒนาสามารถตรวจสอบและแก้ไขความไม่สอดคล้องกันของ Schema ได้อย่างรวดเร็วและแม่นยำก่อนการ Deploy จริง

✅ บทสรุป

การเปรียบเทียบโครงสร้างและคำอธิบายของฐานข้อมูลเป็นกระบวนการที่จำเป็นอย่างยิ่งในการรักษาคุณภาพข้อมูล (Data Quality) การใช้ PostgreSQL ร่วมกับ CTEs และ information_schema ทำให้เราสามารถสร้างเครื่องมือตรวจสอบความแตกต่าง (Schema Drift Detector) ที่มีประสิทธิภาพสูง ทำให้มั่นใจได้ว่าโค้ดที่รันบนสภาพแวดล้อมใดๆ จะทำงานกับโครงสร้างข้อมูลที่คาดหวังไว้เสมอ