Cuando desarrollamos sistemas en algún momento nos encontramos en la decisión de donde almacenar los archivos subidos a nuestro sistema , si alguna vez te preguntaste la interrogante de cual es la mejor opción este articulo es para ti.
Como profesional muchas veces brindo asesorías sobre el diseño de arquitecturas de los sistemas a desarrollar con el fin de tener la opción mas optima, pero en la mayoría de los casos siempre existe mas de una forma.
Si bien el DBMS moderno ha evolucionado y se ha centrado a mejorar el almacenamiento de grandes marchas, como en todo lo relacionado a las tecnologías de la información cada una tiene sus ventajas y desventajas que veremos a detalle.
Sistema de archivos
El sistema de archivos ha sido desde los inicios de la programación el modelo preferido por los desarrolladores que hasta la fecha tiene gran relevancia, veamos sus pro y contras:
Ventajas
- Mejor rendimiento, si almacena archivos grandes en bases de datos, puede ralentizar el rendimiento porque una consulta simple para recuperar la lista de archivos o el nombre de archivo también cargará los datos del archivo si utilizó Select * en su consulta. Si bien el sistema de Archivos que accede a un archivo es bastante simple y ligero.
- Simplicidad en su almacenamiento, guardar los archivos y descargarlos en el sistema de archivos es mucho más simple que la base de datos, ya que una simple función Guardar como le ayudará. La descarga se puede hacer dirigiendo una URL con la ubicación del archivo guardado.
- Fácil migración, el proceso bastante sencillo basta con copiar y pegar (lo que no se recomienda) la carpeta en el destino que desee y asegurarse de que se proporcionan permisos de escritura a su destino.
- Mayor rentabilidad, ya que en la mayoría de los casos es económico expandir su servidor web en lugar de pagar por ciertas bases de datos.
- Fácil almacenamiento en la nube, ya que existen diferentes soluciones en la actualidad en el mercado como Amazon S3 o CDN, etc, los cuales facilitan el trabajo con ficheros.
Desventajas
- Sin apretar . Sin ACID ( atomicidad, coherencia, aislamiento, durabilidad ) las operaciones de mapeo relacional que significa que no hay garantía. Considere un escenario si sus archivos se eliminan de la ubicación manualmente o por algunos tipos de hacking, es posible que no sepa si el archivo existe o no. Doloroso ¿verdad?
- Baja seguridad . Ya que sus archivos pueden guardarse en una carpeta donde debería haber proporcionado permisos de escritura, es propenso a problemas de seguridad e invita a problemas como la piratería. Por lo tanto, es mejor evitar ahorrar en fs si no puede darse el lujo de comprometerse en términos de seguridad.
¿Cuándo se debería usarse?
- Cuando su aplicación es capaz de manejar grandes cantidades de archivos superiores a 5 MB.
- Si su aplicación tiene una gran cantidad de usuarios que generen documentos.
Base de datos
Las bases de datos han evolucionado para poder almacenar los archivos en blobs, pero como la anterior opcion tambien tiene ventajas y desventajas:
Ventajas
- Consistencia ACID
- Concurencia: acceso concurrente a los archivos, manejado por el DBMS (Database Management System).
- Orden de los archivos: los archivos quedan almacenados coherentemente en tablas de la base de datos, en el caso del filesystem se tiende al desorden en carpetas.
- Mantenimiento de la aplicación: al tener los datos separados del código de nuestra aplicación se facilita el mantenimiento / actualización de la misma.
Desventajas
- Incremento en tamaño de la base de datos: si debemos persistir una gran cantida de archivos y/o pocos pero de gran tamaño, esto hará que nuestra base de datos se incremente en tamaño, y en consecuencia su administración será más complicada (backups y restores mas lentos, tiempos de bloqueo de la base de dato mayores).
- Memoria ineficaz, para agregar más, a menudo los RDBMS son impulsados por RAM. Así que todos los datos tienen que ir a la memoria RAM primero. Sí es cierto. ¿Alguna vez has pensado en lo que sucede cuando un RDBMS tiene que encontrar y ordenar datos? RDBMS rastrea cada página de datos, incluso la cantidad más baja de datos leídos / escritos, y debe rastrear si está en la memoria o si está en el disco si está indexada o clasificada físicamente, etc.
- Tiempo de acceso a los archivos: siempre es más rapido el acceso a filesystem que a una base de datos (la db requiere conexión, autenticación, autorización, etc).
- Mayor complejidad: la persistencia en base de datos requiere un mayor conocimiento técnico y más código/procesos/validaciones que en el caso del filesystem.
- Aumento de los requerimientos de infraestructura: se requiere de mayor memoria RAM, procesador, espacio en disco, etc., requerimientos especificados por el DBMS a ser utilizado en la persistencia de archivos (en la práctica, por lo general ya estamos usando un DBMS para nuestro sistema, por lo que el incremento en infraestructura no suele ser considerable, distinto sería si tuviéramos que considerar implementar persistencia en base de datos en un sistema que no utiliza una base de datos)
- Hay otros puntos de los cuales se podría hablar, como ser: costos, normalización, integridad de datos, transacciones, etc.
¿Cuándo se debería usarse?
- Si el archivo de su usuario necesita estar más estrechamente acoplado, protegido y es confidencial.
- Si su aplicación no exigirá una gran cantidad de archivos de una gran cantidad de usuarios
Conclusión
El uso del tipo de almacenamiento de archivos esta sujeta directamente a las características de la aplicación, las cuales se resume a continuación:
Si se tiene una aplicación con un numero de usuarios en el que se genere poco trafico se recomienda el almacenamiento en base de datos.
Si su aplicación maneja grandes volúmenes de usuarios, archivos y un trafico muy elevado se recomienda el almacenamiento en el sistema de archivos.