Các kiểu dữ liệu trong PostgreSQL

Các kiểu dữ liệu trong PostgreSQL là một trong những yếu tố quan trọng khi thiết kế và triển khai cơ sở dữ liệu. Sau khi đã tìm hiểu về cấu trúc cơ sở dữ liệu, nguyên tắc thiết kế bảng, mô hình ERD và chuẩn hóa dữ liệu, bước tiếp theo trong quá trình xây dựng hệ thống là lựa chọn kiểu dữ liệu (Data Type) phù hợp cho từng cột.

Kiểu dữ liệu không chỉ xác định loại giá trị mà một cột có thể lưu trữ, mà còn ảnh hưởng trực tiếp đến dung lượng lưu trữ, tính toàn vẹn dữ liệu, hiệu năng truy vấn và khả năng thực hiện các phép toán trên dữ liệu. Việc lựa chọn đúng kiểu dữ liệu giúp hệ quản trị cơ sở dữ liệu hoạt động hiệu quả hơn, đồng thời giảm thiểu lỗi dữ liệu trong quá trình vận hành.

PostgreSQL được đánh giá là một trong những hệ quản trị cơ sở dữ liệu mã nguồn mở mạnh mẽ nhất hiện nay, nổi bật với hệ thống kiểu dữ liệu phong phú và linh hoạt. Từ các kiểu dữ liệu cơ bản như số, chuỗi và ngày giờ đến các kiểu nâng cao như JSONB, Array, Range hay UUID, PostgreSQL cung cấp nhiều lựa chọn giúp xây dựng các hệ thống dữ liệu hiện đại và hiệu quả.

Các kiểu dữ liệu trong PostgreSQL

1. KHÁI NIỆM KIỂU DỮ LIỆU TRONG POSTGRESQL

1.1 Định nghĩa

Kiểu dữ liệu (Data Type) trong SQL là tập hợp các quy tắc xác định:

  • Loại giá trị mà một cột có thể chứa
  • Cách dữ liệu được lưu trữ trong bộ nhớ
  • Các phép toán có thể thực hiện trên dữ liệu đó

1.2 Vì sao cần kiểu dữ liệu?

Việc lựa chọn đúng kiểu dữ liệu giúp:

  • Tiết kiệm bộ nhớ: mỗi kiểu sử dụng không gian khác nhau
  • Đảm bảo tính toàn vẹn: ngăn nhập sai định dạng
  • Tối ưu hiệu năng: database engine có thể tối ưu truy vấn
  • Hỗ trợ phép toán chính xác: ví dụ phép toán số học, thời gian, chuỗi

2. PHÂN LOẠI KIỂU DỮ LIỆU TRONG POSTGRESQL

PostgreSQL hỗ trợ hệ thống kiểu dữ liệu đa dạng, gồm:

  • Numeric (số)
  • String (chuỗi)
  • Date/Time
  • Boolean
  • Array
  • JSON / JSONB
  • Geometric
  • Network Address
  • UUID
  • Range
  • Enum

3. KIỂU DỮ LIỆU CƠ BẢN

3.1 Kiểu số (Numeric Types)

Các kiểu Số nguyên:

  • SMALLINT    — 2 bytes
  • INTEGER     — 4 bytes
  • BIGINT      — 8 bytes

Số tự tăng

  • SMALLSERIAL
  • SERIAL
  • BIGSERIAL

Các kiểu Số thực

  • REAL
  • DOUBLE PRECISION
  • NUMERIC(p,s)
  • DECIMAL(p,s) — alias của NUMERIC
  • NUMERIC/DECIMAL phù hợp cho dữ liệu tài chính vì độ chính xác cao.

3.2 Kiểu chuỗi (String Types)

Gồm CHAR, VARCHAR, TEXT

  • CHAR(n)     — Fixed-length, padded with spaces
  • VARCHAR(n)  — Variable-length with limit
  • TEXT        — Variable unlimited length (PostgreSQL đặc biệt)

Ví dụ:

