CREATE TABLE `complex_house_media` ( `id` INT NOT NULL AUTO_INCREMENT COMMENT 'Уникальный идентификатор медиаматериала', `complex_house_id` BIGINT UNSIGNED NOT NULL COMMENT 'FK → complex_houses.id. Ссылка на дом, к которому загружен файл. Медиаматериал всегда принадлежит одному дому.', `file_path` VARCHAR(512) NOT NULL COMMENT 'Относительный путь к оригинальному файлу в S3 хранилище. Генерируется при загрузке (UUID + расширение).', `original_name` VARCHAR(255) NOT NULL COMMENT 'Имя файла, которое пользователь видел при загрузке (напр. render_3k_east.jpg). Используется для отображения в таблице.', `file_size` INT UNSIGNED NOT NULL COMMENT 'Размер файла в байтах. Для валидации (макс. 10 МБ) и отображения в UI.', `thumbnail_path` VARCHAR(512) DEFAULT NULL COMMENT 'Относительный путь к миниатюре (300×300 px). Генерируется асинхронно после загрузки.', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), INDEX `idx_complex_house_id` (`complex_house_id`), CONSTRAINT `fk_complex_house_media_house` FOREIGN KEY (`complex_house_id`) REFERENCES `complex_houses` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci; CREATE TABLE `complex_house_media_set` ( `id` INT NOT NULL AUTO_INCREMENT COMMENT 'Уникальный идентификатор набора', `complex_house_id` BIGINT UNSIGNED NOT NULL COMMENT 'FK → complex_houses.id. Набор принадлежит дому', `name` VARCHAR(255) NOT NULL COMMENT 'Название набора (например «Для студий восток», «Для 2К»)', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Дата создания набора', `color` VARCHAR(7) NOT NULL DEFAULT '#2196F3' COMMENT 'Цвет набора в формате HEX (например, #2196F3). Используется для отображения на плане.', PRIMARY KEY (`id`), INDEX `idx_complex_house_id` (`complex_house_id`), CONSTRAINT `fk_complex_house_media_set_house` FOREIGN KEY (`complex_house_id`) REFERENCES `complex_houses` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'Наборы (медиа-сеты) — именованные упорядоченные подборки файлов, привязываемые к помещениям'; CREATE TABLE `complex_house_media_set_item` ( `id` INT NOT NULL AUTO_INCREMENT COMMENT 'Первичный ключ', `set_id` INT NOT NULL COMMENT 'ID набора (FK → complex_house_media_sets.id)', `media_id` INT NOT NULL COMMENT 'ID медиафайла (FK → complex_house_media.id)', `sort_order` SMALLINT NOT NULL DEFAULT 0 COMMENT 'Позиция файла в наборе (0, 1, 2...)', PRIMARY KEY (`id`), -- Индекс для быстрого получения всех элементов набора INDEX `idx_set_id` (`set_id`), -- Индекс для поиска, в каких наборах используется файл INDEX `idx_media_id` (`media_id`), -- Один и тот же файл не может повторяться в одном наборе UNIQUE KEY `uniq_set_media` (`set_id`, `media_id`), -- Связь с таблицей наборов (при удалении набора — удаляются элементы) CONSTRAINT `fk_set_item_set` FOREIGN KEY (`set_id`) REFERENCES `complex_house_media_set` (`id`) ON DELETE CASCADE, -- Связь с таблицей медиа (при удалении файла — удаляется из всех наборов) CONSTRAINT `fk_set_item_media` FOREIGN KEY (`media_id`) REFERENCES `complex_house_media`(`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Состав набора: какие файлы входят и в каком порядке'; CREATE TABLE `complex_house_media_set_room` ( `id` INT NOT NULL AUTO_INCREMENT COMMENT 'Первичный ключ', `set_id` INT NOT NULL COMMENT 'ID набора (FK → complex_house_media_set.id)', `complex_room_id` BIGINT UNSIGNED NOT NULL COMMENT 'ID помещения (FK → complex_rooms.id). Уникально — одно помещение = один набор', PRIMARY KEY (`id`), INDEX `idx_set_id` (`set_id`), UNIQUE KEY `uniq_room` (`complex_room_id`), CONSTRAINT `fk_set_room_set` FOREIGN KEY (`set_id`) REFERENCES `complex_house_media_set` (`id`) ON DELETE CASCADE, CONSTRAINT `fk_set_room_room` FOREIGN KEY (`complex_room_id`) REFERENCES `complex_rooms` (`id`) ON DELETE CASCADE ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = 'Привязка набора медиа к помещениям (одно помещение = один набор)';