Когда файл это просто файл?

Итак, вы пишете веб-приложение, и у вас есть несколько областей сайта, куда пользователь может загружать файлы. Мой основной метод работы для этого - хранить фактический файл на сервере и иметь таблицу базы данных, которая соединяет сохраненное имя файла с записью, к которой он относится.

У меня такой вопрос: должна ли быть отдельная таблица для каждого «типа» файла? Кроме того, файлы должны храниться в связанных с контекстом местах на сервере, или все вместе?

Некоторые примеры: фотографии профиля пользователя, резюме заявления о приеме на работу, соответствующие документы на страницах CMS и т. Д.

20.08.2008 10:38:45
4 ОТВЕТА
РЕШЕНИЕ

В вашем примере есть аргумент для двух таблиц, поскольку у вас есть файлы, которые можно связать с двумя разными вещами.

  • Резюме, фотографии связаны с пользователем.
  • вложения связаны со страницей CMS.

Если вы поместите их в одну таблицу (и вы хотите, чтобы пользователи могли иметь более одной фотографии или резюме), вам понадобятся две таблицы ссылок, чтобы связать файлы-> users и files-> cms_pages. Возможно, это подразумевает связь HABTM, которая не является правильной и допускает противоречивые данные.

Подход, основанный на двух таблицах, немного чище и позволяет связывать файлы только с правильным типом сущности с простым отношением ownTo.

Но я не думаю, что есть какой-либо «правильный» ответ на этот вопрос, если только вам не нужно хранить разные типы метаданных для разных типов файлов.

Также убедитесь, что вы сохранили или сможете рассчитать mimetype для каждого файла, чтобы он мог корректно передаваться обратно в браузер с правильными заголовками HTTP.

3
8.10.2015 00:52:19

Исходя из того, что вы сказали, я бы просто хранил файлы со случайными (UUID или что-то) именами файлов в одном месте. Тогда у меня будет таблица «вложений» или что-то, содержащее ссылки на все ваши внешние файлы. Эта таблица также будет содержать метаданные для этого файла, так что это за тип файла (рисунок, резюме и т. Д.) И так далее.

Может быть жесткое ограничение на количество файлов в одном каталоге, в зависимости от того, какую FS вы используете.

2
20.08.2008 10:46:10

Могут быть разные причины для хранения разных файлов в разных местах.

Во-первых, ограничение количества файлов в одном каталоге может быть рассмотрено.

Во-вторых, может возникнуть проблема с безопасностью - если некоторые из них должны быть доступны для публичного просмотра (например, фотографии профиля), а другие нет (например, резюме), то размещать их в разных каталогах будет проще.

В-третьих, простые задачи администратора могут быть проще, если файлы разделены, например, просмотр в проводнике, или управление резервными копиями, или изменение приложения для разделения хранилища файлов по нескольким местоположениям.

Существует также проблема конфликтов имен файлов, но если вы переименуете все, чтобы соответствовать полю идентификатора базы данных (например), то это не будет проблемой.

Но в конце дня это, вероятно, зависит от объемов и ваших собственных предпочтений.

2
20.08.2008 10:46:24

Разные таблицы для каждого типа файлов становятся релевантными, только если вы храните другие метаданные (и, следовательно, дополнительные столбцы) для каждого типа файлов. Если ваши таблицы для каждого типа файлов содержат только одни и те же столбцы (например, имя файла, тип файла, дата загрузки и т. Д.), То имеет смысл иметь их все в одной таблице.

2
20.08.2008 10:46:40