در طراحی و تعریف ساختار جداول پایگاه داده، انتخاب نوع داده مناسب یکی از مهمترین تصمیمها است. نوع داده تعیین میکند که دادهها چگونه ذخیره، پردازش و بازیابی شوند و تأثیر مستقیم بر کارایی، قابلیت نگهداری و مقیاسپذیری دارد.
در PostgreSQL، علاوه بر انواع داده استاندارد عددی و متنی، انواع داده پیشرفتهای وجود دارد که امکان ذخیره دادههای آرایهای، JSON، HStore، ENUM، Large Object و دادههای جغرافیایی را فراهم میکنند. استفاده از این نوع دادهها به جای ایجاد جداول جداگانه، امکان ذخیره اطلاعات پیچیده و ساختاریافته را در خود جدول اصلی فراهم میکند.
| دسته | نوع دادهها | توضیح |
|---|---|---|
| عدد (Numeric) | SMALLINT, INTEGER, BIGINT, NUMERIC, REAL, DOUBLE PRECISION, SERIAL, BIGSERIAL | دادههای عددی صحیح و اعشاری، شامل auto-increment با Serial/BigSerial |
| رشته (Character) | CHAR(n), VARCHAR(n), TEXT | دادههای متنی با طول ثابت یا متغیر |
| تاریخ و زمان (Date/Time) | DATE, TIME, TIMESTAMP, INTERVAL | دادههای زمان و تاریخ، شامل اختلافها و محاسبات زمانی |
| Boolean | BOOLEAN | مقدار صحیح/غلط |
| نوعهای خاص (Special) | UUID, ENUM, CIDR, INET, MACADDR | دادههای شناسه جهانی، مجموعه ثابت مقادیر (ENUM)، دادههای شبکه و MAC |
| آرایه (Array) | integer[], text[], custom_type[] | ذخیره چند مقدار از یک نوع در یک ستون |
| HStore | hstore | ذخیره کلید-مقدار سبک در یک ستون |
| JSON/JSONB | json, jsonb | دادههای ساختاریافته نیمهساختیافته |
| Large Object | BYTEA, TEXT | ذخیره دادههای بزرگ متنی و باینری |
آرایه:
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT,
tags TEXT[]
);
INSERT INTO products(name, tags) VALUES ('Laptop', ARRAY['electronics','computer','portable']);
JSON / JSONB:
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer JSONB,
items JSONB
);
INSERT INTO orders(customer, items) VALUES (
'{"name": "Ali", "email": "ali@example.com"}',
'[{"product_id": 1, "quantity": 2}, {"product_id": 3, "quantity": 1}]'
);
HStore:
CREATE EXTENSION IF NOT EXISTS hstore;
CREATE TABLE settings (
id SERIAL PRIMARY KEY,
preferences HSTORE
);
INSERT INTO settings(preferences) VALUES ('theme => dark, language => fa');
ENUM:
CREATE TYPE mood AS ENUM ('happy', 'sad', 'neutral');
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name TEXT,
current_mood mood
);
INSERT INTO users(name, current_mood) VALUES ('Sara', 'happy');
Large Object (باینری):
CREATE TABLE files (
id SERIAL PRIMARY KEY,
filename TEXT,
content BYTEA
);
pg_type → اطلاعات انواع داده و ستونهاpg_toast → دادههای TOAST نگهداری شده به صورت جداگانهPostgreSQL با افزونه PostGIS امکان ذخیره دادههای مکانی و جغرافیایی را فراهم میکند:
| نوع داده | توضیح |
|---|---|
POINT | یک نقطه در فضا |
LINE | خط مستقیم |
POLYGON | چندضلعی |
GEOGRAPHY | داده جغرافیایی با مختصات کره زمین |
GEOMETRY | داده هندسی دوبعدی |
PostgreSQL اجازه میدهد تا نوع داده سفارشی تعریف شود، شامل:
این امکان در ادامه، برای ایجاد دادههای پیچیده و کنترل رفتار آنها با PL/pgSQL بررسی میشود.
UUID مخفف عبارت Universally Unique Identifier است و یک شناسه ۱۲۸ بیتی است که احتمال تکرار آن در جهان بسیار نزدیک به صفر است. این شناسهها به صورت استاندارد به شکل زیر نمایش داده میشوند:
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
در PostgreSQL، نوع داده uuid برای ذخیره این شناسهها استفاده میشود.
اصطلاح GUID (Globally Unique Identifier) در واقع همان UUID است، اما در برخی سیستمها مانند Microsoft SQL Server از این اصطلاح استفاده میشود. در PostgreSQL، از اصطلاح UUID استفاده میشود، اما مفهوم یکسان است.
در نسخه ۱۸ PostgreSQL، پشتیبانی از UUIDv7 به صورت توکار اضافه شده است. UUIDv7 ویژگیهای زیر را دارد:
-- ایجاد جدول با استفاده از UUIDv7 به عنوان شناسه
CREATE TABLE orders (
id UUID PRIMARY KEY DEFAULT uuidv7(),
customer_name TEXT,
amount NUMERIC
);
-- درج رکورد جدید
INSERT INTO orders (customer_name, amount) VALUES ('Ali', 100.50);
-- نمایش دادهها
SELECT * FROM orders;
در این مثال:
uuidv7() برای تولید شناسه یکتا و زمانمند استفاده شده است.id به صورت خودکار ایجاد میشود و با توجه به ویژگی زمانی UUIDv7، کارایی بهتری خواهد داشت.uuidv7() استفاده کرد که در نسخه ۱۸ PostgreSQL در دسترس استpg_toast و pg_type مشاهده کرد.