PostgreSQL / Өгөгдлийн төрлүүд

Өгөгдлийн төрлүүд

Хүснэгт үүсгэхдээ баганын өгөгдлийн төрлийг зөв сонгох нь маш чухал. Төрлийг буруу сонговол хадгалалтын зай хэтрэх, хурд удаашрах, буруу утга орох зэрэг асуудал гарна. PostgreSQL нь олон өгөгдлийн төрлийг дэмждэг — гол төрлүүдийг энэ хичээлд сурна.

Тоон төрлүүд

PostgreSQL-д бүхэл тооны хэд хэдэн төрөл байдаг:

| Төрөл | Хэмжээ | Хүрээ | |-------|--------|-------| | SMALLINT | 2 байт | -32,768 — 32,767 | | INTEGER | 4 байт | -2.1 тэрбум — 2.1 тэрбум | | BIGINT | 8 байт | маш том тоо | | SERIAL | 4 байт | автоматаар нэмэгдэх (1, 2, 3...) | | BIGSERIAL | 8 байт | том автоматаар нэмэгдэх |

Бутархай тооны төрлүүд:

| Төрөл | Тайлбар | |-------|---------| | NUMERIC(p, s) | Яг нарийн, санхүүд ашиглана | | REAL | 4 байт, ойролцоо | | DOUBLE PRECISION | 8 байт, ойролцоо |

Мөнгөн дүн хадгалахад NUMERIC ашиглана — REAL хэзээ ч ашиглахгүй, учир нь дугуйлалтын алдаа гардаг.

sql
CREATE TABLE products (
    id        SERIAL PRIMARY KEY,
    нэр       TEXT NOT NULL,
    үнэ       NUMERIC(10, 2),  -- 99999999.99 хүртэл
    тоо       INTEGER DEFAULT 0
);

Текстийн төрлүүд

| Төрөл | Тайлбар | |-------|---------| | TEXT | Хязгааргүй урттай текст | | VARCHAR(n) | Хамгийн ихдээ n тэмдэгт | | CHAR(n) | Яг n тэмдэгт (дутуу бол зайгаар дүүргэнэ) |

PostgreSQL-д ихэнх тохиолдолд TEXT ашиглах нь хамгийн зохистой. VARCHAR(n) нь MySQL-д илүү хэрэглэгддэг байсан уламжлалаас үлдсэн — PostgreSQL-д TEXT ба VARCHAR хурд, хадгалалтын хувьд ялгаагүй.

sql
CREATE TABLE articles (
    id       SERIAL PRIMARY KEY,
    гарчиг   TEXT NOT NULL,
    slug     VARCHAR(200) UNIQUE NOT NULL,
    агуулга  TEXT
);

Огноо ба цагийн төрлүүд

| Төрөл | Жишээ | |-------|-------| | DATE | 2024-03-15 | | TIME | 14:30:00 | | TIMESTAMP | 2024-03-15 14:30:00 | | TIMESTAMPTZ | 2024-03-15 14:30:00+08 (timezone-тэй) | | INTERVAL | 3 days, 2 hours |

Цагийн бүс (timezone) чухал системд TIMESTAMPTZ ашиглана. Суурь мэдлэгт TIMESTAMP хангалттай.

sql
CREATE TABLE events (
    id         SERIAL PRIMARY KEY,
    нэр        TEXT NOT NULL,
    эхлэх_цаг TIMESTAMPTZ NOT NULL,
    дуусах_цаг TIMESTAMPTZ
);

Одоогийн цагийг авах:

sql
SELECT NOW();              -- timestamptz буцаана
SELECT CURRENT_DATE;       -- зөвхөн огноо
SELECT CURRENT_TIME;       -- зөвхөн цаг

Boolean төрөл

Зөвхөн TRUE эсвэл FALSE утгатай:

sql
CREATE TABLE users (
    id         SERIAL PRIMARY KEY,
    имэйл      TEXT NOT NULL,
    идэвхтэй   BOOLEAN DEFAULT TRUE,
    verified   BOOLEAN DEFAULT FALSE
);

TRUE, FALSE-ийн оронд 'yes'/'no', 'on'/'off', 1/0 бичиж болно — PostgreSQL аль аль нь ойлгоно.

JSON ба JSONB

PostgreSQL нь JSON мэдээлэл хадгалахыг дэмждэг — энэ нь маш хүчирхэг онцлог юм.

| Төрөл | Тайлбар | |-------|---------| | JSON | JSON-г текст хэлбэрээр хадгална | | JSONB | JSON-г binary хэлбэрээр хадгална (хурдан, индексжих боломжтой) |

Ихэнх тохиолдолд JSONB илүү дээр:

sql
CREATE TABLE user_settings (
    user_id  INTEGER PRIMARY KEY,
    config   JSONB DEFAULT '{}'
);

-- Оруулах
INSERT INTO user_settings (user_id, config)
VALUES (1, '{"theme": "dark", "language": "mn", "notifications": true}');

-- JSON дотроос утга авах
SELECT config->>'theme' FROM user_settings WHERE user_id = 1;

Өгөгдлийн төрөл сонгох зөвлөмж

Практик байдлаар ихэнх хүснэгтэд дараах загвар ашиглагддаг:

sql
CREATE TABLE example (
    -- Давтагдашгүй ID
    id         BIGSERIAL PRIMARY KEY,

    -- Текст утгууд
    нэр        TEXT NOT NULL,
    тайлбар    TEXT,

    -- Тоон утгууд
    тоо        INTEGER DEFAULT 0,
    үнэ        NUMERIC(12, 2),

    -- Үнэн/худал
    идэвхтэй   BOOLEAN DEFAULT TRUE,

    -- Цаг
    үүсгэсэн   TIMESTAMPTZ DEFAULT NOW(),
    шинэчлэгдсэн TIMESTAMPTZ DEFAULT NOW()
);

idBIGSERIAL ашиглах нь SERIAL-аас илүү найдвартай — их хэмжээний өгөгдлийн сан ч дутагдахгүй.

Дараагийн хичээлд:

INSERT INTO командаар хүснэгтэд бодит мэдээлэл оруулж эхэлнэ.