È una cattiva pratica archiviare le informazioni sui metadati nei nomi dei file? Soluzioni migliori?


13

Ho notato dove lavoro le persone sono entusiaste di archiviare informazioni nei nomi dei file e analizzare i nomi dei file.

Per me questa non sembra essere una buona pratica. Vedo già i problemi occasionali con gli script che cercano un file e ottengono quello sbagliato perché un altro file corrisponde prima. Stiamo anche discutendo su come aggirare i problemi con i separatori per i campi.

È considerata una cattiva pratica o no?

Quali sono le altre soluzioni accettate per il recupero di file da un file system basato su un tipo di metadati?


Dipende molto da cosa viene memorizzato esattamente nel nome del file. Puoi darci qualche esempio?
T. Sar,

Risposte:


14

Sì, penso che sia una cattiva pratica. È soggetto a tutti i tipi di problemi, ad esempio limiti di lunghezza, problemi di codifica e conflitti dovuti a dati duplicati.

Meglio usare un "file master" (a volte chiamato manifest o indice) che contiene metadati e percorsi dei file. O qualcosa di simile in un database, registro o quant'altro. Oppure per inserire i metadati all'interno dei file effettivi, al livello superiore di alcune strutture di dati contenute nel file, ad esempio JSON o XML.

Ciò è in qualche modo analogo al concetto di inserire informazioni o chiavi di spaziatura dei nomi negli archivi di valori-chiave. Penso che sia ok fintanto che lo usi solo per lo spazio dei nomi e fai ricerche rapide - i componenti chiave non sono lì per fornire informazioni analizzabili. Se hai bisogno di tali informazioni, duplicale nel valore (file nel caso precedente).


3
Stai aumentando i punti intestinali. Ma ci sono situazioni in cui ha senso mettere le informazioni nel nome del file. Pensa agli allegati di posta che devono essere indirizzati o elaborati in modo basato su regole. Se molti processi paralleli devono modificare il file principale, potrebbe diventare un collo di bottiglia.
Axel Kemper,

Come sviluppatore di database, penso naturalmente all'utilizzo di un database anziché di un file manifest (uno dei motivi per cui qui chiedo metodi alternativi). Ciò risolverebbe il problema di accesso simultaneo, ma è una soluzione più complessa.
wobbily_col,

1
@wobbily_col, a seconda del sistema in uso, potrebbe essere disponibile il supporto per gli attributi di file estesi .
Hellion,

@AxelKemper Ci sono così tante informazioni che puoi inserire in un nome. Ci sono più metadati del nome e dell'autore.
Tulains Córdova,

Per non parlare dei nomi dei file possono essere modificati da qualcuno al di fuori del sistema, rompendo i formati previsti. Anche quando hai le autorizzazioni appropriate per i file, finisce per essere una soluzione fragile.
Berin Loritsch,

5

Innanzitutto, i metadati sono un concetto sfocato.

Detto questo, esistono già molti casi di metadati nei file:

  • numeri di versione delle librerie
  • data e ora delle immagini, o almeno indice di sequenza
  • tipo di file, che attiva quale applicazione dovrebbe aprire il file
  • nome della home directory, che deve essere il nome utente della sessione

Tuttavia, questa breve lista non è un argomento a favore della pratica.

Le alternative sono:

  • gestire i metadati a livello di FS, come ad esempio il vecchio HFS di Apple
  • inserisci i metadati nel file stesso, come Exif per le immagini o ID3 per i suoni
  • inserire i metadati in un altro file o in un database, come la maggior parte dei media manager.

5
Tutto è un concetto sfocato. Anche "sfocato", "concetto" e "tutto" sono concetti sfocati.
Tulains Córdova,

3

Sembra che tu abbia bisogno di un database.

Esistono molti problemi di sicurezza nell'inserimento dei dati utente nei nomi dei file. Supponiamo che tu abbia un file per ogni utente ("username.txt"). Cosa succede a qualcuno che registra il nome utente "../../../../etc/passwd" dipende da come stai filtrando l'input dell'utente.

I framework di database a volte ti aiuteranno a disinfettare l'input dell'utente.


In realtà, molti sistemi operativi memorizzano i nomi utente nei nomi di directory, che sono chiamati home directory .
mouviciel,

Questo perché il software di alcuni corpi deve essere in fondo allo stack. Ciò non significa che tutti debbano lavorare a quel livello. Non discuterò del merito dei database, perché i programmatori li usano da più di 50 anni.
Eric Wimberley,

1
@mouviciel Non sono a conoscenza di alcun sistema operativo che analizza il nome utente dal nome della directory home dell'utente. I sistemi simili a Windows e Unix memorizzano entrambi il nome della directory in una sorta di database e lo caricano nell'ambiente quando l'utente accede. In entrambi i sistemi, è possibile che il nome della directory home sia diverso dal nome utente ( ad esempio rinominare gli utenti o se si hanno due istall di Windows sulla stessa partizione di sistema).
Jules,

2

No ... beh ... non necessariamente.

Finché hai una convenzione rigorosa e mezzi di analisi e validazione comuni (script, librerie, ecc.) Prontamente disponibili, sei a posto.

