¿Cuáles son las diferencias entre los algoritmos que usan estructuras de datos y los algoritmos que usan bases de datos?

10

La pregunta general

¿Cuáles son las diferencias entre los algoritmos que usan estructuras de datos y los algoritmos que usan bases de datos?

Algún contexto

Esta es una pregunta que me ha estado molestando durante algún tiempo, y no he podido encontrar una respuesta convincente.

Actualmente, estoy trabajando para fortalecer mi comprensión de los algoritmos que, por supuesto, involucran en gran medida las estructuras de datos. Estas son estructuras básicas como Bag, Queue, Stack, Priority Queue y Heap.

También utilizo bases de datos a diario para almacenar los datos que han sido procesados ​​y enviados por el usuario final o procesados ​​por el programa. Recupero y envío los datos a través de un DAL, que tiene estructuras de datos propias que se generan en función de las tablas de la base de datos.

Mis preguntas surgen cuando tengo la opción de ordenar los datos usando la base de datos para enviármelos ordenados de manera ascendente / descendente o recuperar y cargar los datos en mi lógica, procesar estos datos en una cola de prioridad y ordenar en montón todo ello. Otra sería buscar registros usando la base de datos en lugar de cargar un subconjunto de registros y usar algo como la búsqueda binaria para encontrar el registro o los registros que me interesan.

En mi opinión, trataría de tener tantas operaciones en el extremo de la base de datos antes de enviarlo porque la comunicación es costosa. Esto también me hace preguntarme cuándo utiliza algoritmos y estructuras de datos estrictamente definidos dentro de su propia lógica en lugar de procesar datos que los de la base de datos.

Así que aquí están las preguntas ...

Preguntas

  1. ¿Cuáles son las diferencias entre las estructuras de datos y las bases de datos?
  2. ¿Cuándo usamos algoritmos que usan estructuras de datos definidas únicamente dentro de su propia lógica y no la de la base de datos?
  3. Publicación de @Harvey: ¿ Cuándo los métodos en la base de datos se vuelven menos eficientes de usar que los métodos en su propia lógica?
    • @mirculixx post: ¿Qué hace que un método sea eficiente?
  4. @Harvey post: ¿Cómo es el procesamiento de datos con estructuras de datos más rápido que hacerlo en la base de datos?

Aclaraciones

  1. Publicación de @Grant: las bases de datos con las que normalmente trabajo son relacionales, y estas preguntas están saliendo de trabajar con ellas. Sin embargo, creo que estas preguntas son aplicables a cualquier marco de persistencia (cuando digo marco, lo digo en el sentido más general).

Sé que las respuestas sin un contexto específico son difíciles. Los puntos de discusión, consejos o debate son principalmente lo que estoy buscando y sería muy apreciado.

revs hulkmeister
fuente
La base de datos datomic.com está más cerca del usuario que las tradicionales relacionales. ¿Solo estás mirando las bases de datos tradicionales?
Trabajo
@ Job No, las bases de datos relacionales no son lo único que estoy considerando aquí. Se trata más de comprender la diferencia entre las estructuras de datos en lógica frente a las estructuras de datos en la base de datos / unidad de persistencia.
hulkmeister el
Como regla general, diría: use una base de datos si puede, pero si se vuelve demasiado lenta, recurra al uso de las estructuras de datos. La duplicación de datos (por ejemplo, el almacenamiento en caché) es mala porque debe mantener los dos sincronizados, así que evítelos a menos que no pueda.
Trabajo
¿Enviar datos a una base de datos solo para ordenarlos? ¿Te gusta conducir alrededor de la manzana para cambiar de opinión?

Respuestas:

18

Las estructuras de datos son, en su mayor parte:

  1. Residente de memoria,
  2. Transitorio,
  3. Limitado en tamaño,
  4. No volver a ingresar sin agregar mecanismos de concurrencia como bloqueos o inmutabilidad,
  5. No compatible con ACID ,
  6. Rápido, si se elige con cuidado.

Las bases de datos son, en su mayor parte:

  1. Enlazado a disco,
  2. Persistente,
  3. Grande,
  4. Con seguridad concurrente,
  5. ACID compatible, con capacidades transaccionales ,
  6. Más lento que las estructuras de datos.

Las estructuras de datos deben pasar de un lugar a otro y usarse internamente dentro de un programa. ¿Cuándo fue la última vez que envió datos desde una página web a un servidor web utilizando una base de datos, o realizó un cálculo en una base de datos que residía completamente en la memoria?

