لوگوی PostgreSQL روی زمینه فناوری

انواع داده‌ها در PostgreSQL چه هستند و چه کاربردی دارند؟

متخصصان داده که برنامه‌های مدرن می‌سازند، اغلب با گلوگاه‌های عملکردی و ناکارآمدی ذخیره‌سازی مواجه می‌شوند که ناشی از شیوه‌های قدیمی استفاده از نوع داده در PostgreSQL است. در حالی که بسیاری از توسعه‌دهندگان روی بهینه‌سازی کوئری و استراتژی‌های ایندکسینگ تمرکز دارند، پایه عملکرد پایگاه داده در انتخاب و پیاده‌سازی صحیح نوع داده نهفته است.

PostgreSQL یکی از پایگاه‌های داده رابطه‌ای متن‌باز معتبر است که انواع داده بومی آن، پایه‌ای برای محبوبیت گسترده این سیستم به شمار می‌آید. این انواع داده داخلی به شما کمک می‌کنند استراتژی‌های بهینه ذخیره‌سازی برای هر ستون جدول را تعیین کنید و در عین حال مدل‌سازی داده پیشرفته‌ای را در حوزه‌های مختلف ممکن سازند.

این راهنمای جامع به بررسی اکوسیستم انواع داده PostgreSQL، الگوهای پیاده‌سازی مدرن و استراتژی‌های اثبات‌شده برای جلوگیری از مشکلات عملکرد می‌پردازد.

انواع داده‌ها در PostgreSQL چه هستند و چرا برای عملکرد داده مهم‌اند؟

انواع داده PostgreSQL تعیین می‌کنند که چه نوع داده‌ای می‌تواند در یک ستون ذخیره شود و پایه‌ای برای صحت داده، بهینه‌سازی ذخیره‌سازی و عملکرد کوئری هستند. PostgreSQL طیف گسترده‌ای از انواع داده را پشتیبانی می‌کند، از جمله numeric, character, binary, date/time, boolean, enumerated, geometric و انواع تخصصی مانند JSON و arrays، که امکان مدل‌سازی دقیق تقریباً هر ساختار داده‌ای را فراهم می‌کند.

انتخاب نوع داده صحیح سه مزیت مهم دارد:

  • حفظ یکپارچگی داده‌ها با اعتبارسنجی و محدودیت‌های داخلی

  • استفاده بهینه از فضای ذخیره‌سازی و بهینه‌سازی عملیات I/O

  • بهبود عملکرد کوئری با استفاده از اپراتورها و استراتژی‌های ایندکسینگ تخصصی

انتخاب نوع داده درست فقط بر کارایی ذخیره‌سازی اثر نمی‌گذارد؛ برنامه‌ریز کوئری PostgreSQL به شدت به اطلاعات نوع داده متکی است تا طرح‌های اجرایی بهینه ایجاد کند. به‌طور مثال، استفاده از INTEGER به جای TEXT برای داده‌های عددی، امکان استفاده از اپراتورهای عددی تخصصی و استراتژی‌های ایندکسینگ سریع‌تر برای joins و aggregations را فراهم می‌کند.

انواع داده تخصصی مانند JSON و JSONB امکان مدل‌سازی سندی در ساختارهای رابطه‌ای را می‌دهند و انواع هندسی (geometric) پرس‌وجوهای مکانی لازم برای برنامه‌های مبتنی بر موقعیت را پشتیبانی می‌کنند.

نوآوری‌های اخیر در انواع داده PostgreSQL

Multirange برای داده‌های غیر پیوسته

PostgreSQL 14 انواع multirange را معرفی کرد که بازه‌های داده غیر پیوسته را کارآمدتر از آرایه‌های سنتی مدل‌سازی می‌کند. این نوع داده بازه‌های همپوشانی را جلوگیری می‌کند و برای دوره‌های نامتوالی مانند بازه‌های بستری بیمارستان یا پنجره‌های نگهداری ایده‌آل است.

-- Multirange for discontinuous time periods
CREATE TABLE maintenance_windows (
id INTEGER PRIMARY KEY,
system_id INTEGER,
scheduled_periods TSRANGE[]
);
— Using multirange for efficient overlap queries
SELECT *
FROM maintenance_windows
WHERE scheduled_periods && ‘[۲۰۲۳-۰۶-۱۵, ۲۰۲۳-۰۷-۰۱)’::TSRANGE;

توانمندی‌های پیشرفته JSON و JSONB

PostgreSQL 17 استانداردسازی SQL/JSON را معرفی کرده و تابع JSON_TABLE() امکان تبدیل داده‌های JSON به جداول رابطه‌ای را فراهم می‌کند:

