Плохо ли хранить метаданные в именах файлов? Лучшие решения?

13

Я заметил, где я работаю, люди стремятся хранить информацию в именах файлов и анализировать имена файлов.

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

Это считается плохой практикой или нет?

Каковы другие приемлемые решения для извлечения файлов из файловой системы на основе метаданных определенного типа?

wobbily_col
источник
Многое зависит от того, что именно хранится в имени файла. Можете ли вы дать нам несколько примеров?
Т. Сар

Ответы:

14

Да, я думаю, что это плохая практика. Он подвержен всевозможным проблемам - например, ограничения длины, проблемы кодирования и конфликты из-за дублирования данных.

Лучше использовать «главный файл» (иногда называемый манифестом или индексом), который содержит метаданные и пути к файлам. Или что-то подобное в базе данных, зарегистрироваться или еще много чего. Или поместить метаданные внутри фактических файлов, на верхнем уровне некоторой структуры данных, содержащейся в файле, например, в JSON или XML.

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

Магнус Вольффелт
источник
3
Вы поднимаете очки кишечника. Но бывают ситуации, когда все же имеет смысл поместить информацию в имя файла. Подумайте о почтовых вложениях, которые нужно маршрутизировать или обрабатывать на основе правил. Если многим параллельным процессам необходимо изменить главный файл, это может стать узким местом.
Аксель Кемпер
Как разработчик базы данных, я, естественно, думаю об использовании базы данных вместо файла манифеста (одна из причин, по которой я спрашиваю здесь об альтернативных методах). Это решило бы проблему одновременного доступа, но является более сложным решением.
wobbily_col
1
@wobbily_col, в зависимости от системы, которую вы используете, может быть доступна поддержка расширенных атрибутов файла .
Геллион
@AxelKemper Есть только так много информации, которую вы можете вписать в имя. Там больше метаданных, чем имя и автор.
Тулаинс Кордова
Не говоря уже о том, что имена файлов могут быть изменены кем-то за пределами вашей системы, нарушая любые ожидаемые форматы. Даже если у вас есть соответствующие права доступа к файлам, это становится хрупким решением.
Берин Лорич
5

Во-первых, метаданные - это размытое понятие.

Тем не менее, многие случаи метаданных в файлах уже существуют:

  • номера версий библиотек
  • дата и время изображений или, по крайней мере, индекс последовательности
  • тип файла, который определяет, какое приложение должно открывать файл
  • имя вашего домашнего каталога, которое должно быть вашим именем пользователя сеанса

Тем не менее, этот короткий список не является аргументом в пользу практики.

Альтернативы:

  • обрабатывать метаданные на уровне FS, как, например, Apple, старая HFS
  • поместите метаданные в сам файл, например, Exif для изображений или ID3 для звуков
  • поместите метаданные в другой файл или в базу данных, как и большинство медиа-менеджеров.
mouviciel
источник
5
Все это размытое понятие. Даже «размытые», «концептуальные» и «все» являются размытыми концепциями.
Тулаинс Кордова
3

Похоже, вам нужна база данных.

Существует много проблем безопасности с размещением пользовательских данных в именах файлов. Допустим, у вас есть файл для каждого пользователя («username.txt»). Что происходит, когда кто-то регистрирует имя пользователя "../../../../etc/passwd", зависит от того, как вы фильтруете пользовательский ввод.

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

Эрик Уимберли
источник
На самом деле, многие операционные системы хранят имена пользователей в именах каталогов, которые называются домашними каталогами .
Mouviciel
Это потому, что программное обеспечение Somebody должно быть в нижней части стека. Это не значит, что все должны работать на этом уровне. Я не собираюсь спорить о достоинствах баз данных, потому что программисты используют их более 50 лет.
Эрик Уимберли
1
@mouviciel Я не знаю ни одной операционной системы, которая анализирует имя пользователя по имени домашнего каталога пользователя. Windows и Unix-подобные системы хранят имя каталога в некоторой базе данных и загружают его в среду, когда пользователь входит в систему. В обеих системах вы можете получить имя домашнего каталога, отличное от имени пользователя ( например, переименование пользователей или если у вас есть два экземпляра Windows в одном системном разделе).
Жюль
2

Нет ... ну .. не обязательно.

Если у вас есть строгое соглашение и общие средства синтаксического анализа и проверки (скрипты, библиотеки и т. Д.), Вы готовы к работе.

Возьмем, к примеру, системы управления пакетами и зависимостями (Maven, NuGet и тому подобное). Хотя многие будут использовать специальные файлы для метаданных для хранения более сложной информации, основная информация часто является частью самого имени файла. Опираясь на строгие соглашения, имя файла может содержать наиболее важную информацию о пакете: его поставщик, его имя, его версия, его тип. Иногда это все, что вам нужно ... 4 или 5 коротких кусочков информации.

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

Если ничто там не делает то, что вам нужно, и ваши потребности просты, я бы начал с этого.

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

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

Никогда не стоит недооценивать силу низких технологий с надлежащим контролем, который может помочь вам в этом.

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

Newtopian
источник
Никогда не стоит недооценивать силу инерции. Превращение низкотехнологичного решения во что-то более надежное требует гораздо больших усилий, чем просто не делать это таким образом с самого начала.
Берин Лорич,
1
Один и тот же аргумент @BerinLoritsch применим ко всем решениям, как к нетехническим, так и к высокотехнологичным ... можно утверждать, что использование hitech, требующее большего взаимозависимости систем, на самом деле делает эту ситуацию хуже, а не проще. Тем не менее, существует порог, когда простое низкотехнологичное решение становится более замысловатым, чем его полноценный высокотехнологичный аналог.
Newtopian
1
Да, и я сейчас раскручиваю пару таких примеров в проекте. Суть в том, что должен быть более жесткий интерфейс, чем файловая система, чаще, чем нет. К сожалению, большинство низкотехнологичных систем, которые я наследую, не имеют подходящей мысли или дизайна, примененного к ним. Количество исключений я могу рассчитывать на одну руку.
Берин Лорич
0

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

Многие файловые системы (Mac OS и более поздние файловые системы Linux) используют «вилки», часто используемые для хранения ресурсов и метаданных. Такой подход к хранению метаданных был проблематичным в том смысле, что традиционные методы передачи по сети, методы резервного копирования и восстановления и методы копирования файлов были несовместимы, особенно когда исходная и целевая файловые системы по-разному понимали файловые вилки.

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

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

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

BobDalgleish
источник
0

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

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

Если вы считаете, что расширения файлов являются лишь конечной частью имени файла, то концепция «имя файла как метаданные» становится еще более неизбежной.

user1172763
источник