Los sistemas de bases de datos utilizan estructuras de datos como parte de su implementación interna. Es una cuestión de tamaño y alcance; usa estructuras de datos dentro de su programa, pero un sistema de base de datos es un programa en sí mismo.

Robert Harvey
fuente
Con respecto al comentario de la página web al servidor web, estoy de acuerdo en que no usaría la base de datos allí, pero veo la posibilidad de que haya un servlet para manejar o traducir esos datos para que persistan en la base de datos. Es entre el nivel medio y el nivel de datos donde las cosas se vuelven un poco confusas. Para simplificar la pregunta, ¿cuándo los métodos en la base de datos se vuelven menos beneficiosos de usar que los métodos en la lógica?
hulkmeister
1
Bueno, ese es el pan y la mantequilla del DAL, ¿no? Los DAL existen para facilitar la transición entre objetos y registros de bases de datos. Los DAL son buenos para alrededor del 80 al 90 por ciento de lo que desearía hacer con una base de datos, pero, para el 10 al 20 por ciento restante, es posible que desee volver a SQL sin procesar o procedimientos almacenados, porque es más eficiente.
Robert Harvey
En su ejemplo de clasificación / filtrado, tiene razón en que probablemente quiera realizar ese tipo de procesamiento en el servidor de la base de datos. Pero lo más probable es que aún reciba el resultado de ese procesamiento como alguna forma de estructura de datos.
Robert Harvey
Los puntos que has dado han sido realmente informativos. Sin embargo, todavía hay algo que me molesta acerca de los métodos (o algoritmos) que funcionan con la base de datos directamente o solo con las estructuras de datos estrictamente dentro de la lógica o ambas. Estoy viendo el ítem 6 de las dos listas que pones, y la pregunta que me viene a la mente es, ¿cómo es una más rápida que la otra? Siempre he percibido que trabajar con los datos en la fuente es la forma más rápida de hacer las cosas. Puedes actualizar dentro de tu publicación. Lo releeré.
hulkmeister el
1
Las bases de datos son más lentas por varias razones. A pesar del almacenamiento en caché, debe leer los datos del disco, utilizando una instrucción SQL que debe compilarse, con un plan de ejecución que frecuentemente involucra múltiples tablas. El proceso es mucho más complejo. Además, generalmente todavía tiene que transferir el resultado a través del cable, donde traduce los datos en estructuras de datos para poder trabajar con ellos.
Robert Harvey
6

¿Cuáles son las diferencias entre las estructuras de datos y las bases de datos?

En un nivel abstracto, no hay ninguno: una base de datos es una estructura de datos.

En un nivel específico, las bases de datos suelen tener el propósito de conservar datos, generalmente en un formato optimizado para inserciones, actualizaciones, recuperación, unión o algún otro propósito (o una combinación).

Por ejemplo, si compara una tabla en un RDBMS para decir una matriz de datos, la diferencia puede estar en el tiempo de ejecución del algoritmo, la cantidad de código que tiene que escribir, la cantidad de memoria que necesita para ejecutar el algoritmo, o La flexibilidad de trabajar / acceder a los datos desde fuera de su programa / algoritmo.

¿Cuándo usamos algoritmos que usan estructuras de datos definidas únicamente dentro de su propia lógica y no la de la base de datos?

En tendencia, argumentaría

a) usar una base de datos si necesita conservar los datos de manera que sea accesible más allá del tiempo de ejecución o el propósito del algoritmo específico.

b) usar su propia estructura de datos (en memoria) si la velocidad del tiempo de ejecución es importante o si no se requiere persistencia

Por ejemplo, si su algoritmo procesa registros de clientes, es posible que desee almacenar esos registros de clientes (por ejemplo, para encontrar todos los clientes en un área en particular) para su uso posterior por algún otro programa / algoritmo y para un propósito completamente diferente (por ejemplo, para encontrar los clientes más valiosos ) En ese caso, usar una base de datos para conservar los datos es probablemente una buena idea.

Sin embargo, tenga en cuenta que existe el concepto de bases de datos en memoria que no necesariamente conservan los datos, por razones de rendimiento. Por ejemplo, Redis o HANA .

¿Cuándo los métodos en la base de datos se vuelven menos eficientes de usar que los métodos en su propia lógica?

La respuesta depende en gran medida de las circunstancias y del (tipo de) base de datos en uso. Reformularía la pregunta a "¿qué hace que un método sea eficiente?" Luego se convierte en un ejercicio de evaluación de los métodos (= algoritmo) que usaría para su propia estructura de datos frente a los métodos utilizados por la base de datos. Ver también el siguiente punto.

