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 поддерживает многомерные массивы
2
Задача
SQL SELF, 35 уровень, 0 лекция
Недоступна
Создание таблицы с массивами
Создание таблицы с массивами
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