Tenemos diferentes formas de almacenar datos del programa (guardar archivos en juegos, bases de datos de empleados, configuración de programas, etc.):
- Texto sin formato (pensar
.ini
y.conf
) - XML
- Bases de datos (MySQL, SQLite ...)
.zip
y similares que contienen varios archivos (con diferentes formatos)- Archivos binarios (piense
.doc
, etc., por ejemplo, creado por una herramienta de serialización)
¿Cuáles son los diferentes casos de uso para los formatos enumerados anteriormente y cuáles son sus ventajas y desventajas (velocidad de pensamiento, flexibilidad, tamaño de archivo, facilidad de uso ...)? ¿Cómo decidir entre ellos para diferentes tareas?
Acerca del formato de compresión: esto solo se usa para contener otros archivos. Podría ser otro formato de compresión también. Esto permite una estructura de varios archivos, incluidos archivos de imagen, archivos de sonido y archivos de texto. Como ejemplo, supongamos que tiene un formato de almacenamiento para mensajes, que puede contener archivos. Puede tener los siguientes archivos dentro de un archivo comprimido:
message.txt (containing the message)
attachments (folder containing attachments)
audio.wav
picture.jpg
Respuestas:
Yo uso de la siguiente manera:
Texto sin formato
Para la configuración, generalmente con YAML o .ini. Desaprobado por mí para la mayoría de los usos, excepto cuando un archivo de texto es el resultado deseado (por ejemplo, imprimir en texto, guardar en texto, etc.)
XML
Para configuración y transporte de datos; ej. exportar, formatear vía XSLT etc. Bueno como formato de archivo portátil (ej. SVG). Excelentes herramientas de manipulación y filtros.
Bases de datos
Almacenamiento principal de datos desde la aplicación / aplicación web. Úselo todo el tiempo como almacenamiento de elección. Es confiable, robusto y obtienes muchas funciones (transacciones, integridad referencial, eliminación / actualización en cascada, índices, velocidad). Se usa mejor con una capa u ORM (IMO).
Archivo de un solo archivo (por ejemplo, .zip)
Adecuado para almacenar flujos binarios múltiples relacionados de forma compacta, por ejemplo, imágenes de ROM para un emulador. Lo mejor para cosas que no tienen que actualizarse con frecuencia o nunca. Es pesado, lento y difícil de manipular;
Binario
Solo cuando una base de datos no está disponible para almacenar datos de la aplicación. Más fácil con la serialización (C ++). Un formato binario altamente sintonizado superará a todo lo demás tanto en velocidad como en tamaño.
fuente
No hay bala de plata. En mi experiencia:
El texto sin formato como medio de almacenamiento es un no automático. Los pocos casos que incluso consideraría estarían mejor cubiertos por un archivo .config donde tengo un esquema y seguridad de tipo. Parece que la necesidad de seguridad de tipo y extracción de datos casi siempre surge. El texto sin formato hace que este proceso sea una pesadilla.
XML : seguridad de tipo, validación de datos, bajo volumen, y en algunos casos lo uso porque .NET tiene un poderoso soporte incorporado para la serialización XML de objetos.
Bases de datos : mi valor predeterminado. Escriba seguridad, velocidad, transacciones, bien confiables y difíciles de culpar por elegir una base de datos como medio de almacenamiento si algo no sale de acuerdo con el plan.
.zip es un formato de compresión, ¿no estás seguro de cómo encaja esto en la persistencia?
Binario : solo uso binario cuando necesito crear un flujo de memoria temporal. El binario no agrega valor en cuanto a la capacidad de consulta en comparación con un DB o XML donde mis datos se organizan con un esquema.
La facilidad de uso es relativa y depende de lo que específicamente quieres lograr. La velocidad es similar fuera de lo que dije anteriormente con respecto al volumen. Si el tamaño del archivo es una preocupación y se aplica la normalización adecuada, lo comprimiré a través de zip o algún otro formato de compresión, pero este es un proceso separado.
fuente
Los uso de la siguiente manera:
Texto sin formato
Si esa categoría incluye formatos un poco más elaborados, como YAML o archivos de propiedades, entonces es la mejor opción para lo que sea que espere que las personas lean y editen a mano. Otra gran ventaja es la simplicidad de modificarlo mediante un pequeño script (por ejemplo, sed).
Nada supera la simplicidad y facilidad de uso. Cuando el equipo de soporte tiene que configurar algo en una máquina remota (por ejemplo, resolver el problema de un cliente), o TI tiene que reconfigurar un grupo de servidores que ejecutan su software, le agradecerán por elegir este formato. También le ahorrará escribir un software único que lo haga por ellos.
XML
Estoy de acuerdo con @Ingo aquí: a diferencia del texto sin formato, XML es más difícil de procesar mediante secuencias de comandos y es una pesadilla editarlo a mano.
Aún así, si tiene datos con una estructura elaborada donde YAML se vuelve indescifrable y aún quiere que sea legible y editable por humanos, entonces XML es probablemente la mejor opción.
Base de datos relacional
Una gran opción para cuando tiene muchos datos (que harían engorroso el texto plano y XML) que aún puede permitir que terceros editen manualmente, a través de comandos SQL e incluso GUI.
Otra ventaja es que su código que administra los contenidos es muy legible. @ Richard-Harrison dio una buena lista de otras ventajas en su excelente respuesta.
Base de datos NoSQL
Una ventaja sobre RDBMS es la escalabilidad a través de la distribución, que probablemente no sea muy relevante para su pregunta. Las ventajas que probablemente son más relevantes son la simplicidad de un almacén de valores clave y la flexibilidad de la ausencia de esquemas (¿es esta una palabra?). Cuando se encuentre rompiendo el paradigma relacional: simplemente almacenando blobs en la base de datos, accediendo a ellos por clave y procesándolos a través del código, entonces considere esta opción. Algunas opciones (por ejemplo, CouchDB) son muy portátiles, tienen un tamaño reducido y también pueden escalarse, por lo que ofrecen una buena alternativa no relacional a MySQL y SQLite.
Binario
La ventaja del binario es que es rápido y compacto. Cuando lo único que necesita leer y modificar su archivo es un programa y los datos no se ajustan al paradigma relacional o la velocidad es realmente importante, entonces esta puede ser una buena opción. Probablemente la mejor opción para archivos multimedia.
Sin embargo, debo señalar que todavía no he encontrado un caso en el que no se requiera un acceso simple a los datos del programa en algún momento por razones que no se consideraron durante el diseño inicial. Hoy en día, personalmente busco la opción de base de datos para cualquier otra cosa que no sean archivos que tienen formatos estándar y necesitan ser codificados / decodificados por otro software (por ejemplo, audio, video).
Nota: existe una idea errónea de que el binario es opaco y, por lo tanto, de alguna manera más seguro. Sin protección adicional, no lo es: si alguien quiere hackear su software, simplemente almacenar sus configuraciones o lo que sea en binario no las detendrá.
Archivo comprimido
No es realmente una alternativa a lo anterior, sino más bien una medida adicional.
Ventajoso cuando necesita transmitir cosas a través de la red, o cuando almacena montones y montones de datos y desea ahorrar espacio. Tenga en cuenta que el espacio de almacenamiento suele ser abundante en estos días, así que considere su plataforma de destino.
Se desempeña muy rápido en casi cualquier cosa hoy (la ley de Moore en acción, bebé), por lo que la única razón para no usarlo es que agrega complejidad a su código. No mucha complejidad, pero sigue siendo una violación del principio KISS. Especialmente engorroso para los archivos de configuración que deben editarse manualmente o mediante secuencias de comandos, y si realmente necesita ahorrar espacio allí, entonces probablemente debería usar la opción de base de datos.
fuente
Los usaría de la siguiente manera:
fuente
He oído que XML combina las peores características del texto (difícil / lento de procesar) y binario (ilegible).
fuente