Загрузка данных
Лабораторная работа «Динамические столбцы»
Теоретическая часть.
Динамические столбцы — это уникальная функция MariaDB, позволяющая хранить
разный набор "виртуальных столбцов" (атрибутов) для каждой строки таблицы. Данные
хранятся в специальном бинарном формате внутри одного столбца типа BLOB.
Это решение идеально подходит для случаев, когда сущности имеют множество
разнообразных и не всегда заранее известных атрибутов. Например, для интернетмагазина, где у ноутбука есть процессор и объем оперативной памяти, а у футболки —
размер и цвет.
Ключевые особенности и преимущества
• Гибкость схемы: Возможность добавлять или удалять атрибуты для отдельных записей
без изменения структуры таблицы.
• Экономия места: В отличие от создания множества обычных колонок, большинство из
которых будут пустыми (NULL), динамические столбцы хранят только заданные
атрибуты.
Важные ограничения и нюансы:
• Отсутствие прямой индексации: Поскольку данные хранятся внутри BLOB, на них
нельзя напрямую создать индекс. Поиск по значению динамического атрибута
потребует полного сканирования таблицы.
• Явное указание типов: При извлечении данных с помощью COLUMN_GET необходимо
явно указывать ожидаемый тип данных (AS INT, AS CHAR(10), AS DECIMAL(5,2) и
т.д.). Ошибка в типе приведет к NULL.
• Бинарный формат: Содержимое BLOB с динамическими столбцами нечитаемо для
человека без использования специальных функций (COLUMN_JSON).
• Virtual Columns для индексации: Для ускорения поиска по часто используемым
атрибутам их можно "извлечь" в виртуальные (VIRTUAL) (Данные не занимают место
на диске, а вычисляются по формуле) или постоянные (PERSISTENT) (Данные хранятся
на диске физически) столбцы и проиндексировать уже их.
Основные функции:
1) COLUMN_CREATE(column_name, value [as type], ...) - Создает новый BLOB с набором
динамических атрибутов. Используется при вставке INSERT
2) COLUMN_ADD(dyncol_blob, column_name, value [as type], ...) - Добавляет новые
атрибуты или обновляет значения существующих в уже имеющемся BLOB.
Используется в UPDATE.
3) COLUMN_GET(dyncol_blob, column_name as type) - Извлекает значение конкретного
атрибута из BLOB. Обязательно требует указания типа данных через AS.
4) COLUMN_DELETE(dyncol_blob, column_name, ...) - Удаляет один или несколько
атрибутов из BLOB.
5) COLUMN_EXISTS(dyncol_blob, column_name) - Проверяет, существует ли атрибут с
заданным именем.
6) COLUMN_LIST(dyncol_blob) - Возвращает строку с перечислением всех атрибутов,
содержащихся в BLOB.
7) COLUMN_JSON(dyncol_blob) - Преобразует содержимое BLOB в JSON-объект для
удобного просмотра.
Практическая часть:
1. Создание БД и подключение к ней:
CREATE DATABASE IF NOT EXISTS axaxaxaxaxaxaxaxaxa;
USE axaxaxaxaxaxaxaxaxa;
2. Создание таблиц:
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL, -- Общий атрибут для всех товаров
attributes BLOB -- Хранилище для динамических столбцов
);
3. Заполнение данными:
1) Первый товар
INSERT INTO products (name, attributes)
VALUES ('MariaDB T-Shirt', COLUMN_CREATE('color', 'blue', 'size', 'XL'));
2) Второй товар
INSERT INTO products (name, attributes)
VALUES ('Mastering MariaDB', COLUMN_CREATE('author', 'Federico Razzoli', 'pages',
450, 'language', 'English'));
3) Вставка третьего товара
INSERT INTO products (name, attributes)
VALUES ('ThinkPad X1', COLUMN_CREATE('color', 'black', 'ram_gb', 16, 'screen_size',
14.0 AS DECIMAL(3,1)));
4. Извлечение данных с помощью COLUMN_GET
1) Получим название и цвет для всех товаров.
SELECT name, COLUMN_GET(attributes, 'color' AS CHAR) AS color FROM products;
2) Найдем все товары, у которых обьем оперативной памяти больше или равен 16ГБ.
SELECT name, COLUMN_GET(attributes, 'ram_gb' AS INT) AS ram
FROM products
WHERE COLUMN_GET(attributes, 'ram_gb' AS INT) >= 16;
3) При помощи COLUMN_EXISTS выведем список товаров, у которых есть атрибут size
SELECT name FROM products WHERE COLUMN_EXISTS(attributes, 'size');
5. Добавление атрибутов.
1) добавим атрибут price для одной из строк
UPDATE products
SET attributes = COLUMN_ADD(attributes, 'price', 1500.00 AS DECIMAL(8,2))
WHERE name = 'ThinkPad X1';
2) Удалим атрибут Language у книги
UPDATE products
SET attributes = COLUMN_DELETE(attributes, 'language')
WHERE name = 'Mastering MariaDB';
3) Проверка изменений, выведем актуальный состав атрибутов
SELECT name, COLUMN_JSON(attributes) AS json_view FROM products;
SELECT name, COLUMN_LIST(attributes) AS list_view FROM products;
6. Работа с виртуальными столбцами
1. Создадим новую таблицу, где для атрибута size будет создан виртуальный столбец с
индексом
-- Создаем новую таблицу с виртуальным столбцом и индексом
CREATE TABLE optimized_products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
attributes BLOB,
-- Виртуальный столбец, извлекающий значение 'size'
product_size VARCHAR(50) AS (COLUMN_GET(attributes, 'size' AS CHAR))
VIRTUAL,
-- Индекс для быстрого поиска
INDEX idx_size (product_size)
);
-- Переносим данные из старой таблицы
INSERT INTO optimized_products (name, attributes) SELECT name, attributes FROM
products;
2. Теперь поиск по размеру можно выполнять по индексу.
SELECT name FROM optimized_products WHERE product_size = 'XL';
Задание.
1. Создайте базу данных со столбцами Name (varchar), Category (varchar), Specs (blob)
2. Заполните БД следующими данными:
Name Category Specs
Intel Core i7-12700 CPU ‘Cores’ – 12
‘Threads’ – 20
‘Clock’ – 3.6
‘TDP’ – 125
NVIDIA GeForce RTX 4070 GPU 'vram_gb' - 12
'memory_type' - GDDR6X
'tdp' - 200
Corsair Vengeance LPX RAM 'capacity_gb' - 32
'speed_mhz' - 3200
'type' - DDR4
3. Извлечение данных при помощи Column_get
3.1 Выведите название, категорию, и значение атрибута tdp
3.2 Выведите данные о названии, категории у продуктов, чей объем видеопамяти
больше или равен 12
3.3 Выведите список компонентов, у которых задан атрибут base_clock
4. Модификация атрибутов
4.1 Добавьте атрибут price для процессора
4.2 Удалите атрибут type у оперативной памяти
4.3 Измените параметр tdp у видеокарты
5. Добавьте виртуальный столбец, который будет извлекать данные о tdp