usar txt texto tabla plano leer importar generar exportar desde datos con como archivo sql database

sql - txt - Base de datos frente a archivo de texto plano: ¿Cuáles son algunas razones técnicas para elegir una sobre otra cuando el rendimiento no es un problema?



leer archivo txt desde sql server (23)

¿Qué sucede cuando el archivo de registro hace que se quede sin espacio en disco?

Ventajas de almacenar información de registro en una tabla de base de datos:

  1. Fácilmente consultable, si formatea la tabla correctamente. ¿Quieres saber por qué tu descarga de FTP se interrumpió a las 11:53 AM del martes pasado? Diviértete navegando por tu archivo plano. Escribiré una consulta y tendré la información en una fracción del tiempo.
  2. Fácilmente escalable. Si tiene una base de datos de nivel empresarial, nunca tendrá que preocuparse por que los registros se queden sin espacio en disco (a menos que sus administradores de bases de datos sean tontos).
  3. Transaccional: no tiene que preocuparse por los bloqueos de archivos y anexos.

Siento que podría continuar durante horas en este tema. En serio, obtenga un enfoque de registro estándar y use una tabla de base de datos, y no se arrepentirá.

Estoy teniendo un problema en uno de los equipos en los que estoy trabajando. Uno de los muchachos está un poco satisfecho con SQL en mi opinión y quiere almacenar la información de registro generada por un pequeño programa de descarga de FTP en Python en una base de datos, en lugar de solo una bonito archivo de texto con formato. Ahora siempre he opinado que una base de datos solo debería usarse si acelera las cosas o si proporciona una interfaz más confiable para los datos. ¿Cuáles son tus opiniones?

¡Gracias!

Edición: en este caso particular, los datos crecerán aproximadamente 100 líneas por día y se procesarán una vez y se desecharán. Aunque este caso es de preocupación inmediata, estoy más interesado en una respuesta general.

Edit 2: Gracias por todas sus respuestas! He marcado la respuesta con la mayoría de los votos como la respuesta porque siento que indica de manera sucinta la mayoría de los puntos que todos habéis hecho, pero observaré y veré si surge algo más.


¿qué pasa con sqlite? Es una biblioteca de C que implementa una base de datos muy simple, recomendada para proyectos simples.


Almacenar en una base de datos también podría permitir que alguien consulte los registros para varios propósitos en una fecha posterior . (Suponiendo que los elementos individuales del evento de registro, como la fecha / hora, el tipo de evento, el código numérico, el mensaje de texto simple, etc., se mantengan por separado).

Por lo general, el almacenamiento en DB incurrirá en un pequeño impacto de rendimiento, en comparación con la salida de texto plano. Esto será más notable si la tabla de la base de datos subyacente tiene muchos índices. A veces, un enfoque válido es almacenar en un montón de base de datos (una tabla sin ningún índice, o tal vez solo un índice simple), y mantener este montón pequeño moviendo su contenido a una tabla completamente indexada, todas las noches (o siempre que se cargue el SQL). se espera que sea bajo).

En temas relacionados, puede buscar en muchas bibliotecas de registro útiles, como log4j (que por cierto puede configurarse para ir a archivos planos, con gestión continua o al servidor de bases de datos) ...

Los únicos registros que recomendaría dejar en formato de archivo de texto plano, están asociados con mensajes de error raros / ocasionales y otros casos de excepción. El formato del archivo de texto luego proporciona un acceso rápido a la información (usando un editor de texto local), utilizado con fines de diagnóstico para eventos de registro más antiguos que unas pocas semanas.


Como desarrollador de aplicaciones cliente / servidor y ahora de n niveles, me encanta el poder, la confiabilidad y la velocidad de los sistemas de bases de datos. Habiendo dicho esto, estoy muy reacio a hacer el proceso de registro en una base de datos. El almacenamiento de un estado actual o las transiciones de estado crítico de un flujo de trabajo complejo en una base de datos es excelente, pero el registro / seguimiento de todos los pasos en la base de datos puede ser un problema. Si la razón para el registro es poder rastrear fallas y posiblemente depurar el sistema, debo poder procesar mi "Registro" en las circunstancias más extremas. ¿Qué pasa si mi db / red /? No son funcionales de alguna manera. Si puedo acceder al servidor, un archivo de texto me permite hacer una depuración con vi / emacs / notepad / *. No es el conjunto de herramientas más poderoso, pero siempre está disponible. Un archivo de registro bien formateado también puede tener informes generados por el uso de grep / awk / sed, etc. Una vez más, no es el más potente pero está disponible. Al final, si espero que mi registro se use en escenarios de fallas, necesito tener la mayor disponibilidad posible y, suponiendo que estoy en un estado de falla, no puedo asumir que mi DB todavía se estará ejecutando.


