¿Es una mala práctica almacenar información de metadatos en los nombres de archivo? Mejores soluciones?

13

Me he dado cuenta de dónde trabajo, la gente está interesada en almacenar información en los nombres de los archivos y analizar los nombres de los archivos.

Para mí, esto no parece ser una práctica especialmente buena. Ya veo los problemas ocasionales con las secuencias de comandos que bloquean un archivo y obtienen el incorrecto porque otro archivo coincide primero. También estamos discutiendo cómo solucionar problemas con separadores para los campos.

¿Se considera mala práctica o no?

¿Cuáles son otras soluciones aceptadas para recuperar archivos de un sistema de archivos basado en algún tipo de metadatos?

wobbily_col
fuente
Depende mucho de lo que se almacena exactamente en el nombre del archivo. ¿Puedes darnos algunos ejemplos?
T. Sar

Respuestas:

14

Sí, creo que es una mala práctica. Está sujeto a todo tipo de problemas, por ejemplo, límites de longitud, problemas de codificación y conflictos debido a datos duplicados.

Mejor es usar un "archivo maestro" (a veces llamado manifiesto o índice) que contiene metadatos y rutas a los archivos. O algo similar en una base de datos, registro o cualquier otra cosa. O para colocar los metadatos dentro de los archivos reales, en el nivel superior de alguna estructura de datos contenida en el archivo, por ejemplo, en JSON o XML.

Esto es algo análogo al concepto de poner información o claves de espacios de nombres en almacenes de valores clave. Creo que esto está bien siempre que lo use solo para el espacio de nombres y realice búsquedas rápidas: los componentes clave no están allí para proporcionar información analizable. Si necesita esa información, duplíquela en el valor (archivo en el caso anterior).

Magnus Wolffelt
fuente
3
Estás elevando puntos intestinales. Pero hay situaciones en las que, sin embargo, tiene sentido poner la información en el nombre del archivo. Piense en los archivos adjuntos de correo que deben enrutarse o procesarse de manera basada en reglas. Si muchos procesos paralelos tienen que cambiar el archivo maestro, podría convertirse en un cuello de botella.
Axel Kemper
Como desarrollador de bases de datos, naturalmente pienso en usar una base de datos en lugar de un archivo de manifiesto (una de las razones por las que solicito aquí métodos alternativos). Eso resolvería el problema de acceso concurrente, pero es una solución más compleja.
wobbily_col
1
@wobbily_col, dependiendo del sistema que utilice, puede haber compatibilidad con los atributos de archivos extendidos disponibles.
Hellion
@AxelKemper Solo hay tanta información que puede caber en un nombre. Hay más metadatos que el nombre y el autor.
Tulains Córdova
Sin mencionar que los nombres de archivos pueden ser alterados por alguien fuera de su sistema, rompiendo los formatos esperados. Incluso cuando se aplican los permisos de archivo apropiados, termina siendo una solución frágil.
Berin Loritsch
5

Primero, los metadatos son un concepto borroso.

Dicho esto, ya existen muchos casos de metadatos en los archivos:

  • números de versión de bibliotecas
  • fecha y hora de las imágenes, o al menos índice de secuencia
  • tipo de archivo, que activa qué aplicación debería abrir el archivo
  • nombre de su directorio de inicio, que debe ser el nombre de usuario de su sesión

Sin embargo, esa lista corta no es un argumento a favor de la práctica.

Las alternativas son:

  • manejar metadatos en el nivel FS, como el antiguo HFS de Apple, por ejemplo
  • poner metadatos en el archivo en sí, como Exif para imágenes o ID3 para sonidos
  • poner metadatos en otro archivo o en una base de datos, como la mayoría de los administradores de medios.
Mouviciel
fuente
55
Todo es un concepto borroso. Incluso "borroso", "concepto" y "todo" son conceptos borrosos.
Tulains Córdova
3

Parece que necesitas una base de datos.

Existen muchos problemas de seguridad al poner los datos del usuario en los nombres de los archivos. Digamos que tiene un archivo para cada usuario ("username.txt"). Lo que sucede cuando alguien registra el nombre de usuario "../../../../etc/passwd" depende de cómo esté filtrando la entrada del usuario.

Los marcos de bases de datos a veces lo ayudarán a desinfectar la entrada del usuario.

Eric Wimberley
fuente
En realidad, muchos sistemas operativos almacenan nombres de usuario en nombres de directorio, que se denominan directorio de inicio .
Mouviciel
Eso es porque el software de alguien tiene que estar en la parte inferior de la pila. No significa que todos tengan que trabajar en ese nivel. No voy a discutir el mérito de las bases de datos, porque los programadores las han estado usando durante más de 50 años.
Eric Wimberley
1
@mouviciel No conozco ningún sistema operativo que analice el nombre de usuario del nombre del directorio de inicio del usuario. Los sistemas Windows y similares a Unix almacenan el nombre del directorio en algún tipo de base de datos y lo cargan en el entorno cuando el usuario inicia sesión. En ambos sistemas, puede terminar con el nombre del directorio de inicio diferente al nombre de usuario ( por ejemplo, cambiar el nombre de los usuarios o si tiene dos instalaciones de Windows en la misma partición del sistema).
Jules
2