¿Cómo es el procesamiento de datos con estructuras de datos más rápido que hacerlo en la base de datos?

Nuevamente, esto depende de los detalles. En general, el procesamiento de datos que están en la memoria, directamente accesibles para el proceso que ejecuta su algoritmo, es más rápido que enviar una solicitud a otro proceso (en la misma computadora o en una red) y pedirle que envíe los resultados. . Sin embargo, si los datos ya residen dentro de la base de datos, enviarle un comando, digamos una instrucción SQL para unir dos tablas y calcular alguna función agregada, y recuperar solo un pequeño resumen o subconjunto de los datos puede ser mucho más eficiente que transferir primero todos datos y calcular los resultados localmente (usando sus propias estructuras de datos).

miraculixx
fuente
1

El acceso al disco es principalmente lo que es más costoso en esta operación, más a menudo que el acceso a la red (http://serverfault.com/questions/238417/are-networks-now-faster-than-disks). A menos que su base de datos no esté ubicada en al menos una red de 1 Gbps y la misma red que su servidor web \ de aplicaciones, el rendimiento de la red no importará tanto como el rendimiento del disco para conjuntos de datos más grandes. O si sus datos residen en discos de estado sólido muy rápidos que serán más rápidos que el acceso típico a la red. Además, las bases de datos generalmente proporcionan un mecanismo de IPC como canalizaciones con nombre en lugar de usar TCP / IP si la base de datos reside en el mismo servidor que el servidor de aplicaciones.

Si puede mantener la mayor parte de la estructura de datos \ enire en la memoria entre solicitudes, esta será generalmente su apuesta más rápida. Si no puede, es difícil superar una buena estructura de base de datos con tablas normalizadas e índices adecuados para buscar y actualizar el rendimiento en cualquier cosa que no sea un conjunto pequeño de registros, especialmente en un sistema con millones de registros.

Las bases de datos relacionales generalmente usan un árbol B + o una variante del mismo debajo del capó y tienen muchas optimizaciones, como la alineación de datos en el disco y las agrupaciones de almacenamiento intermedio para los registros a los que se accede con frecuencia. Esto los hace sobresalir en el procesamiento rápido de grandes conjuntos de datos, especialmente si se trata de agregación o filtrado.

Peter Smith
fuente
Por favor, dime si entendí bien. Aplicando lo que dijiste, cada vez que pienso en trabajar con los datos, si puedo mantener el conjunto de trabajo en la memoria caché, eso es más rápido. De lo contrario, ¿intenta usar la base de datos para entregar esos resultados o encuentra alguna manera de involucrar más la consulta de la base de datos?
hulkmeister el
@hulkmeister sí, en general, a menos que el conjunto de datos sea muy pequeño o la base de datos sea remota a su ubicación en una red lenta.
Peter Smith
0

¿Qué quieres decir con una base de datos? ¿Te refieres a una base de datos relacional como MySQL o SQL Server? Una base de datos relacional es una estructura de metadatos que admite algún subconjunto de las operaciones definidas por el modelo relacional . La teoría del modelo relacional que fue desarrollada principalmente por Edgar Codd en los años 60.

El modelo relacional es de propósito muy general y flexible, pero eso significa que no puede aprovechar ninguna estructura en los datos o patrones de acceso. Las estructuras de datos son útiles cuando sabes algo sobre los datos y cómo se accederá a ellos. Por ejemplo, si sabe que los últimos datos que ingresó en una estructura de datos serán los primeros datos que desea obtener, puede usar una pila.

Llamé a la base de datos relacional una estructura de metadatos porque generalmente es una gran cantidad de software que utiliza muchas estructuras de datos como pilas, colas, árboles y listas para crear la estructura de datos abstractos de una tabla relacional.

Charles E. Grant
fuente
Lo siento, ¿solo necesito una aclaración sobre lo que significa "bastante taco" en relación con el último párrafo?
hulkmeister
@hulkmeister, lo siento, debería haber sido 'grande', no 'poco'. El modelo relacional es muy abstracto y bastante complejo. Proporcionar una implementación que realmente funcione adecuadamente, particularmente una que proporcione ACID ((Atomicidad, Consistencia, Aislamiento, Durabilidad) requiere una gran cantidad de código bastante sofisticado que se ejecuta detrás de escena.
Charles E. Grant