Вопрос

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

Мой вопрос заключается в следующем:Должна ли быть отдельная таблица для каждого "типа" файла?Кроме того, должны ли файлы храниться в контекстно-зависимых расположениях на сервере или все вместе?

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

Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top