#sql #database #database-design #amazon-s3
#sql #База данных #database-design #amazon-s3
Вопрос:
Я создаю веб-приложение с возможностью загрузки некоторых статических данных и нуждаюсь в нескольких советах.
Вначале я хотел бы использовать внутренний диск, однако, если объем данных будет расти, я планирую использовать Amazon S3 в качестве хранилища файлов, я предполагаю, что мне понадобится несколько контейнеров для хранения файлов — возможно, я воспользуюсь некоторыми другими поставщиками CDN.
Кроме того, у меня есть следующая структура базы данных:
CREATE TABLE IF NOT EXISTS `storage_servers` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(45) NOT NULL ,
`ip` INT(20) NOT NULL ,
`access_url` LONGTEXT NULL DEFAULT NULL , // storing server access URL
`username` LONGTEXT NULL DEFAULT NULL , //storing server username
`password` LONGTEXT NULL DEFAULT NULL , // storing server password
`token` LONGTEXT NULL DEFAULT NULL , // storing server access token, if any
PRIMARY KEY (`id`) )
ENGINE = InnoDB;'
CREATE TABLE IF NOT EXISTS .`storage_servers_files` (
`server_id` INT NOT NULL ,
`file_id` BIGINT(25) NOT NULL ,
INDEX `fk_servers_files_1` (`file_id` ASC) ,
INDEX `fk_servers_files_2` (`server_id` ASC) ,
CONSTRAINT `fk_servers_files_1`
FOREIGN KEY (`file_id` )
REFERENCES `files` (`id` )
ON DELETE CASCADE
ON UPDATE NO ACTION,
CONSTRAINT `fk_servers_files_2`
FOREIGN KEY (`server_id` )
REFERENCES `storage_servers` (`id` )
ON DELETE CASCADE
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Однако я не пользователь, если мой подход справедлив в этом вопросе.
Насколько я знаю, мне нужно было бы создать поддомены для каждого отдельного контейнера хранения (cdn1.example.com , cdn2.example.com … cdn15.example.com ). Как бы вы разработали таблицы для этого?
Моей другой мыслью было полностью удалить storage_servers
и storage_servers_files
таблицы и просто … создать поле server
в files
таблице, а затем сохранить имя поддомена. Затем конфигурация должна быть сохранена в файле конфигурации.
Не слишком ли это продумано?
Ответ №1:
Пара предложений —
С S3 вам не нужно несколько контейнеров или сегментов только для увеличения размера. Корзины S3 содержат неограниченное количество объектов (под неограниченным я подразумеваю, что у вас, вероятно, закончатся элементы для хранения или деньги для оплаты до того, как в AWS закончится место). Причиной создания нескольких сегментов является различное пространство приложений или безопасность. Используя AWS IAM, вы можете ограничить доступ к корзинам для определенных приложений или пользователей.
В этом случае, если у вас есть только одно приложение с одним блоком, вы можете сохранить свои настройки безопасности в конфигурации.
Кроме того, по моему опыту, со временем многие люди могут получить некоторый доступ к вашей базе данных (разработчики, аналитики, менеджеры проектов, администраторы баз данных и т.д.). Доступ к системе управления версиями и серверам, как правило, более ограничен, и изменения отслеживаются лучше. По этой причине я предпочитаю хранить пароли и токены вне базы данных, где это возможно.
Если вы в будущем перейдете на CDN, вам все равно понадобится исходный код для ваших файлов, из которого можно извлечь CDN.
Не уверен, для чего предназначен ваш столбец ip, но вы можете захотеть использовать dNSName вместо ip, поскольку ip-адрес может сильно измениться (особенно с сервисами AWS).
Ответ №2:
Нет, это не перепроектировано. Похоже, ваш дизайн мне подходит.