-- Transform JSON into relational data
SELECT *
FROM JSON_TABLE(
order_data,
'$.items[*]'
COLUMNS (
item_id INTEGER PATH '$.id',
product_name TEXT PATH '$.name',
quantity INTEGER PATH '$.qty'
)
);

پشتیبانی از انواع عددی گسترده‌تر

نسخه‌های جدید PostgreSQL از اعداد صحیح غیرده‌دهی در قالب‌های هگز، هشت‌دهی و باینری پشتیبانی می‌کنند:

-- Multiple numeric formats
SELECT
0x2A AS hex_value, -- ۴۲ in hexadecimal
۰o52 AS octal_value, -- ۴۲ in octal
۰b101010 AS binary_value; -- ۴۲ in binary

انواع داده برداری برای هوش مصنوعی و یادگیری ماشین

با pgvector، PostgreSQL می‌تواند داده‌های برداری با ابعاد بالا را پردازش کند:

-- Vector similarity search example
CREATE TABLE embeddings (
id serial PRIMARY KEY,
content text,
embedding vector(۱۵۳۶)
);
— Find similar vectors using cosine similarity
SELECT content, embedding <=> query_vector AS distance
FROM embeddings
ORDER BY embedding <=> query_vector
LIMIT ۵;

انواع داده منسوخ و جایگزین‌های مدرن

حذف انواع زمانی قدیمی (PostgreSQL 12):

Deprecated Type Reason for Removal Modern Alternative Migration Example
abstime Limited date range, poor error handling TIMESTAMPTZ ALTER TABLE historical_data ALTER COLUMN event_time TYPE timestamptz USING event_time::timestamptz;
reltime Limited range, wrap-around behavior INTERVAL Replace with standard interval operations
tinterval Non-standard alias INTERVAL Same as above

انواع توصیه نشده با جایگزین مدرن:

  • MONEY → NUMERIC

CREATE TABLE financial_data (
amount NUMERIC(۱۹, ۴) -- ۱۵ digits, 4 decimal places
);
  • SERIAL → Identity Columns

CREATE TABLE users (
id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
name TEXT NOT NULL
);

انتخاب انواع داده مناسب برای سناریوهای مختلف

داده‌های عددی

  • SMALLINT (2 bytes): کدهای وضعیت، شمارنده‌های کوچک

  • INTEGER (4 bytes): متداول‌ترین نوع

  • BIGINT (8 bytes): شناسه‌ها یا شمارنده‌های بزرگ

اعداد با دقت دقیق

  • NUMERIC(precision, scale): داده‌های مالی یا علمی که دقت بالایی نیاز دارند

داده‌های شناور

  • REAL (FLOAT4): تک‌دقت

  • DOUBLE PRECISION (FLOAT8): دو‌دقت

ستون‌های هویتی مدرن

CREATE TABLE users (
id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
name TEXT NOT NULL
);

داده‌های متنی

  • VARCHAR(n): طول متغیر با محدودیت

  • TEXT: طول نامحدود

  • CHAR(n): طول ثابت (ترجیحاً اجتناب شود)

داده‌های زمانی

  • DATE, TIME, TIMESTAMP, TIMESTAMPTZ, INTERVAL

  • ترجیح TIMESTAMPTZ برای برنامه‌های جهانی

داده‌های بولی

  • BOOLEAN با مقادیر TRUE/FALSE

داده‌های باینری

  • BYTEA, BIT(n), BIT VARYING(n)

جلوگیری از اشتباهات رایج و بهینه‌سازی عملکرد

استفاده از SERIAL منسوخ شده:

-- Deprecated
CREATE TABLE old_table (
id SERIAL PRIMARY KEY,
name TEXT
);
— Modern
CREATE TABLE new_table (
id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
name TEXT
);

مسائل دقت اعداد شناور:

-- Problematic
SELECT ۰.۱::FLOAT + ۰.۲::FLOAT; -- ۰.۳۰۰۰۰۰۰۰۰۰۰۰۰۰۰۰۴
— Correct
SELECT ۰.۱::NUMERIC + ۰.۲::NUMERIC; — ۰.۳

بهینه‌سازی ذخیره‌سازی متنی:

-- Inefficient
CREATE TABLE inefficient (
code CHAR(۱۰) -- 'A' becomes 'A '
);
— Efficient
CREATE TABLE efficient (
code TEXT CHECK (LENGTH(code) <= ۱۰)
);

زمان‌بندی با توجه به منطقه زمانی:

-- Ambiguous
INSERT INTO events (event_time)
VALUES ('۲۰۲۳-۰۱-۰۱ ۱۲:۰۰:۰۰');
— Timezone-aware
INSERT INTO events (event_time)
VALUES (‘۲۰۲۳-۰۱-۰۱ ۱۲:۰۰:۰۰+۰۰’::TIMESTAMPTZ);