Prendiamo ad esempio i sistemi di gestione degli imballaggi e delle dipendenze (Maven, NuGet e simili). Sebbene molti utilizzino file specifici per i metadati per memorizzare le informazioni più avanzate, le informazioni di base fanno spesso parte del nome del file stesso. Basandosi su convenzioni rigorose, il nome del file può contenere le informazioni più pertinenti sul pacchetto: è fornitore, è nome, è versione, è tipo. A volte è tutto ciò che serve ... 4 o 5 brevi informazioni.

Se i metadati sono semplici, una convenzione di denominazione dei file ha perfettamente senso e non richiede alcun intervento. Può essere rafforzato con strumenti e script molto semplici, nessun database necessario, nessuna infrastruttura specializzata con pochi script e una convenzione di denominazione.

Se niente là fuori fa esattamente ciò di cui hai bisogno e le tue esigenze sono semplici, inizierei con questo.

i tuoi requisiti superano questa convenzione? estenderlo con un file di metadati appropriato. In seguito hai bisogno di una ricerca migliore per questo? Esistono già buone soluzioni là fuori per la ricerca di file che ti portano dove vuoi.

Non è che non mi piacciano i database, al contrario sono davvero potenti e utili ma richiedono un certo sovraccarico per andare avanti. Devono essere installati, sottoposti a backup, mantenuti, avrai bisogno di personale che, se non completamente dedicato, dovrà dedicare parte del proprio tempo a questa infrastruttura. Sono anche più complessi e criptici per i non addetti ai lavori, perdono lo sviluppatore che ti ha creato e il tuo sistema rimarrà bloccato nel tempo fino a quando non troverai un sostituto.

Non sottovalutare mai il potere della bassa tecnologia con la corretta supervisione che può farti fare molta strada.

E quando supererai la tua soluzione a bassa tecnologia avrai raccolto tutta l'esperienza e i requisiti per implementare il sistema perfetto per le tue esigenze.


Non sottovalutare mai il potere d'inerzia. Trasformare una soluzione a bassa tecnologia in qualcosa di più robusto richiede uno sforzo molto maggiore rispetto al non farlo in quel modo per cominciare.
Berin Loritsch,

1
Lo stesso argomento di @BerinLoritsch si applica a tutte le soluzioni, a bassa tecnologia o hitech ... si potrebbe sostenere che l'hitech che richiede più inter-dipendenza dei sistemi in realtà rende questa situazione peggiore, non più facile. Detto questo, c'è una soglia in cui una semplice soluzione a bassa tecnologia diventa più contorta rispetto alla sua controparte ad alta tecnologia.
Newtopian,

1
Sì, e ora sto sciogliendo un paio di esempi su un progetto. La linea di fondo è che deve esserci un'interfaccia più stretta del filesystem più volte che no. Sfortunatamente, la maggior parte dei sistemi a bassa tecnologia che eredito non hanno il pensiero o il design appropriati applicati a loro. Il numero di eccezioni su cui posso contare da una parte.
Berin Loritsch,

0

In primo luogo, siamo d'accordo che cosa un file è . Un file è un pacchetto di dati con un nome che può essere trasmesso, ricevuto, creato ed eliminato con operazioni atomiche (molto vicine a).

Molti file system (Mac OS e file system Linux più recenti) implementano "fork", spesso utilizzati per archiviare risorse e metadati. Questo approccio all'archiviazione dei metadati era problematico in quanto i metodi tradizionali di trasferimento di rete, i metodi di backup e ripristino e i metodi di copia dei file erano incoerenti, specialmente quando i file system di origine e di destinazione comprendevano le forcelle di file in modo diverso.

Il nome del file viene utilizzato per contenere i metadati perché a) è sempre presente, b) i metadati sono sempre stati presenti nel nome del file (almeno nell'uso delle estensioni di file) e c) il nome del file viene sottoposto a una traduzione molto ridotta durante lo spostamento tra i sistemi (distinzioni dei casi, limitazioni dei set di caratteri, limitazioni dei caratteri a parte).

Pertanto, il nome del file è visibile, portatile e gestibile. Questa non è una brutta cosa per la memorizzazione di alcuni metadati.

Probabilmente la soluzione migliore per indirizzare i metadati di file generali consiste nell'utilizzare un repository di contenuti , in cui il repository di contenuti può essere configurato con lo schema dei metadati da utilizzare per i file. In molti casi questo è eccessivo, ma, IMHO, è la strada da percorrere per una seria gestione dei metadati.


0

La mia opinione su questo è che potresti aver visto un codice da qualche parte che fa cose sciatte o fragili con i nomi dei file, ma ciò non significa che "archiviare i metadati nei nomi dei file" sia generalmente negativo.

I nomi dei file sono metadati: sono dati relativi ai dati nel file, indipendentemente dai dati del file stesso. In effetti, i nomi dei file sono così vecchi che probabilmente sono l'esempio canonico dei metadati.

Se si considera che le estensioni dei file sono solo la parte finale del nome file, il concetto di nome file come metadati diventa ancora più inevitabile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.