Creo que puede haber respondido a su propia pregunta:

Ahora siempre he opinado que una base de datos solo debería usarse si acelera las cosas o si proporciona una interfaz más confiable para los datos .

Una base de datos, por definición, proporciona una interfaz más confiable para los datos estructurados, proporcionando columnas con nombre y tipos de datos garantizados para comenzar.

Si sus necesidades son realmente simples (un pequeño número de campos absolutamente consistentes sin problemas de normalización) probablemente no se verá afectado por el uso de un archivo de texto. Pero, ¿cómo planeas analizar el archivo? Presumiblemente, el primer paso será leerlo en una base de datos o en alguna estructura de datos en memoria. Usar una base de datos para comenzar significa que ese paso ya está hecho para usted.


Dada la gran cantidad de programas de análisis de archivos de registro y la cantidad de registros del servidor que son de texto simple, está bien establecido que los archivos de registro de texto simple se escalan y son bastante fáciles de consultar.

En general, la mayoría de las bases de datos SQL están optimizadas para actualizar los datos de manera robusta , en lugar de simplemente agregarse al final de una serie temporal. La implementación asume que los datos no deben duplicarse y que existen restricciones de integridad relacionadas con las referencias a otras relaciones / tablas que deben ser aplicadas. Dado que un registro nunca actualiza una entrada existente, y por lo tanto no tiene restricciones que puedan ser violadas o eliminaciones en cascada, hay muchas cosas que nunca usará.

Es posible que prefiera una base de datos para la escalabilidad de las transacciones; por ejemplo, si desea centralizar muchos registros en una base de datos para que en realidad tenga cierta concurrencia (aunque no sea intrínseco al problema) tener registros separados en un servidor también lo permitiría, pero luego tendrá fusionarlos a total para todos sus sistemas).

Usar una base de datos SQL es un poco más complicado que solo agregar uno o dos archivos y llamar a fflush. OTOH si está muy acostumbrado a trabajar con SQL y ya está utilizando una base de datos en el proyecto, entonces hay pocos gastos generales en el uso de una base de datos para el registro.


Depende del contexto. Si es muy limitado, como usted sugiere, simplemente registrando algunos datos básicos de transferencia de archivos, procesando el registro una vez y desechándolo, tenderé a sentirme atraído por la opción de archivo plano también. RDBMS sería un poco exagerado, sin embargo, las previsiones futuras previsibles pueden agregar un factor primordial.

Como compromiso, es posible que desee pensar en una solución integrada como SQL Lite et al o usar una API de abstracción de base de datos (como el controlador ODBC de archivos planos) que funcione con archivos planos y que luego pueda cambiarse fácilmente para operar contra un RDBMS sin ningún tipo de Cualquier código importante cambia según lo ameriten las condiciones.

Es posible que también desee pensar en términos de servidor de registro, como el uso de syslog confiable con almacenamiento respaldado por la base de datos. Con este método, la aplicación simple tiene menos complejidad y todos los sistemas pueden beneficiarse de la disposición.


Dos cosas me llevarían a usar una base de datos:

(a) Su archivo de registro tiene campos distintos, como la fecha de registro, la identificación del usuario que inició sesión en el momento del evento, el módulo que activa el evento, etc. y

(b) Es necesario realizar consultas en estos campos, especialmente en consultas complejas. Como, "enumerar todos los desbordamientos de memoria activados por el módulo xyz los fines de semana".

Si, por otro lado, su archivo de registro es una serie de mensajes no relacionados emitidos por una variedad de módulos sin formato consistente, de modo que la única declaración de creación posible para su archivo de registro es "crear registro de tabla (logmessage varchar (500) ) ", entonces no veo ninguna ganancia clara al usar una base de datos.

Una base de datos seguramente será más lenta: siempre va a tomar más tiempo actualizar los índices y hacer inserciones dinámicas que solo agregarse al final de un archivo de texto. Escribir en una base de datos implica la posibilidad de perder o corromper datos debido a problemas con la base de datos. Esto es raro, por supuesto, pero probablemente el punto de un archivo de registro es ayudarlo a localizar problemas como la corrupción de datos. Si su procedimiento de identificación y recuperación de errores se basa en el supuesto de que nunca tendrá ningún error, ¿por qué lo hace? Trae a la mente todas las bromas sobre el escritorio de ayuda que envía correos electrónicos alertando a las personas de que el sistema de correo electrónico no funciona.

Personalmente, casi siempre escribo registros en un archivo de texto simple. Solo puedo pensar en algunas ocasiones cuando inicié sesión en una base de datos. Y la última vez que lo hice fue porque no tenía acceso al sistema de archivos en el servidor de producción, pero podía acceder a la base de datos.


