Data Types ใน PostgreSQL: ทำความเข้าใจชนิดข้อมูลต่างๆ
ในบทที่แล้ว เราได้เรียนรู้วิธีการใช้งาน psql เพื่อเชื่อมต่อและจัดการฐานข้อมูล PostgreSQL ของเรา ในบทนี้ เราจะลงลึกในส่วนของชนิดข้อมูล (Data Types) ซึ่งเป็นพื้นฐานสำคัญในการออกแบบฐานข้อมูลที่มีประสิทธิภาพและถูกต้อง การเลือกชนิดข้อมูลที่เหมาะสมจะช่วยประหยัดพื้นที่จัดเก็บข้อมูล, เพิ่มประสิทธิภาพในการสืบค้น, และป้องกันข้อผิดพลาดที่อาจเกิดขึ้นจากการจัดเก็บข้อมูลผิดประเภท
PostgreSQL รองรับชนิดข้อมูลที่หลากหลาย ตั้งแต่ข้อมูลพื้นฐานอย่างตัวเลขและข้อความ ไปจนถึงข้อมูลที่ซับซ้อนกว่า เช่น ข้อมูลวันที่และเวลา, ข้อมูลทางเรขาคณิต, และข้อมูล JSON เราจะมาดูกันว่าชนิดข้อมูลหลักๆ มีอะไรบ้าง และควรเลือกใช้อย่างไร
ชนิดข้อมูล Integer
ชนิดข้อมูล Integer ใช้สำหรับเก็บตัวเลขจำนวนเต็ม (ไม่มีทศนิยม) PostgreSQL มีชนิดข้อมูล Integer ให้เลือกหลายขนาด ซึ่งแต่ละขนาดใช้พื้นที่จัดเก็บข้อมูลต่างกัน และรองรับช่วงของตัวเลขที่ต่างกันด้วย การเลือกขนาดที่เหมาะสมจะช่วยประหยัดพื้นที่จัดเก็บข้อมูล
- SMALLINT: ใช้พื้นที่ 2 ไบต์ รองรับช่วงตัวเลขตั้งแต่ -32,768 ถึง 32,767
- INTEGER: ใช้พื้นที่ 4 ไบต์ รองรับช่วงตัวเลขตั้งแต่ -2,147,483,648 ถึง 2,147,483,647 (โดยทั่วไปมักใช้ชนิดนี้)
- BIGINT: ใช้พื้นที่ 8 ไบต์ รองรับช่วงตัวเลขตั้งแต่ -9,223,372,036,854,775,808 ถึง 9,223,372,036,854,775,807
เหตุผลเชิงออกแบบ (Trade-offs): การเลือกใช้ SMALLINT แทน INTEGER เมื่อรู้ว่าข้อมูลที่เราจะเก็บมีค่าไม่เกินช่วงที่ SMALLINT รองรับ จะช่วยประหยัดพื้นที่จัดเก็บข้อมูลได้ แต่ถ้าข้อมูลมีโอกาสเกินช่วงที่กำหนด อาจทำให้เกิดข้อผิดพลาดได้ ดังนั้นควรพิจารณาช่วงของข้อมูลที่เราต้องการจัดเก็บอย่างรอบคอบ
ตัวอย่าง:
CREATE TABLE products (
product_id SERIAL PRIMARY KEY, -- SERIAL เป็น shortcut สำหรับ INTEGER ที่สร้างลำดับตัวเลขให้อัตโนมัติ
quantity SMALLINT
);
INSERT INTO products (quantity) VALUES (10);
INSERT INTO products (quantity) VALUES (1000);
ชนิดข้อมูล Text
ชนิดข้อมูล Text ใช้สำหรับเก็บข้อมูลที่เป็นข้อความ PostgreSQL มีชนิดข้อมูล Text ให้เลือก 3 แบบหลักๆ:
- VARCHAR(n): ใช้เก็บข้อความที่มีความยาวไม่เกิน n ตัวอักษร (n คือตัวเลข) ถ้าพยายามเก็บข้อความที่ยาวกว่า n ตัวอักษร จะเกิดข้อผิดพลาด
- TEXT: ใช้เก็บข้อความที่มีความยาวไม่จำกัด (ในทางปฏิบัติมีข้อจำกัดเรื่องขนาดหน่วยความจำ)
- CHAR(n): ใช้เก็บข้อความที่มีความยาวคงที่ n ตัวอักษร ถ้าเก็บข้อความที่สั้นกว่า n ตัวอักษร PostgreSQL จะเติมช่องว่าง (space) ให้เต็ม
เหตุผลเชิงออกแบบ (Trade-offs):
VARCHAR(n)เหมาะสำหรับข้อมูลที่มีความยาวจำกัด เช่น รหัสไปรษณีย์ หรือชื่อย่อของประเทศ การกำหนดความยาวที่แน่นอนช่วยให้ PostgreSQL จัดสรรพื้นที่จัดเก็บข้อมูลได้อย่างมีประสิทธิภาพTEXTเหมาะสำหรับข้อมูลที่มีความยาวไม่แน่นอน เช่น บทความ หรือรายละเอียดสินค้าCHAR(n)ไม่ค่อยนิยมใช้ ยกเว้นในกรณีที่ต้องการความยาวคงที่ของข้อมูลอย่างเคร่งครัด เพราะโดยทั่วไปVARCHAR(n)จะมีความยืดหยุ่นมากกว่า
ตัวอย่าง:
CREATE TABLE customers (
customer_id SERIAL PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
address TEXT
);
INSERT INTO customers (first_name, last_name, address) VALUES ('John', 'Doe', '123 Main Street');
ชนิดข้อมูล Date
ชนิดข้อมูล Date ใช้สำหรับเก็บข้อมูลวันที่ PostgreSQL มีชนิดข้อมูล Date และ Time ให้เลือกหลายแบบ:
- DATE: ใช้เก็บข้อมูลวันที่ (ปี, เดือน, วัน)
- TIME: ใช้เก็บข้อมูลเวลา (ชั่วโมง, นาที, วินาที)
- TIMESTAMP: ใช้เก็บข้อมูลวันที่และเวลา
- TIMESTAMPTZ: ใช้เก็บข้อมูลวันที่และเวลา พร้อมกับ Time Zone
เหตุผลเชิงออกแบบ (Trade-offs):
DATEเหมาะสำหรับข้อมูลที่ต้องการเก็บเฉพาะวันที่ เช่น วันเกิด หรือวันที่สั่งซื้อTIMEเหมาะสำหรับข้อมูลที่ต้องการเก็บเฉพาะเวลา เช่น เวลาเปิดทำการ หรือเวลาปิดทำการTIMESTAMPเหมาะสำหรับข้อมูลที่ต้องการเก็บทั้งวันที่และเวลา เช่น วันที่และเวลาที่สร้างรายการ หรือวันที่และเวลาที่แก้ไขรายการTIMESTAMPTZเหมาะสำหรับข้อมูลที่เกี่ยวข้องกับ Time Zone ที่แตกต่างกัน เช่น ข้อมูลการประชุมที่เกิดขึ้นในหลายประเทศ การใช้TIMESTAMPTZจะช่วยให้การคำนวณเวลาถูกต้องแม่นยำ
ตัวอย่าง:
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
order_date DATE,
order_time TIME,
created_at TIMESTAMP,
updated_at TIMESTAMPTZ
);
INSERT INTO orders (order_date, order_time, created_at, updated_at) VALUES ('2023-10-27', '10:00:00', NOW(), NOW());
ชนิดข้อมูล Boolean
ชนิดข้อมูล Boolean ใช้สำหรับเก็บข้อมูลที่เป็นจริง (true) หรือเท็จ (false) PostgreSQL ใช้คำว่า BOOLEAN สำหรับชนิดข้อมูลนี้
ตัวอย่าง:
CREATE TABLE products (
product_id SERIAL PRIMARY KEY,
is_active BOOLEAN
);
INSERT INTO products (is_active) VALUES (TRUE);
INSERT INTO products (is_active) VALUES (FALSE);
ชนิดข้อมูลอื่นๆ
นอกจากชนิดข้อมูลที่กล่าวมาแล้ว PostgreSQL ยังมีชนิดข้อมูลอื่นๆ อีกมากมาย เช่น:
- REAL: ใช้เก็บตัวเลขทศนิยมความแม่นยำเดี่ยว (single-precision floating-point number)
- DOUBLE PRECISION: ใช้เก็บตัวเลขทศนิยมความแม่นยำคู่ (double-precision floating-point number)
- NUMERIC: ใช้เก็บตัวเลขทศนิยมที่มีความแม่นยำสูง สามารถกำหนดจำนวนหลักและจำนวนตำแหน่งทศนิยมได้
- JSON/JSONB: ใช้เก็บข้อมูลในรูปแบบ JSON (JavaScript Object Notation)
- UUID: ใช้เก็บ Universally Unique Identifier (UUID) ซึ่งเป็นตัวระบุที่ไม่ซ้ำกันทั่วโลก
- ARRAY: ใช้เก็บข้อมูลในรูปแบบ Array
การเลือกชนิดข้อมูลที่เหมาะสมเป็นสิ่งสำคัญในการออกแบบฐานข้อมูลที่มีประสิทธิภาพและถูกต้อง ควรพิจารณาประเภทของข้อมูล, ช่วงของข้อมูล, และความแม่นยำที่ต้องการ เพื่อเลือกชนิดข้อมูลที่เหมาะสมที่สุด
ในบทถัดไป เราจะเรียนรู้เกี่ยวกับการจัดการ Role และสิทธิ์การเข้าถึง (Permissions) ซึ่งเป็นส่วนสำคัญในการรักษาความปลอดภัยของฐานข้อมูลของเรา