JavaRush /Курси /SQL SELF /Вступ до масивів: що це таке і коли їх використовувати

Вступ до масивів: що це таке і коли їх використовувати

SQL SELF
Рівень 35 , Лекція 0
Відкрита

Ти, скоріш за все, вже не раз чув про масиви. У різних мовах програмування вони означають майже одне й те саме. Але є нюанси.

Масив у PostgreSQL — це тип даних, який дозволяє зберігати набір значень одного типу в одній колонці таблиці. Наче ти записуєш не один запис, а цілу "коробку" даних у клітинку. Це може бути список чисел, рядків, дат або навіть складніших об'єктів.

Якщо говорити абстрактно, то масив можна порівняти з ящиком для інструментів. Замість того, щоб носити цілий набір ключів у руках (кожен ключ як окрема колонка/рядок), ти кладеш їх у зручний чемоданчик (одна колонка, що містить масив).

Два способи створення масивів

У PostgreSQL існує два основних синтаксиси для створення масивів. Це як два різних способи запакувати чемодан — результат однаковий, але підхід відрізняється:

  1. Синтаксис з фігурними дужками {}

Це більш компактний і часто використовуваний спосіб:

-- Масив рядків
'{"яблуко", "банан", "вишня"}'

-- Масив чисел
'{1, 2, 3, 4, 5}'

-- Масив дат
'{"2023-01-01", "2023-01-02", "2023-01-03"}'
  1. Синтаксис з конструктором ARRAY[]

Більш явний і читабельний спосіб:

-- Масив рядків
ARRAY['яблуко', 'банан', 'вишня']

-- Масив чисел
ARRAY[1, 2, 3, 4, 5]

-- Масив дат
ARRAY['2023-01-01'::DATE, '2023-01-02'::DATE, '2023-01-03'::DATE]
Важливо:

обидва синтаксиси працюють однаково! Вибір залежить від твоїх вподобань і контексту використання. Це приблизно як вибір між for і while циклами в інших мовах програмування — функціонально вони еквівалентні, але один може бути зручнішим у конкретній ситуації.

Коли використовувати масиви

Масиви — це суперсила PostgreSQL, яка дозволяє вирішувати задачі, де незручно створювати додаткові таблиці чи колонки. Вони ідеально підходять для:

  1. Зберігання списків, тегів або категорій

Уяви, що ми створюємо базу даних для інтернет-магазину. У кожного товару може бути кілька тегів, наприклад:

  • Для футболки це можуть бути теги: ["одяг", "чоловічий", "спорт"].
  • Для навушників теги: ["електроніка", "бездротові", "гаджети"].

З масивами ти можеш зберігати ці теги в одній колонці без необхідності створювати окрему таблицю для тегів, економлячи місце і спрощуючи структуру даних.

-- Таблиця товарів з масивом тегів
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    tags TEXT[]  -- Масив рядків для тегів
);

-- Приклад даних
INSERT INTO products (name, tags)
VALUES
    ('Футболка', ARRAY['одяг', 'чоловічий', 'спорт']),
    ('Навушники', ARRAY['електроніка', 'бездротові', 'гаджети']);
  1. Зберігання списку замовлень

Якщо ти працюєш із замовленнями, масив може допомогти зберегти список товарів в одному замовленні:

-- Таблиця замовлень з масивом товарних 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]);

Тепер кожне замовлення має список продуктів, які були куплені. Зручно, правда?

  1. Простих конфігурацій і налаштувань

    Коли треба зберігати прості списки налаштувань або вподобань користувача:

    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

  1. Тип даних всередині масиву має бути однорідним. PostgreSQL не дозволяє змішувати, наприклад, рядки і числа в одному масиві.
-- Працює
ARRAY[1, 2, 3]  -- Масив чисел

-- Помилка: змішування рядків і чисел
ARRAY['яблуко', 42, 'вишня']
  1. Індексація елементів масиву починається з 1, а не з 0. Не забудь про це, якщо ти звик до мов програмування, де індексація починається з 0 (Python, JavaScript, C++ та ін.).
  2. Підтримка NULL: масиви можуть містити NULL значення
  3. Багатовимірність: PostgreSQL підтримує багатовимірні масиви
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