En mi opinión, siempre hay una compensación

Como se indicó anteriormente, depende de cómo intente recopilar y utilizar los datos que genere.

Las bases de datos ya tienen listas para usar, varias utilidades y funciones que ayudan a manipular los datos, es decir, entrada, almacenamiento, análisis, clasificación, comparación, verificaciones de integridad, informes, recuperación, búsqueda, filtros, seguridad, ediciones para múltiples usuarios, etc.

Sin embargo, puede lograr todo esto con un archivo plano, pero debe estar preparado para proporcionar la interfaz que haga estas cosas que la mayoría de las bases de datos hacen. Al ajustar de forma inteligente la estructura y al utilizar columnas / campos bien definidos por elemento de datos de fila, incluso puede alcanzar un estado relacional. La diferencia aquí es que si bien algunas de las bases de datos tienen estas características como estándar, tendrá que crear estas características a través de un script o código. Todas estas características se pueden crear incluyendo todos los tipos de copias de seguridad.

Sin embargo, debe determinar cuál le brinda el beneficio óptimo, es decir, ¿gana más al escribir sus propios scripts para manipular los datos (como se indica más arriba) y tiene un rendimiento mucho más ligero y quizás más rápido o gana más al reducir su propio tiempo de desarrollo? ¿Y en su lugar, implementar una solución de base de datos estándar o personalizada?

mi propia opinión es que cuando alguien le dice que es fácil de usar, la escala es inversamente proporcional, es decir, en el caso ideal, cuanto mayor sea el esfuerzo del programador / desarrollador detrás de escena en el desarrollo de todo tipo de escenarios, más fácil será para el usuario final, Cuanto menor sea el esfuerzo del programador / desarrollador, el usuario final del sistema tendrá que usar más esfuerzo para manipular los datos.


Escriba a syslog (si se ejecuta en un sistema Unix), redirija syslog tanto a un archivo de registro rotativo como a una base de datos.

El archivo de registro siempre es útil para la supervisión en tiempo real utilizando herramientas estándar de Unix como tail que se puede combinar con grep, etc.

syslog puede redirigir los mensajes de registro a diferentes servidores, múltiples destinos, etc.

No siempre es aconsejable crear dependencias de base de datos en una aplicación, si la base de datos falla, ¿qué sucede con el registro?

¿Cómo registrar las fallas de la base de datos si su único registro va a la base de datos?


Hay una gran cantidad de preguntas que vienen a mi mente que guiarán las respuestas y, en última instancia, las suyas.

  • ¿Necesita buscar a través de los datos en un momento posterior? De lo contrario, ¿por qué se está registrando? Si lo hace, es la cantidad o el tipo de búsquedas adecuadas para un archivo plano.
  • ¿Las cantidades de datos son pequeñas y la base de datos es una optimización prematura, o va a almacenar una gran cantidad de datos de registro?
  • En qué copia de seguridad / DR / Restaurar SLA estará trabajando, si no tiene ninguno y nunca tiene la intención de hacer una copia de seguridad del archivo o protegerlo, por ejemplo, es informativo, entonces un archivo puede estar bien, pero si tiene que asegurar los datos es seguro y se puede lograr un punto en el tiempo de recuperación, entonces debe buscar una alternativa a un archivo plano.
  • ¿Los datos son pequeños ahora, pero aumentarán / aumentarán con el tiempo? La elección de un archivo para una solución a corto plazo puede realmente dañarlo a largo plazo.

No hay una solución única, una base de datos podría optimizarse prematuramente, pero igualmente podría ser muy válida.

A.


La mayoría de las respuestas parecen estar dando un mero servicio de labios a la mayor ventaja: consultas sofisticadas ad hoc. La escalabilidad en este caso no tiene nada que ver con eso.


La tecnología relacional ofrece la posibilidad de consultar el subyacente de cualquier manera posible sin que el usuario tenga que saber sobre el almacenamiento y el diseño físico.

Eso se mantiene incluso para los sistemas SQL.

Si no necesita una capacidad de consulta, es probable que cualquier opción se adapte a su propósito, y es probable que la "más simple" (por ejemplo, el archivo plano de bytes) le brinde el mejor rendimiento.

Una cosa más: si tiene varias fuentes simultáneas de entradas de registro, los problemas de serialización se vuelven importantes. Cuando se registra en un archivo plano, los bloqueos en el archivo plano duran el tiempo necesario para realizar la escritura, cuando el registro en una base de datos se convierte en parte de una transacción y es probable que el bloqueo (en la tabla de registro) dure el tiempo de esa transacción, tal vez causando "desbordamiento de colas", o "síndrome de convoy", o lo que sea que quieras nombrar.


