PlusMagi's Blog By Pitt Phunsanit Database รหัสไปรษณีย์เก็บยังไง ?

รหัสไปรษณีย์เก็บยังไง ?

ในฐานะ System Specialist และ Senior Architect การออกแบบฐานข้อมูลที่ถูกต้องเป็นหัวใจสำคัญของการจัดการข้อมูล โดยเฉพาะข้อมูลที่มีรูปแบบหลากหลายอย่างรหัสไปรษณีย์ (Zip Code) ซึ่งมีทั้งความยาวและรูปแบบตัวอักษรที่แตกต่างกันไปทั่วโลก การเลือก Data Type ที่ไม่เหมาะสมอาจนำไปสู่ปัญหาด้านความสมบูรณ์ของข้อมูล (Data Integrity) และประสิทธิภาพในการ Query ในระยะยาว

หลักการเลือก Data Type สำหรับรหัสไปรษณีย์ใน PostgreSQL

รหัสไปรษณีย์แม้จะประกอบด้วยตัวเลขเป็นหลัก แต่ในเชิงฐานข้อมูลแล้วมันคือ ‘รหัสระบุตัวตน’ (Identifier) ไม่ใช่ ‘ค่าตัวเลข’ (Numeric Value) ดังนั้น การเก็บรหัสไปรษณีย์ใน PostgreSQL จึงไม่ควรใช้ Data Type แบบตัวเลข (เช่น INTEGER หรือ BIGINT) เพราะจะทำให้เกิดปัญหาการตัดศูนย์นำหน้า (Leading Zero Truncation) หรือการคำนวณที่ไม่ถูกต้อง

คำแนะนำที่ดีที่สุดคือการใช้ VARCHAR หรือ TEXT ซึ่งเป็น Data Type ที่รองรับทั้งตัวอักษรและตัวเลข ทำให้สามารถเก็บรูปแบบที่ซับซ้อน เช่น รหัสไปรษณีย์ของสหราชอาณาจักร (ตัวอักษรผสมตัวเลข) หรือรหัสที่มีศูนย์นำหน้าได้ครบถ้วน

การออกแบบ Schema และการเพิ่มข้อจำกัด (Constraints)

การเก็บรหัสไปรษณีย์ที่ดีต้องมีการกำหนดโครงสร้างตาราง (Schema) ที่ชัดเจน และที่สำคัญคือการใช้ CHECK Constraint เพื่อบังคับให้ข้อมูลที่ถูกบันทึกมีรูปแบบที่ถูกต้องตามหลักการที่กำหนดไว้

ตัวอย่างการสร้างตาราง (CREATE TABLE)

เราจะสร้างตาราง addresses โดยกำหนดให้คอลัมน์ zip_code เป็น VARCHAR(20) เพื่อรองรับความยาวที่แตกต่างกัน และเพิ่ม NOT NULL เพื่อให้แน่ใจว่าทุกรายการต้องมีรหัสไปรษณีย์เสมอ

SQL

CREATE TABLE addresses (
    address_id SERIAL PRIMARY KEY,
    city VARCHAR(100) NOT NULL,
    zip_code VARCHAR(20) NOT NULL,
    country VARCHAR(50) NOT NULL,
    -- เพิ่ม CHECK Constraint เพื่อจำกัดความยาวขั้นต่ำ/สูงสุด
    CONSTRAINT check_zip_length CHECK (LENGTH(zip_code) >= 3 AND LENGTH(zip_code) <= 15);
);

การแทรกข้อมูลและการตรวจสอบรูปแบบ (INSERT & Validation)

เมื่อเรามั่นใจว่าโครงสร้างถูกต้องแล้ว การแทรกข้อมูลก็ทำได้ง่าย แต่หากต้องการความแม่นยำระดับ Senior Architect ควรใช้ Regular Expression (Regex) ในการตรวจสอบรูปแบบรหัสไปรษณีย์เฉพาะประเทศ ซึ่งสามารถทำได้โดยการเพิ่ม CHECK Constraint ที่ซับซ้อนขึ้น หรือใช้ฟังก์ชัน REGEXP_LIKE ในการ Query

ตัวอย่างการแทรกข้อมูลที่ถูกต้อง:

SQL

INSERT INTO addresses (city, zip_code, country) VALUES ('Bangkok', '10100', 'Thailand');
INSERT INTO addresses (city, zip_code, country) VALUES ('New York', '10001', 'USA');
INSERT INTO addresses (city, zip_code, country) VALUES ('London', 'SW1A 1AA', 'UK');

บทสรุป: Best Practice ในการจัดเก็บข้อมูล

โดยสรุปแล้ว การจัดเก็บรหัสไปรษณีย์ใน PostgreSQL ควรยึดหลักการใช้ VARCHAR หรือ TEXT เสมอ เพื่อรักษาความสมบูรณ์ของศูนย์นำหน้าและตัวอักษร นอกจากนี้ การกำหนด CHECK Constraint ที่ระดับ Schema จะช่วยให้มั่นใจได้ว่าข้อมูลที่เข้ามาในระบบมีรูปแบบที่สอดคล้องกับมาตรฐานที่องค์กรกำหนดอย่างเคร่งครัด นี่คือแนวทางปฏิบัติที่ดีที่สุดที่นักพัฒนาระดับ Senior ควรนำไปใช้เพื่อสร้างฐานข้อมูลที่มีความเสถียรและเชื่อถือได้