PlusMagi's Blog By Pitt Phunsanit Backend,Database Advanced Data Types (JSONB, Array Types, UUID, Network/INET, Range Types)

Advanced Data Types (JSONB, Array Types, UUID, Network/INET, Range Types)

ในฐานะ System Architect ในยุคที่ข้อมูลมีความซับซ้อนและหลากหลายรูปแบบ (Semi-structured Data) การพึ่งพา Schema แบบตาราง (Relational Schema) ที่ตายตัวเพียงอย่างเดียวไม่เพียงพออีกต่อไป ฐานข้อมูลสมัยใหม่ต้องมีความยืดหยุ่นสูง สามารถรองรับข้อมูลที่มีโครงสร้างไม่แน่นอน (Schema-on-read) และต้องการการระบุตัวตนที่แม่นยำในระดับเครือข่าย

บทความนี้จะเจาะลึกถึง Advanced Data Types ที่ PostgreSQL นำเสนอ ซึ่งเป็นเครื่องมือสำคัญที่ช่วยให้คุณสามารถออกแบบระบบฐานข้อมูลที่มีความยืดหยุ่น (Flexibility) และความสามารถในการขยายตัว (Scalability) ในระดับ Enterprise ได้อย่างแท้จริง

ประเภทข้อมูลขั้นสูงที่เปลี่ยนขีดจำกัดของ PostgreSQL

การทำความเข้าใจและเลือกใช้ประเภทข้อมูลที่เหมาะสมคือหัวใจของการออกแบบระบบฐานข้อมูลระดับสูง เรามาดูการใช้งานของประเภทข้อมูลสำคัญเหล่านี้พร้อมตัวอย่างการใช้งานจริงใน PostgreSQL:

1. JSONB (JSON Binary)

JSONB คือประเภทข้อมูลที่ช่วยให้คุณสามารถจัดเก็บข้อมูลแบบ JSON ที่มีโครงสร้างยืดหยุ่น (Flexible Schema) โดยที่ PostgreSQL จะทำการจัดเก็บข้อมูลในรูปแบบไบนารี ทำให้การค้นหา (Indexing) และการดำเนินการ (Querying) มีประสิทธิภาพสูงกว่า JSON ธรรมดามาก เหมาะสำหรับเก็บข้อมูล Metadata หรือข้อมูลที่อาจมีการเปลี่ยนแปลงโครงสร้างบ่อยครั้ง

SQL

CREATE TABLE product_details (id SERIAL PRIMARY KEY, attributes JSONB);</code>
<pre><code class="language-sql">INSERT INTO product_details (attributes) VALUES ('{"color": "blue", "size": "L", "material": "cotton"}');

2. Array Types

Array Types ช่วยให้เราสามารถจัดเก็บรายการค่า (List of values) ที่มีชนิดข้อมูลเดียวกันไว้ในคอลัมน์เดียวได้อย่างมีประสิทธิภาพ ทำให้การจำลองความสัมพันธ์แบบ One-to-Many ในระดับ Record เดียวทำได้ง่ายขึ้น

SQL

CREATE TABLE user_skills (user_id INT, skills TEXT[]);</code>
<pre><code class="language-sql">INSERT INTO user_skills (user_id, skills) VALUES (101, '{"python", "sql", "aws"}');

3. UUID (Universally Unique Identifier)

UUID คือตัวระบุที่ไม่ซ้ำกันทั่วโลก (Globally Unique) การใช้ UUID เป็น Primary Key ช่วยให้เราสามารถสร้างระบบที่มีการกระจายตัว (Distributed System) ได้ง่าย โดยไม่ต้องกังวลเรื่องการชนกันของ Primary Key (Key Collision) แม้จะมีการสร้างข้อมูลจากหลายเซิร์ฟเวอร์พร้อมกัน

SQL

CREATE TABLE global_users (user_uuid UUID PRIMARY KEY, username VARCHAR(50));</code>
<pre><code class="language-sql">INSERT INTO global_users (user_uuid, username) VALUES ('a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11', 'john_doe');

4. INET (Network/IP Address)

INET Type ถูกออกแบบมาเพื่อจัดการกับที่อยู่เครือข่าย (IP Address) และ Subnet Mask โดยเฉพาะ ทำให้เราสามารถทำการ Query ที่เกี่ยวข้องกับเครือข่ายได้อย่างแม่นยำ เช่น การตรวจสอบว่า IP Address ใดอยู่ในช่วงเครือข่ายใด

SQL

CREATE TABLE network_logs (log_id SERIAL PRIMARY KEY, ip_address INET);</code>
<pre><code class="language-sql">INSERT INTO network_logs (ip_address) VALUES ('192.168.1.10/24');

5. Range Types

Range Types ช่วยให้เราสามารถจัดเก็บช่วงค่า (Interval) ของข้อมูลได้ ไม่ว่าจะเป็นช่วงวันที่ (Date Range) หรือช่วงตัวเลข (Numeric Range) ซึ่งมีประโยชน์อย่างยิ่งในการจัดการช่วงเวลาที่ข้อมูลมีผลบังคับใช้ (Effective Period) หรือการคำนวณช่วงเวลาที่ทับซ้อนกัน

SQL

CREATE TABLE product_availability (product_id INT, available_range DATE[]);</code>
<pre><code class="language-sql">INSERT INTO product_availability (product_id, available_range) VALUES (5, '[2024-01-01, 2024-01-31]');

บทสรุป: การออกแบบระบบที่ยืดหยุ่นด้วย PostgreSQL

การใช้ Advanced Data Types เหล่านี้ ไม่ได้เป็นเพียงแค่การเพิ่มประเภทข้อมูลเท่านั้น แต่เป็นการยกระดับขีดความสามารถในการออกแบบสถาปัตยกรรมฐานข้อมูล (Database Architecture) ของคุณให้มีความยืดหยุ่นสูง (Schema Agnostic) ทนทานต่อการเปลี่ยนแปลงของธุรกิจ และพร้อมรองรับการขยายตัวในอนาคตได้อย่างมีประสิทธิภาพ หากคุณต้องการสร้างระบบที่ซับซ้อนและต้องการความแม่นยำในระดับ Enterprise PostgreSQL คือตัวเลือกที่ทรงพลังที่สุด