CREATE TABLE users (
code CHAR(5), -- 'ABC ' (padded)
name VARCHAR(100), -- 'John Doe'
description TEXT -- Unlimited length
);

3.3 Kiểu dữ liệu ngày giờ (Date/Time Types)

Gồm TIME, DATE, TIMETZ, TIMESTAMP, TIMESTAMPTZ, INTERVAL

  • DATE        — Date only (4713 BC to 294276 AD)
  • TIME        — Time without date
  • TIMETZ     — Time with timezone
  • TIMESTAMP  — Date and time without timezone
  • TIMESTAMPTZ — Date and time with timezone (khuyến nghị)
  • INTERVAL   — Time intervals (PostgreSQL đặc biệt)

Ví dụ:

CREATE TABLE events (
event_date DATE,
start_time TIME,
created_at TIMESTAMPTZ DEFAULT NOW(),
duration INTERVAL
);

SELECT NOW() + INTERVAL '1 day'; -- Lấy thời điểm hiện tại + 1 ngày
SELECT AGE( TIMESTAMP '2026-01-10', TIMESTAMP '2020-01-10'); -- Tính tuổi

3.4 Kiểu Boolean

Gồm BOOLEAN, BOOL

BOOLEAN / BOOL   -- TRUE, FALSE, NULL
-- Chấp nhận các giá trị sau:
-- TRUE: 't', 'true', 'y', 'yes', 'on', '1'
-- FALSE: 'f', 'false', 'n', 'no', 'off', '0'

Ví dụ:

CREATE TABLE settings (
is_active BOOLEAN DEFAULT TRUE,
is_deleted BOOL DEFAULT FALSE
);

INSERT INTO settings VALUES ('yes', '0');

4. KIỂU DỮ LIỆU NÂNG CAO ĐẶC TRƯNG CỦA POSTGRESQL

Bên cạnh các kiểu dữ liệu cơ bản, PostgreSQL còn cung cấp nhiều kiểu dữ liệu nâng cao đặc trưng, giúp xử lý các bài toán dữ liệu phức tạp như lưu trữ JSON, quản lý khoảng thời gian (range), lưu danh sách giá trị (array) hoặc định danh toàn cục (UUID).

4.1 Arrays (Mảng)

Trong các kiểu dữ liệu trong PostgreSQL, kiểu Array (mảng) cho phép lưu nhiều giá trị trong cùng một cột.

CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT,
tags TEXT[] , -- Array of text
prices NUMERIC(10,2)[], -- Array of numbers
matrix INTEGER[][] -- Multi-dimensional array
);

-- Sử dụng:
INSERT INTO products (name, tags, prices)
VALUES (
'Laptop',
ARRAY['electronics', 'computer'],
ARRAY[999.99, 1299.99]
);

-- Truy vấn:
SELECT * FROM products WHERE 'electronics' = ANY(tags);
SELECT * FROM products WHERE tags @> ARRAY['computer'];

4.2 JSON và JSONB

JSON: lưu dưới dạng text. JSONB: lưu dạng nhị phân, hỗ trợ indexing tốt hơn

CREATE TABLE documents (
id SERIAL PRIMARY KEY,
data JSON,
metadata JSONB
);

-- Indexing JSONB:
CREATE INDEX idx_metadata_gin ON documents USING GIN (metadata);

-- Queries:
SELECT * FROM documents WHERE metadata->>'status' = 'active';
SELECT * FROM documents WHERE metadata @> '{"type": "article"}';

4.3 Geometric Types

PostgreSQL có nhiều kiểu hình học built-in, có thể sử dụng lưu trữ tọa độ, bán kính giao hàng.

  • POINT        — (x,y)
  • LINE         — Infinite line
  • LSEG         — Line segment
  • BOX          — Rectangle
  • PATH         — Open/closed path
  • POLYGON      — Polygon
  • CIRCLE       — Circle

Ví dụ:

CREATE TABLE locations (
id SERIAL PRIMARY KEY,
coordinates POINT,
area POLYGON,
search_radius CIRCLE
);

-- Truy vấn:
SELECT * FROM locations WHERE coordinates <-> point(0,0) < 10;

