بخش اول: ورود به جهان قدرتمند PostgreSQL
بخش دوم: جادوی جستجو و کوئری‌نویسی
بخش سوم: بهینه‌سازی و ساختارهای پیشرفته
بخش چهارم: امنیت، پشتیبانی، عملکرد و نگه‌داری
کارگاه‌ها و مثال‌های کاربردی

نوع‌‌ داده‌ها در PostgreSQL برای تعریف ساختار جداول

در طراحی و تعریف ساختار جداول پایگاه داده، انتخاب نوع داده مناسب یکی از مهم‌ترین تصمیم‌ها است. نوع داده تعیین می‌کند که داده‌ها چگونه ذخیره، پردازش و بازیابی شوند و تأثیر مستقیم بر کارایی، قابلیت نگهداری و مقیاس‌پذیری دارد.
در 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داده‌های زمان و تاریخ، شامل اختلاف‌ها و محاسبات زمانی
BooleanBOOLEANمقدار صحیح/غلط
نوع‌های خاص (Special)UUID, ENUM, CIDR, INET, MACADDRداده‌های شناسه جهانی، مجموعه ثابت مقادیر (ENUM)، داده‌های شبکه و MAC
آرایه (Array)integer[], text[], custom_type[]ذخیره چند مقدار از یک نوع در یک ستون
HStorehstoreذخیره کلید-مقدار سبک در یک ستون
JSON/JSONBjson, jsonbداده‌های ساختاریافته نیمه‌ساخت‌یافته
Large ObjectBYTEA, 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
);

۳. ذخیره داده‌های بزرگ و TOAST

  • PostgreSQL از TOAST (The Oversized-Attribute Storage Technique) برای ذخیره مقادیر بزرگ استفاده می‌کند.
  • داده‌هایی مانند TEXT بزرگ، JSONB، BYTEA و آرایه‌های طولانی به صورت خودکار خارج از جدول اصلی و در صفحات TOAST ذخیره می‌شوند تا کارایی جدول اصلی حفظ شود.
  • برای بررسی اطلاعات مربوط به این داده‌ها می‌توان از جداول سیستمی استفاده کرد:
    • pg_type → اطلاعات انواع داده و ستون‌ها
    • pg_toast → داده‌های TOAST نگهداری شده به صورت جداگانه

۴. داده‌های جغرافیایی

PostgreSQL با افزونه PostGIS امکان ذخیره داده‌های مکانی و جغرافیایی را فراهم می‌کند:

نوع دادهتوضیح
POINTیک نقطه در فضا
LINEخط مستقیم
POLYGONچندضلعی
GEOGRAPHYداده جغرافیایی با مختصات کره زمین
GEOMETRYداده هندسی دوبعدی

۵. انواع داده سفارشی (User-Defined Types)

PostgreSQL اجازه می‌دهد تا نوع داده سفارشی تعریف شود، شامل:

  • Composite Types: ترکیبی از چند ستون
  • Enum: مجموعه ثابت مقادیر
  • Range Types: بازه‌های عددی یا تاریخی
  • Domain: تعریف محدودیت روی نوع داده موجود

این امکان در ادامه، برای ایجاد داده‌های پیچیده و کنترل رفتار آن‌ها با PL/pgSQL بررسی می‌شود.


۶. UUID در PostgreSQL: شناسه‌های یکتا برای داده‌ها

UUID چیست؟

UUID مخفف عبارت Universally Unique Identifier است و یک شناسه ۱۲۸ بیتی است که احتمال تکرار آن در جهان بسیار نزدیک به صفر است. این شناسه‌ها به صورت استاندارد به شکل زیر نمایش داده می‌شوند:

a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11

در PostgreSQL، نوع داده uuid برای ذخیره این شناسه‌ها استفاده می‌شود.

تفاوت UUID با GUID

اصطلاح GUID (Globally Unique Identifier) در واقع همان UUID است، اما در برخی سیستم‌ها مانند Microsoft SQL Server از این اصطلاح استفاده می‌شود. در PostgreSQL، از اصطلاح UUID استفاده می‌شود، اما مفهوم یکسان است.


UUID در PostgreSQL 18: پشتیبانی از UUIDv7

در نسخه ۱۸ PostgreSQL، پشتیبانی از UUIDv7 به صورت توکار اضافه شده است. UUIDv7 ویژگی‌های زیر را دارد:

  • ترتیب زمانی: UUIDv7 به گونه‌ای طراحی شده که رکوردهای جدید به صورت تقریبی ترتیبی ذخیره شوند. این ویژگی باعث بهبود عملکرد ایندکس‌ها می‌شود.
  • بهینه‌سازی ایندکس‌ها: با توجه به ترتیب زمانی UUIDv7، ایندکس‌های B-Tree روی این نوع داده‌ها کارایی بهتری دارند و از fragmentation کمتری برخوردار هستند.
مثال استفاده از UUIDv7 در PostgreSQL 18
-- ایجاد جدول با استفاده از 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، کارایی بهتری خواهد داشت.
  • UUID یا GUID شناسه‌های یکتای ۱۲۸ بیتی هستند که در سیستم‌های توزیع‌شده برای جلوگیری از تداخل شناسه‌ها استفاده می‌شوند.
  • در PostgreSQL 18، پشتیبانی از UUIDv7 به صورت توکار اضافه شده است که با ویژگی ترتیب زمانی، عملکرد ایندکس‌ها را بهبود می‌بخشد.
  • برای استفاده از UUIDv7، می‌توان از تابع uuidv7() استفاده کرد که در نسخه ۱۸ PostgreSQL در دسترس است

جمع‌بندی

  • انتخاب نوع داده مناسب نقش کلیدی در کارایی، مقیاس‌پذیری و نگهداری پایگاه داده دارد.
  • PostgreSQL انواع داده متنوعی ارائه می‌دهد، از جمله عدد، متن، آرایه، JSON، HStore، ENUM، داده‌های باینری و Large Object.
  • داده‌های بزرگ و JSON/JSONB در TOAST ذخیره می‌شوند و می‌توان اطلاعات آن‌ها را از طریق pg_toast و pg_type مشاهده کرد.
  • امکان تعریف نوع داده سفارشی انعطاف‌پذیری بالایی برای طراحی جداول پیچیده فراهم می‌کند.
فروشگاه
جستجو
دوره ها

لطفا کلمات کلیدی را وارد کنید