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
- ¿Cuáles son las diferencias entre las estructuras de datos y las bases de datos?
- ¿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?
- 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?
- @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
- 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.
fuente
Respuestas:
Las estructuras de datos son, en su mayor parte:
Las bases de datos son, en su mayor parte:
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.
fuente
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.
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 .
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.
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).
fuente
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.
fuente
¿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.
fuente