Percebi que onde trabalho, as pessoas gostam de armazenar informações em nomes de arquivos e analisar os nomes dos arquivos.
Para mim, isso não parece ser uma boa prática. Eu já vejo problemas ocasionais com scripts que ficam ocultos em um arquivo e estão errando porque outro arquivo corresponde primeiro. Também estamos discutindo como contornar problemas com separadores para os campos.
É considerado má prática ou não?
Quais são as outras soluções aceitas para recuperar arquivos de um sistema de arquivos com base em algum tipo de metadado?
programming-practices
wobbily_col
fonte
fonte
Respostas:
Sim, acho que é uma prática ruim. Está sujeito a todos os tipos de problemas - por exemplo, limites de comprimento, problemas de codificação e conflitos devido a dados duplicados.
Melhor é usar um "arquivo mestre" (às vezes chamado de manifesto ou índice) que contém metadados e caminhos para os arquivos. Ou algo semelhante em um banco de dados, registro ou outros enfeites. Ou, para colocar os metadados nos arquivos reais, no nível superior de alguma estrutura de dados contida no arquivo, por exemplo, JSON ou XML.
Isso é um pouco análogo ao conceito de colocar informações ou chaves de namespacing nos armazenamentos de valores-chave. Acho que está tudo bem, desde que você o use apenas para namespace e faça pesquisas rápidas - os principais componentes não estão lá para fornecer informações analisáveis. Se você precisar dessas informações, duplique-as no valor (arquivo no caso acima).
fonte
Primeiro, os metadados são um conceito embaçado.
Dito isto, já existem muitos casos de metadados em arquivos:
No entanto, essa lista curta não é um argumento a favor da prática.
As alternativas são:
fonte
Parece que você precisa de um banco de dados.
Existem muitos problemas de segurança ao colocar dados do usuário em nomes de arquivos. Digamos que você tenha um arquivo para cada usuário ("nomedeusuário.txt"). O que acontece com o que alguém registra o nome de usuário "../../../../etc/passwd" depende de como você está filtrando a entrada do usuário.
As estruturas de banco de dados às vezes o ajudam a limpar a entrada do usuário.
fonte
Não ... bem ... não necessariamente.
Contanto que você tenha uma convenção estrita e meios comuns de análise e validação (scripts, bibliotecas etc.) prontamente disponíveis, você estará pronto.
Tomemos, por exemplo, sistemas de gerenciamento de pacotes e dependências (Maven, NuGet e similares). Embora muitos usem arquivos específicos para metadados para armazenar informações mais avançadas, as informações básicas geralmente fazem parte do próprio nome do arquivo. Confiando em convenções estritas, o nome do arquivo pode conter as informações mais pertinentes sobre o pacote: é fornecedor, é nome, é versão, é tipo. Às vezes é tudo o que você precisa ... 4 ou 5 pequenas informações.
Se os metadados são simples, uma convenção de nomenclatura de arquivos faz todo o sentido, exigindo que nada seja implementado. Ele pode ser reforçado com ferramentas e scripts muito simples, sem necessidade de banco de dados, sem infraestrutura especializada, apenas alguns scripts e uma convenção de nomenclatura.
Se nada lá fora realmente faz o que você precisa e suas necessidades são simples, eu começaria com isso.
seus requisitos superam esta convenção? estenda-o com um arquivo de metadados adequado. Mais tarde, você precisa procurar melhor por isso? Já existem boas soluções para procurar arquivos que o levem aonde você precisa.
Não é que eu não goste de bancos de dados, pelo contrário, eles são realmente poderosos e úteis, mas exigem uma certa quantidade de sobrecarga para continuar. Eles precisam ser instalados, armazenados em backup, mantidos. Você precisará de uma equipe que, se não for totalmente dedicada, precisará dedicar parte do tempo a essa infraestrutura. Eles também são mais complexos e enigmáticos para os leigos, perdem o desenvolvedor que o configurou e seu sistema ficará parado no tempo até você encontrar um substituto.
Nunca subestime o poder da baixa tecnologia com a supervisão adequada, pois isso pode levá-lo a um longo caminho.
E quando você superar sua solução de baixa tecnologia, terá reunido toda a experiência e requisitos para implementar o sistema perfeito para suas necessidades.
fonte
Primeiro, vamos concordar que um arquivo é . Um arquivo é um dado empacotado com um nome que pode ser transmitido, recebido, criado e excluído com operações atômicas (muito próximas a).
Muitos sistemas de arquivos (Mac OS e sistemas de arquivos Linux mais recentes) implementam "garfos", geralmente usados para armazenar recursos e metadados. Essa abordagem para armazenar metadados era problemática, pois os métodos tradicionais de transferência de rede, os métodos de backup e restauração e os métodos de cópia de arquivos eram inconsistentes, especialmente quando os sistemas de arquivos de origem e de destino entendiam os garfos de arquivos de maneira diferente.
O nome do arquivo é usado para armazenar metadados porque a) está sempre lá, b) os metadados sempre estiveram presentes no nome do arquivo (pelo menos no uso de extensões de arquivo) ec) o nome do arquivo sofre muito pouca tradução ao mover entre sistemas (distinções entre maiúsculas e minúsculas, limitações do conjunto de caracteres, limitações de caracteres à parte).
Portanto, o nome do arquivo é visível, portátil e gerenciável. Isso não é ruim para armazenar alguns metadados.
Provavelmente, a melhor solução para abordar os metadados gerais do arquivo é usar um repositório de conteúdo , em que o repositório de conteúdo pode ser configurado com o esquema de metadados a ser usado para os arquivos. Em muitos casos, isso é um exagero, mas, IMHO, é o caminho a seguir para o gerenciamento sério de metadados.
fonte
Minha opinião sobre isso é que você pode ter visto algum código em algum lugar que faz coisas desleixadas ou quebradiças com nomes de arquivos, mas isso não significa que "armazenar metadados nos nomes de arquivos" seja ruim em geral.
Os nomes dos arquivos são metadados - são dados sobre os dados no arquivo, independentemente dos próprios dados do arquivo. De fato, os nomes de arquivos são tão antigos que provavelmente são o exemplo canônico de metadados.
Se você considerar que as extensões de arquivo são apenas a parte final do nome do arquivo, o conceito de nome do arquivo como metadado se torna ainda mais inevitável.
fonte