Основи баз даних
VTFK • 2025
Лекція 4: Реляційна модель
Фокус: як вибрати тип для колонки
Категорія значення в колонці, яка визначає допустимі операції, формати та обсяг пам'яті.
Аналогія: Як контейнер: INT вмішує число, VARCHAR вмішує текст з обмеженням довжини
Головні групи
| Тип | Розмір | Діапазон | Використання |
|---|---|---|---|
| TINYINT | 1 B | 0–255 | флаги |
| INT/INTEGER | 4 B | ±2.1B | ID, кількості |
| BIGINT | 8 B | ±9.2e18 | великі суми |
| DECIMAL(p,s) | змінна | точно | гроші, ставки |
| FLOAT/DOUBLE | 4/8 B | наблиз. | вимірювання, AI |
| Тип | Розмір | Пошук | Сортування |
|---|---|---|---|
| CHAR(10) | 10 B завжди | швидкий | ОК |
| VARCHAR(255) | до 255 B | нормальний | ОК |
| TEXT | необмежено | повільний | потребує індексу |
Для часових даних
Різні колонки, різні типи
CREATE TABLE products (
id BIGSERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description TEXT,
price DECIMAL(10, 2),
quantity INT DEFAULT 0,
is_available BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT now(),
last_updated DATE
);
DECIMAL зберігає точно, избігаючи помилок округлення.
VARCHAR(65535) або просто VARCHAR губить оптимізацію
CREATE TABLE users (email VARCHAR); -- невизначений розмір
БД не може правильно розподілити сторінки
CREATE TABLE users (email VARCHAR(255) NOT NULL UNIQUE);
Явна довжина дозволяє оптимізувати індекси
Як систематично вибрати
Число, текст, час, логіка?
INT, BIGINT, DECIMAL?
VARCHAR(n) чи TEXT?
FLOAT чи DECIMAL?
NULL, значення або now()?
Окремі типи
З урахуванням типів
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255),
name VARCHAR(100),
birth_date DATE,
created_at TIMESTAMP DEFAULT now()
);
CREATE TABLE products (
id BIGSERIAL PRIMARY KEY,
name VARCHAR(200) NOT NULL,
price DECIMAL(10,2) NOT NULL CHECK (price > 0),
stock INT DEFAULT 0
);
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id),
product_id BIGINT REFERENCES products(id),
quantity INT NOT NULL CHECK (quantity > 0),
created_at TIMESTAMP DEFAULT now(),
status VARCHAR(20) DEFAULT 'pending'
);
Далі — базові SELECT запити
Лекція 6: Вступ до SQL
Дякую за увагу! 💾