70 lines
5.3 KiB
MySQL
70 lines
5.3 KiB
MySQL
|
|
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 = 'Привязка набора медиа к помещениям (одно помещение = один набор)';
|