BLOBs o referencias en PostgreSQL


11

Necesito almacenar archivos de datos binarios en una base de datos PostgreSQL que se ejecuta en un servidor Ubuntu. Inicialmente habrá unas pocas docenas de archivos de aproximadamente 250 kb de tamaño cada uno. Sin embargo, la cantidad de archivos aumentará con el tiempo. Es posible que a veces necesite extraer datos de los archivos para otros análisis posteriores.

He realizado algunas investigaciones sobre la antigua cuestión de almacenar datos binarios como BLOB o referencias. Ambos obviamente tienen sus pros y sus contras. ¿Hay algún problema específico relacionado con PostgreSQL que deba tener en cuenta? ¿Es preferible un método u otro si deseo extraer datos de los archivos, ya sea a través de una función PostgreSQL o mediante un programa externo de Python?

Si tuviera que almacenar los archivos de datos directamente en la base de datos, ¿sería mejor almacenarlos en una tabla separada con una clave externa que haga referencia a la tabla "principal", en lugar de en la tabla que contiene todos los demás campos?

He leído la pregunta y las respuestas aquí ; un comentario sugiere que es mejor almacenar archivos binarios por referencia (en el sistema de archivos) en Linux. Mis preguntas aquí se relacionan específicamente con PostgreSQL y con la extracción de datos de los archivos para diversos análisis.

Actualización: pregunta similar .


Con PostgreSQl es posible configurar una regla que elimina automáticamente el archivo en el sistema de archivos cuando se elimina el registro que contiene la referencia.
jp

Estoy seguro de que hubo más de una respuesta a esta pregunta. ¿Que le paso a eso? ¿Hay alguna forma de verlo si el póster lo eliminó? ¿Qué pasa con los comentarios al respecto?
SabreWolfy

Sí, lo eliminé, ya que se pueden evitar los problemas de rendimiento con bytea sobre los que escribí. Los comentarios se pueden resumir en "Todo está bien con bytea, solo debes asegurarte de no escapar de los caracteres no imprimibles en la base de datos y luego volver a escapar de ellos en tu aplicación. Como comentó araqnid, deberías usar escape hexadecimal que es compatible con libpq ".
jp

Respuestas:


9

Creo que debería almacenar los datos en la base de datos como una byteacolumna normal . De esa forma, obtiene todas las ventajas de una base de datos y puede procesar los datos utilizando las funciones de la base de datos (e incluso PL / Python, si lo desea). Los elementos de datos más grandes se almacenarán automáticamente fuera de línea, por lo que no habría razón para que introduzca otra referencia indirecta.

Las principales razones para almacenar objetos binarios grandes fuera de la base de datos serían si son demasiado grandes para poder almacenarlos y recuperarlos en un momento satisfactorio, si hinchan la base de datos más allá de lo práctico, o si necesita acceder a los archivos como archivos desde Una aplicación separada. Nada de eso se aplica allí, por lo que puedo decir.


Gracias por los detalles. Su punto sobre el acceso a los archivos desde una aplicación separada me llevó a darme cuenta de que en el futuro podría querer permitir a los usuarios descargar el archivo binario para usarlo localmente en su máquina. ¿Podría hacerse eso si el archivo se almacena en la base de datos?
SabreWolfy

Por supuesto. Deberá escribir un pequeño código para organizarlo (obtener los datos del archivo de la base de datos, organizar la descarga HTTP, por ejemplo), pero eso no es un bloqueador.
Peter Eisentraut
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.