Өгөгдлийн төрлүүд
Хүснэгт үүсгэхдээ баганын өгөгдлийн төрлийг зөв сонгох нь маш чухал. Төрлийг буруу сонговол хадгалалтын зай хэтрэх, хурд удаашрах, буруу утга орох зэрэг асуудал гарна. 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 хэзээ ч ашиглахгүй, учир нь дугуйлалтын алдаа гардаг.
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 хурд, хадгалалтын хувьд ялгаагүй.
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 хангалттай.
CREATE TABLE events (
id SERIAL PRIMARY KEY,
нэр TEXT NOT NULL,
эхлэх_цаг TIMESTAMPTZ NOT NULL,
дуусах_цаг TIMESTAMPTZ
);
Одоогийн цагийг авах:
SELECT NOW(); -- timestamptz буцаана
SELECT CURRENT_DATE; -- зөвхөн огноо
SELECT CURRENT_TIME; -- зөвхөн цаг
Boolean төрөл
Зөвхөн TRUE эсвэл FALSE утгатай:
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 илүү дээр:
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;
Өгөгдлийн төрөл сонгох зөвлөмж
Практик байдлаар ихэнх хүснэгтэд дараах загвар ашиглагддаг:
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()
);
id-д BIGSERIAL ашиглах нь SERIAL-аас илүү найдвартай — их хэмжээний өгөгдлийн сан ч дутагдахгүй.
Дараагийн хичээлд:
INSERT INTO командаар хүснэгтэд бодит мэдээлэл оруулж эхэлнэ.