Las bases de datos ofrecen escalabilidad, mientras que los archivos planos no lo hacen. ¿Qué sucede si la aplicación que usted desarrolló debe hacer más en 2 años?
Las bases de datos también ofrecen muchos otros beneficios, incluidos los niveles de permiso y las copias de seguridad integradas que tendría que configurar manualmente de otra manera, lo que aumentaría el trabajo que debe realizarse. Siempre elegiré una base de datos sobre un archivo plano si es una opción. Siempre.


Los archivos planos son bases de datos si los trata como bases de datos. Ventajas de usar archivos planos:

  • altamente portátil
  • legible por humanos / directamente editable
  • Configuración / administración cero (sqlite también tiene esta ventaja). La seguridad equivale a configurar los permisos de archivo correctamente

Desventajas:

  • eficiencia de tiempo / espacio (aunque esto no parece ser importante para su caso de uso)
  • no hay controles de integridad de datos
  • no hay tipos de datos explícitos
  • Las herramientas para trabajar con archivos planos como bases de datos son (en su mayor parte) mucho menos maduras que las bases de datos con formatos de almacenamiento nativos.

Es incorrecto decir que necesita escribir en una base de datos para consultar sus datos. Hay varias herramientas que te permiten hacer eso con archivos planos:


Mire, muchos de los argumentos de "pensar en necesidades futuras" son sobrantes de ingeniería excesiva. BESO.

Lo único que debe hacer para abordar las necesidades futuras a este respecto es simplemente escribir sus rutinas de registro de tal manera que sea fácil redirigirlo totalmente a otra cosa. Texto de bricolaje, servicios de tipo syslog o una base de datos. Mantenga ese concepto en mente, pero NO escriba nada que no sea lo que necesita ahora.

Por lo que describiste, suena absolutamente como si solo debieras usar un simple archivo de texto.


Si desea ejecutar informes sobre los datos o formular preguntas más adelante, una base de datos es una opción lógica, especialmente si está almacenando varias ejecuciones en el mismo archivo de base de datos para buscar tendencias.

Si solo está escribiendo los registros de ejecuciones individuales y no le importan los datos después de revisarlos, es probable que una base de datos no tenga sentido.


Si simplemente ''tira'' sus datos y no tiene la intención de manipularlos / consultarlos más tarde, es preferible un archivo de texto, ya que es más rápido que usar una base de datos.


Sugiera utilizar log4j / log4cxx (no especificó un idioma). Hay agregadores disponibles que pueden colocar los datos en una base de datos, un archivo plano o un syslogd. Puede configurarlo para que sea lo que el grupo decida en cualquier momento. Incluso puedes hacer ambas cosas al mismo tiempo. Es lo mejor de ambos mundos.


Un archivo plano es una forma de base de datos.

La razón para elegir un DBMS preexistente en lugar de hacer rodar el suyo propio es principalmente que su tiempo se gasta mejor en el dominio del problema en lugar de reinventar la rueda.

Siempre puede ir con una base de datos de gama baja o OSS si sus necesidades son simples y no quiere gastar mucho dinero en ello.


Ya hay muchas respuestas buenas (calidad de respuesta aceptada), solo estoy agregando un punto que se debe considerar:

Si tiene poco espacio en el disco, o simplemente no quiere perder 16 GB en un archivo plano después de 5 años de registros de grabación, preferiría simplemente emitir un "BORRAR DE Registros DONDE la fecha < x " que puede ejecutarse simultáneamente sin tiempo de inactividad, o preferiría tener que desconectar su aplicación sin conexión mientras recorta 16 GB de líneas desde la parte superior de su archivo de texto (apuesta que va a bloquear el archivo).

Hay una gran diferencia entre "no es demasiado rápido" y "no funciona en absoluto".

Edición: en respuesta a su edición, si planea desechar los datos una vez procesados, ¿no sería más fácil recortar los datos de una base de datos (BORRAR) que un archivo plano (a menos que comience a usar tamaños de línea fijos e implemente los suyos propios) esquema de asignación de bloques, momento en el que acaba de empezar a implementar una base de datos de personas pobres)


Me gusta planificar un poco para el futuro. Si un archivo de tipo plano le ofrece exactamente lo que necesita para hoy, qué pasa si sus especificaciones cambian o si el cliente desea más información más adelante. No querrá tener que explicar que tomará mucho tiempo para rediseñar una solución. Si existe alguna posibilidad de que esta solución deba persistir en el tiempo y pueda ser influenciada por los clientes, una solución de base de datos tendrá la flexibilidad que probablemente necesitará.


  • actuación
  • escalabilidad
  • redundancia
  • normalización
  • integridad de los datos
  • acceso multiusuario (concurrente)
  • eficiencia de almacenamiento de datos (dependiendo de la indexación, por supuesto)