4.4 Network Address Types

Gồm INET, CIDR, MACADDR, MACADDR8. Dùng cho hệ thống quản lý thiết bị mạng.

  • INET        — IPv4/IPv6 addresses
  • CIDR        — Network addresses
  • MACADDR     — MAC addresses
  • MACADDR8    — MAC addresses (EUI-64 format)

Ví dụ:

CREATE TABLE network_devices (
    id SERIAL PRIMARY KEY,
    ip_address INET,
    network CIDR,
    mac_address MACADDR
);
-- Truy vấn:
SELECT * FROM network_devices WHERE ip_address << inet '192.168.1.0/24';

4.5 UUID

Thường được sử dụng làm ID (Primary Key) trong các CSDL lớn, ví dụ trên các sàn thương mại điện tử

-- Native UUID support
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
username TEXT NOT NULL
);

4.6 Range Types

Có thể sử dụng TSTZRANGE cho khung giờ đặt phòng, hoặc NUMRANGE cho khoảng giá sản phẩm…

  • INT4RANGE    — Range of integers
  • NUMRANGE     — Range of numerics
  • TSRANGE      — Range of timestamps
  • TSTZRANGE    — Range of timestamps with timezone
  • DATERANGE    — Range of dates

Ví dụ:

CREATE TABLE reservations (
id SERIAL PRIMARY KEY,
room_id INTEGER,
period TSTZRANGE,
EXCLUDE USING GIST (room_id WITH =, period WITH &&)
);
-- Truy vấn:
SELECT * FROM reservations WHERE period @> NOW();

4.7 Enum

Hỗ trợ tạo kiểu dữ liệu liệt kê từ một tập hợp các giá trị định trước

-- Các kiểu ENUM liệt kê
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
CREATE TYPE priority AS ENUM ('low', 'medium', 'high', 'urgent');

CREATE TABLE tickets (
id SERIAL PRIMARY KEY,
status mood,
priority priority
);

-- Type safety
INSERT INTO tickets (status, priority) VALUES ('happy', 'high'); -- OK
INSERT INTO tickets (status, priority) VALUES ('excited', 'high'); -- ERROR

5. Tầm quan trọng của việc chọn đúng kiểu dữ liệu trong PostgreSQL

Trong thực tế, việc lựa chọn các kiểu dữ liệu trong PostgreSQL không chỉ ảnh hưởng đến khả năng lưu trữ dữ liệu mà còn quyết định hiệu năng truy vấn và khả năng mở rộng của hệ thống.

Ví dụ, sử dụng NUMERIC cho dữ liệu tài chính giúp đảm bảo độ chính xác cao, trong khi JSONB phù hợp cho dữ liệu bán cấu trúc như metadata hoặc cấu hình hệ thống.

Việc hiểu rõ từng loại data type trong PostgreSQL giúp nhà phát triển thiết kế cơ sở dữ liệu tối ưu hơn và tránh các lỗi phổ biến trong quá trình phát triển hệ thống.

KẾT LUẬN

Tóm lại, các kiểu dữ liệu trong PostgreSQL đóng vai trò nền tảng trong quá trình thiết kế và triển khai cơ sở dữ liệu. Việc lựa chọn đúng kiểu dữ liệu không chỉ giúp lưu trữ dữ liệu hiệu quả mà còn đảm bảo tính chính xác, tính toàn vẹn và tối ưu hiệu năng truy vấn của hệ thống.

Với hệ thống kiểu dữ liệu đa dạng và mạnh mẽ, PostgreSQL cho phép nhà phát triển và kỹ sư dữ liệu xây dựng các mô hình dữ liệu linh hoạt, từ những cấu trúc cơ bản đến các dạng dữ liệu phức tạp như JSONB, Array, Range hay UUID. Hiểu rõ và sử dụng đúng các kiểu dữ liệu trong PostgreSQL sẽ giúp khai thác tối đa sức mạnh của hệ quản trị cơ sở dữ liệu này trong các hệ thống dữ liệu thực tế.