بهترین شیوه‌ها برای انتخاب نوع داده

  • بهینه‌سازی اندازه: کوچک‌ترین نوع کافی (SMALLINT, INTEGER, BIGINT)

  • دقت: NUMERIC برای دقت کامل، REAL/DOUBLE PRECISION برای تقریبی

  • رشته‌ها: TEXT با محدودیت، اجتناب از CHAR(n)

  • زمانی: DATE, TIMESTAMPTZ, INTERVAL

  • UUID: استفاده از UUIDv7 مرتب‌شده بر اساس زمان

بهبود طراحی پایگاه داده با انواع داده مدرن

  • JSON/JSONB برای ذخیره‌سازی سندی

-- Efficient JSONB query
SELECT *
FROM products
WHERE data @> '{"category": "electronics"}';
— Index
CREATE INDEX products_data_gin ON products USING GIN (data);
  • Array Types

CREATE TABLE articles (
id INTEGER PRIMARY KEY,
tags TEXT[],
ratings INTEGER[]
);
SELECT *
FROM articles
WHERE 'postgresql' = ANY(tags);
  • Range Types

CREATE TABLE reservations (
id INTEGER PRIMARY KEY,
room_id INTEGER,
period TSRANGE
);
SELECT *
FROM reservations
WHERE period && ‘[۲۰۲۳-۰۱-۰۱, ۲۰۲۳-۰۱-۰۲)’::TSRANGE;
  • Geometric Types: POINT, LINE, POLYGON, CIRCLE

  • جایگزینی ENUM با جداول Lookup

CREATE TABLE statuses (
name TEXT PRIMARY KEY,
description TEXT
);
CREATE TABLE users (
id INTEGER PRIMARY KEY,
status TEXT REFERENCES statuses(name)
);
  • ذخیره‌سازی شبکه و UUID

CREATE TABLE connections (
id INTEGER PRIMARY KEY,
client_ip INET,
subnet CIDR
);
CREATE TABLE distributed_entities (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
data JSONB
);

بهینه‌سازی ذخیره‌سازی و ایندکسینگ

  • استفاده از الگوریتم‌های فشرده‌سازی برای انواع داده

  • B-tree:
    انواع اسکالر

  • GIN:
    JSONB, arrays, full-text

  • GiST:
    geometric, range

  • BRIN:
    داده‌های مرتب‌شده (timestamps)

-- Validate input before conversion
SELECT pg_input_is_valid('۲۰۲۴-۰۲-۳۰', 'date'); -- false
SELECT pg_input_is_valid('{"valid": "json"}', 'jsonb'); -- true

نتیجه‌گیری

PostgreSQL طیف وسیعی از انواع داده ارائه می‌دهد: عددی، متنی، زمانی، بولی، باینری، مالی، هندسی، متن کامل، ترکیبی، JSON، آرایه و شبکه. موفقیت در PostgreSQL مستلزم درک نه تنها انواع موجود، بلکه نحوه و زمان استفاده صحیح از آن‌ها است. با تسلط بر انتخاب و بهینه‌سازی نوع داده، می‌توانید پایگاه داده‌ای کارآمد، مقیاس‌پذیر و قابل نگهداری بسازید.

پرسش‌های متداول

انواع داده PostgreSQL چیست و چرا مهم است؟

تعیین می‌کند هر ستون چه داده‌ای ذخیره می‌کند و بر صحت داده، بهره‌وری ذخیره‌سازی و عملکرد کوئری اثر می‌گذارد.

نوآوری‌های اخیر:

  • Multirange برای بازه‌های غیر پیوسته

  • JSON/JSONB پیشرفته با JSON_TABLE()

  • انواع عددی گسترده و دقت بالا

  • پشتیبانی از بردار برای AI/ML

انواع داده منسوخ:

  • Removed: abstime, reltime, tinterval

  • Discouraged: MONEY → NUMERIC; SERIAL → identity columns; ENUM → lookup tables

اشتباهات رایج:

  • استفاده از شناور برای داده‌های مالی (به جای NUMERIC)

  • ذخیره رشته با CHAR(n) به جای TEXT + constraint

  • استفاده از TIMESTAMP بدون زمان‌بندی منطقه‌ای (استفاده از TIMESTAMPTZ)

  • اعتماد به SERIAL منسوخ به جای identity columns

پایگاه‌ داده‌ی برداری Qdrant چیست؟
PostgreSQL در برابر MongoDB: کدام‌یک انتخاب مناسب‌تری برای حل معمای پایگاه داده است؟

دیدگاهتان را بنویسید

سبد خرید
علاقه‌مندی‌ها
مشاهدات اخیر
دسته بندی ها