Ти, скоріш за все, вже не раз чув про масиви. У різних мовах програмування вони означають майже одне й те саме. Але є нюанси.
Масив у PostgreSQL — це тип даних, який дозволяє зберігати набір значень одного типу в одній колонці таблиці. Наче ти записуєш не один запис, а цілу "коробку" даних у клітинку. Це може бути список чисел, рядків, дат або навіть складніших об'єктів.
Якщо говорити абстрактно, то масив можна порівняти з ящиком для інструментів. Замість того, щоб носити цілий набір ключів у руках (кожен ключ як окрема колонка/рядок), ти кладеш їх у зручний чемоданчик (одна колонка, що містить масив).
Два способи створення масивів
У PostgreSQL існує два основних синтаксиси для створення масивів. Це як два різних способи запакувати чемодан — результат однаковий, але підхід відрізняється:
- Синтаксис з фігурними дужками
{}
Це більш компактний і часто використовуваний спосіб:
-- Масив рядків
'{"яблуко", "банан", "вишня"}'
-- Масив чисел
'{1, 2, 3, 4, 5}'
-- Масив дат
'{"2023-01-01", "2023-01-02", "2023-01-03"}'
- Синтаксис з конструктором
ARRAY[]
Більш явний і читабельний спосіб:
-- Масив рядків
ARRAY['яблуко', 'банан', 'вишня']
-- Масив чисел
ARRAY[1, 2, 3, 4, 5]
-- Масив дат
ARRAY['2023-01-01'::DATE, '2023-01-02'::DATE, '2023-01-03'::DATE]
обидва синтаксиси працюють однаково! Вибір залежить від твоїх вподобань і контексту використання. Це приблизно як вибір між for і while циклами в інших мовах програмування — функціонально вони еквівалентні, але один може бути зручнішим у конкретній ситуації.
Коли використовувати масиви
Масиви — це суперсила PostgreSQL, яка дозволяє вирішувати задачі, де незручно створювати додаткові таблиці чи колонки. Вони ідеально підходять для:
- Зберігання списків, тегів або категорій
Уяви, що ми створюємо базу даних для інтернет-магазину. У кожного товару може бути кілька тегів, наприклад:
- Для футболки це можуть бути теги:
["одяг", "чоловічий", "спорт"]. - Для навушників теги:
["електроніка", "бездротові", "гаджети"].
З масивами ти можеш зберігати ці теги в одній колонці без необхідності створювати окрему таблицю для тегів, економлячи місце і спрощуючи структуру даних.
-- Таблиця товарів з масивом тегів
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
tags TEXT[] -- Масив рядків для тегів
);
-- Приклад даних
INSERT INTO products (name, tags)
VALUES
('Футболка', ARRAY['одяг', 'чоловічий', 'спорт']),
('Навушники', ARRAY['електроніка', 'бездротові', 'гаджети']);
- Зберігання списку замовлень
Якщо ти працюєш із замовленнями, масив може допомогти зберегти список товарів в одному замовленні:
-- Таблиця замовлень з масивом товарних ID
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_name TEXT,
product_ids INTEGER[] -- Масив ідентифікаторів продуктів
);
-- Приклад даних
INSERT INTO orders (customer_name, product_ids)
VALUES
('Анна', ARRAY[1, 2, 3]),
('Отто', ARRAY[4, 5]);
Тепер кожне замовлення має список продуктів, які були куплені. Зручно, правда?
Простих конфігурацій і налаштувань
Коли треба зберігати прості списки налаштувань або вподобань користувача:
CREATE TABLE user_preferences ( user_id INTEGER PRIMARY KEY, notification_types TEXT[], allowed_days INTEGER[] -- дні тижня: 1-7 );
Порівняння масивів з іншими типами даних
Тут важливо розуміти, що масиви — це просто ще один інструмент у арсеналі PostgreSQL, який підходить не для всіх задач. Наприклад, альтернативою масивам може бути використання таблиці зв'язків (зв'язок "багато до багатьох") або використання типу даних JSON/JSONB.
Масиви vs JSONB
Масиви зручні, коли ти точно знаєш, що будеш зберігати кілька значень одного типу. Вони простіші, швидші і займають менше місця.
JSONB підходить для складніших структур, наприклад, якщо треба зберігати об'єкти з гнучкою структурою. Але JSONB може бути складнішим у обробці.
Приклад масиву і JSONB для одного й того ж набору даних:
-- Масив
ARRAY['одяг', 'чоловічий', 'спорт']
-- JSONB
'["одяг", "чоловічий", "спорт"]'::JSONB
Якщо тобі часто треба робити такі дії, як сортування, фільтрація чи індексування, масиви будуть кращим вибором.
Приклад використання масивів у реальних задачах
Розглянемо ситуацію: ти розробляєш застосунок для обліку відвідуваності в університеті. У кожної лекції є список студентів, які її відвідували, але нам не треба створювати окрему таблицю для зв'язку студентів з лекціями. Замість цього можна використати масиви:
-- Таблиця лекцій з масивом студентів
CREATE TABLE lectures (
id SERIAL PRIMARY KEY,
topic TEXT NOT NULL,
students INTEGER[] -- Масив ідентифікаторів студентів
);
-- Приклад даних
INSERT INTO lectures (topic, students)
VALUES
('Бази даних', ARRAY[101, 102, 103]),
('Алгоритми', ARRAY[104, 105]);
Тепер можна легко отримати список студентів для будь-якої лекції, а також додати чи видалити студента з масиву.
Важливі моменти при використанні масивів у PostgreSQL
- Тип даних всередині масиву має бути однорідним. PostgreSQL не дозволяє змішувати, наприклад, рядки і числа в одному масиві.
-- Працює
ARRAY[1, 2, 3] -- Масив чисел
-- Помилка: змішування рядків і чисел
ARRAY['яблуко', 42, 'вишня']
- Індексація елементів масиву починається з 1, а не з 0. Не забудь про це, якщо ти звик до мов програмування, де індексація починається з 0 (Python, JavaScript, C++ та ін.).
- Підтримка NULL: масиви можуть містити NULL значення
- Багатовимірність: PostgreSQL підтримує багатовимірні масиви
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