No ... bueno ... no necesariamente.

Siempre que tenga una convención estricta y medios de análisis y validación comunes (scripts, bibliotecas, etc.) disponibles, estará listo.

Tomemos, por ejemplo, los sistemas de gestión de paquetes y dependencias (Maven, NuGet y similares). Aunque muchos usarán archivos específicos para metadatos para almacenar la información más avanzada, la información básica a menudo es parte del nombre del archivo. Basándose en convenciones estrictas, el nombre del archivo puede contener la información más pertinente sobre el paquete: es el proveedor, su nombre, su versión, su tipo. A veces eso es todo lo que necesita ... 4 o 5 piezas cortas de información.

Si los metadatos son simples, entonces una convención de nomenclatura de archivos tiene mucho sentido y no requiere nada. Se puede fortalecer con herramientas y scripts muy simples, sin necesidad de una base de datos, sin infraestructura especializada, solo unos pocos scripts y una convención de nomenclatura.

Si nada por ahí hace lo que necesita y sus necesidades son simples, comenzaría con esto.

sus requisitos superan esta convención? extiéndalo con un archivo de metadatos adecuado. ¿Más tarde necesitas una mejor búsqueda para esto? Ya existen buenas soluciones para buscar archivos que lo lleven a donde lo necesita.

No es que no me gusten las bases de datos, sino que son realmente poderosas y útiles, pero requieren una cierta sobrecarga para comenzar. Deben instalarse, respaldarse, mantenerse, necesitará personal que, si no está completamente dedicado, deberá dedicar parte de su tiempo a esta infraestructura. También son más complejos y crípticos para los legos, pierden el desarrollador que lo configuró y su sistema se atascará a tiempo hasta que encuentre un reemplazo.

Nunca subestimes el poder de la baja tecnología con la supervisión adecuada que puede llevarte lejos.

Y cuando supere su solución de baja tecnología, habrá reunido toda la experiencia y los requisitos para implementar el sistema perfecto para sus necesidades.

Newtopian
fuente
Nunca subestimes el poder de la inercia. Cambiar una solución de baja tecnología en algo más robusto requiere mucho más esfuerzo que simplemente no hacerlo de esa manera.
Berin Loritsch
1
@BerinLoritsch el mismo argumento se aplica a todas las soluciones, de baja tecnología o hitech ... se podría argumentar que hitech que requiere más sistemas de interdependencia en realidad hace que esta situación sea peor, no más fácil. Dicho esto, hay un umbral en el que una solución simple de baja tecnología se vuelve más complicada que su contraparte de alta tecnología.
Newtopian
1
Sí, y estoy desatando un par de ejemplos de este tipo en un proyecto ahora. La conclusión es que es necesario que haya una interfaz más ajustada que el sistema de archivos la mayoría de las veces. Desafortunadamente, la mayoría de los sistemas de baja tecnología que heredo no tienen un pensamiento o diseño apropiado aplicado a ellos. El número de excepciones que puedo contar con una mano.
Berin Loritsch
0

En primer lugar, pongámonos de acuerdo en lo que un archivo es . Un archivo es un paquete de datos con un nombre que se puede transmitir, recibir, crear y eliminar con operaciones atómicas (muy cercanas).

Muchos sistemas de archivos (Mac OS y sistemas de archivos Linux más recientes) implementan "bifurcaciones", a menudo utilizadas para almacenar recursos y metadatos. Este enfoque para almacenar metadatos era problemático porque los métodos tradicionales de transferencia de red, los métodos de copia de seguridad y restauración y los métodos de copia de archivos eran inconsistentes, especialmente cuando los sistemas de archivos de origen y destino entendían las bifurcaciones de archivos de manera diferente.

El nombre del archivo se usa para contener metadatos porque a) siempre está allí, b) los metadatos siempre han estado presentes en el nombre del archivo (al menos en el uso de extensiones de archivo), yc) el nombre del archivo sufre muy poca traducción al moverse entre sistemas (distinciones de casos, limitaciones de juego de caracteres, limitaciones de caracteres a un lado).

Por lo tanto, el nombre del archivo es visible, portátil y manejable. Esto no es malo para almacenar algunos metadatos.

Probablemente la mejor solución para abordar los metadatos de archivos generales es usar un repositorio de contenido , donde el repositorio de contenido se puede configurar con el esquema de metadatos que se utilizará para los archivos. En muchos casos, esto es excesivo, pero, en mi humilde opinión, es el camino a seguir para la gestión seria de metadatos.

BobDalgleish
fuente
0

Mi opinión sobre esto es que puede haber visto algún código en algún lugar que hace cosas descuidadas o frágiles con los nombres de archivo, pero eso no significa que "almacenar metadatos en nombres de archivo" sea malo en general.

Los nombres de archivo son metadatos: son datos sobre los datos del archivo, independientemente de los datos del archivo en sí. De hecho, los nombres de archivo son tan antiguos que probablemente sean el ejemplo canónico de metadatos.

Si considera que las extensiones de archivo son solo la parte final del nombre de archivo, entonces el concepto de nombre de archivo como metadatos se vuelve aún más inevitable.

usuario1172763
fuente