Я работаю над приложением, которое позволит пользователям загружать медиафайлы и организовывать их медиа в папки. Пользователь может определить «тип» создаваемой папки: папка, видео, изображения, документы и т. Д.MySQL - Нормализованная или денормализованная файловая система?
Приложение отобразит содержимое любой папки по-разному в зависимости от ее типа; папка Video отобразит видеоплеер с плейлистом, папка с изображениями отобразит галерею и т. д.
Было бы лучше создать отдельные таблицы для всех типов папок или создать одну большую таблицу под названием FOLDERS с для присвоения типа?
Реальный носитель обрабатывается собственной таблицей MEDIA, а затем связан с папкой media_ID.
Вкратце: как ОС справляется с этим? Есть ли одна главная «таблица», называемая FOLDERS, а затем различные файлы связаны с папкой с помощью file_ID?
EDIT: Для того, чтобы уточнить, вот как «единичные папки таблицы» подход сломается:
FOLDERS
...................
id
user_ID
parent_ID
type
date
MEDIA
...................
id
type
file
date
FOLDERS_link_MEDIA
...................
id
folder_ID
media_ID
Таким образом, когда пользователь добавляет MEDIA к папке создается строка в таблице FOLDERS_link_MEDIA подключения два.
Альтернативой, как я вижу, было бы иметь несколько таблиц «папок» FOLDERS_video, FOLDERS_audio, FOLDERS_images, FOLDERS_documents и т. Д. Затем прилагается таблица ссылок для каждого типа папки; Таблица FOLDERS_video_link_MEDIA, FOLDERS_images_link_MEDIA и т. Д.
Кроме того, фактические данные файлов НЕ будут храниться в таблице MEDIA, в столбце «файл» просто сохраняется URL-адрес, указывающий, где хранится файл на AWS S3.
Спасибо.
EDIT 2: SQL
И вот как я бы идти о прохождении таблицу (ы). Если бы я вырывать содержимое папки я бы сначала определить, есть ли дочерние папки, которые принадлежат к текущей папке:
SELECT id FROM FOLDERS WHERE parent_ID='$this_folder_ID';
И тогда я бы отобразить эти папки для пользователя (папки на вершине!). И затем я приступаю к получению любого содержания СМИ:
SELECT media_ID FROM FOLDERS_link_MEDIA WHERE folder_ID='$this_folder_ID';
Это зависит от того, какие данные вы собираетесь хранить в базе данных. Какие данные вы собираетесь хранить в базе данных? –
Привет, Марк. Данные довольно простые для любой заданной папки: id, parent_ID, title, date. Я отредактировал выше, чтобы проиллюстрировать. – AJB
Ваша предлагаемая структура выглядит так, как есть, с одной очевидной проблемой: MySQL не поддерживает рекурсивные CTE, поэтому один запрос не сможет пересечь всю иерархию файлов, предполагая, что вы можете иметь папки в папках. (Выделенные таблицы для каждого типа папок также не разрешали бы эту проблему.) Вы можете посмотреть в http://en.wikipedia.org/wiki/Nested_set_model. –