Was sind die Unterschiede zwischen Algorithmen, die Datenstrukturen verwenden, und Algorithmen, die Datenbanken verwenden?

10

Die allgemeine Frage

Was sind die Unterschiede zwischen Algorithmen, die Datenstrukturen verwenden, und Algorithmen, die Datenbanken verwenden?

Ein Kontext

Dies ist eine Frage, die mich seit einiger Zeit nervt, und ich konnte keine überzeugende Antwort darauf finden.

Derzeit arbeite ich daran, mein Verständnis von Algorithmen zu verbessern, die natürlich stark mit Datenstrukturen verbunden sind. Dies sind grundlegende Strukturen wie Bag, Queue, Stack, Priority Queue und Heap.

Ich verwende auch täglich Datenbanken, um die Daten zu speichern, die vom Endbenutzer verarbeitet und übermittelt oder vom Programm verarbeitet wurden. Ich rufe die Daten ab und sende sie über eine DAL, die über eigene Datenstrukturen verfügt, die basierend auf den Tabellen in der Datenbank generiert werden.

Meine Fragen kommen, wenn ich die Möglichkeit habe, die Daten mithilfe der Datenbank zu sortieren, um sie in aufsteigender / absteigender Reihenfolge geordnet an mich zurückzusenden oder die Daten abzurufen und in meine Logik zu laden, diese Daten in einer Prioritätswarteschlange zu verarbeiten und den Heap zu sortieren alles davon. Oder eine andere Möglichkeit besteht darin, mithilfe der Datenbank nach Datensätzen zu suchen, anstatt eine Teilmenge der Datensätze zu laden und mithilfe einer binären Suche den Datensatz oder die Datensätze zu finden, an denen ich interessiert bin.

In meinen Gedanken würde ich versuchen, möglichst viele Vorgänge auf der Datenbankebene durchzuführen, bevor sie gesendet werden, da die Kommunikation teuer ist. Ich frage mich daher auch, wann Sie Algorithmen und Datenstrukturen verwenden, die streng in Ihrer eigenen Logik definiert sind, um Daten zu verarbeiten, anstatt die der Datenbank.

Also hier sind die Fragen ...

Fragen

  1. Was sind die Unterschiede zwischen Datenstrukturen und Datenbanken?
  2. Wann verwenden wir Algorithmen, die Datenstrukturen verwenden, die ausschließlich in Ihrer eigenen Logik und nicht in der der Datenbank definiert sind?
  3. @ Harvey post: Wann werden die Methoden in der Datenbank weniger effizient als Methoden in Ihrer eigenen Logik?
    • @mirculixx post: Was macht eine Methode effizient?
  4. @ Harvey Post: Wie ist die Verarbeitung von Daten mit Datenstrukturen schneller als die Verarbeitung in der Datenbank?

Klarstellungen

  1. @Grant post: Die Datenbanken, mit denen ich normalerweise arbeite, sind relational, und diese Fragen ergeben sich aus der Arbeit mit ihnen. Ich denke jedoch, dass diese Fragen auf jedes Persistenz-Framework anwendbar sind (wenn ich Framework sage, meine ich das im allgemeinsten Sinne).

Ich weiß, dass Antworten ohne einen bestimmten Kontext schwierig sind. Denkanstöße, Ratschläge oder Diskussionspunkte sind hauptsächlich das, wonach ich suche und würden mich sehr freuen!

Hulkmeister
quelle
Die datomic.com- Datenbank ist näher am Benutzer als die herkömmlichen relationalen. Betrachten Sie nur die traditionellen Datenbanken?
Job
@Job Nein, relationale Datenbanken sind nicht das einzige, was ich hier in Betracht ziehe. Es geht mehr darum, den Unterschied zwischen Datenstrukturen in der Logik und den Datenstrukturen in der Datenbank / Persistenz-Einheit zu verstehen.
Hulkmeister
In der Regel würde ich sagen - verwenden Sie eine Datenbank, wenn Sie können, aber wenn sie zu langsam wird, verwenden Sie die Datenstrukturen. Das Duplizieren von Daten (z. B. Zwischenspeichern) ist schlecht, da Sie beide synchron halten müssen. Vermeiden Sie dies, es sei denn, Sie können dies nicht.
Job
Daten nur zum Sortieren an eine Datenbank senden? Sie möchten um den Block fahren, um Ihre Meinung zu ändern?

Antworten:

18

Datenstrukturen sind zum größten Teil:

  1. Speicherresident,
  2. Vorübergehend,
  3. Begrenzte Größe,
  4. Kein Wiedereintritt ohne Hinzufügen von Parallelitätsmechanismen wie Sperren oder Unveränderlichkeit,
  5. Nicht ACID- konform,
  6. Schnell, wenn sorgfältig ausgewählt.

Datenbanken sind zum größten Teil:

  1. Festplattengebunden,
  2. Hartnäckig,
  3. Groß,
  4. Sicher gleichzeitig,
  5. ACID-konform, mit Transaktionsfunktionen ,
  6. Langsamer als Datenstrukturen

Datenstrukturen sollen von einem Ort zum anderen weitergegeben und intern in einem Programm verwendet werden. Wann haben Sie das letzte Mal Daten von einer Webseite mithilfe einer Datenbank an einen Webserver gesendet oder eine Berechnung für eine Datenbank durchgeführt, die sich vollständig im Speicher befand?

Datenbanksysteme verwenden Datenstrukturen als Teil ihrer internen Implementierung. Es ist eine Frage der Größe und des Umfangs; Sie verwenden Datenstrukturen in Ihrem Programm, aber ein Datenbanksystem ist ein eigenständiges Programm.

Robert Harvey
quelle
In Bezug auf die Bemerkung von Webseite zu Webserver stimme ich zu, dass Sie die Datenbank dort nicht verwenden würden, aber ich sehe die Möglichkeit, dass es ein Servlet gibt, das diese Daten verarbeitet oder übersetzt, um in der Datenbank zu bleiben. Es ist zwischen der mittleren Ebene und der Datenebene, wo die Dinge etwas durcheinander geraten. Um die Frage zu vereinfachen: Wann sind die Methoden in der Datenbank weniger vorteilhaft als Methoden in der Logik?
Hulkmeister
1
Nun, das ist das Brot und die Butter des DAL, nicht wahr? Es gibt DALs, um den Übergang zwischen Objekten und Datenbankeinträgen zu erleichtern. DALs eignen sich für etwa 80 bis 90 Prozent dessen, was Sie mit einer Datenbank tun möchten. Für die verbleibenden 10 bis 20 Prozent möchten Sie möglicherweise auf unformatiertes SQL oder gespeicherte Prozeduren zurückgreifen, da dies effizienter ist.
Robert Harvey
In Ihrem Beispiel für das Sortieren / Filtern haben Sie Recht, dass Sie diese Art der Verarbeitung wahrscheinlich auf dem Datenbankserver durchführen möchten. Aber Sie würden höchstwahrscheinlich immer noch das Ergebnis dieser Verarbeitung als irgendeine Form von Datenstruktur erhalten.
Robert Harvey
Die Punkte, die Sie gegeben haben, waren wirklich informativ. Die Methoden (oder Algorithmen), die direkt mit der Datenbank oder nur mit den Datenstrukturen ausschließlich innerhalb der Logik oder beiden arbeiten, nerven mich jedoch immer noch. Ich betrachte Punkt 6 der beiden Listen, die Sie erstellt haben, und die Frage, die mir in den Sinn kommt, ist, wie eine schneller ist als die andere. Ich habe immer gesehen, dass die Arbeit mit den Daten an der Quelle der schnellste Weg ist, um Dinge zu erledigen. Sie können innerhalb Ihres Beitrags aktualisieren - ich werde es erneut lesen.
Hulkmeister
1
Datenbanken sind aus mehreren Gründen langsamer. Ungeachtet des Caching müssen Sie die Daten mithilfe einer SQL-Anweisung, die kompiliert werden muss, von der Festplatte lesen. Der Ausführungsplan enthält häufig mehrere Tabellen. Der Prozess ist viel komplexer. Darüber hinaus müssen Sie das Ergebnis in der Regel noch über das Netzwerk übertragen, wo Sie die Daten in Datenstrukturen übersetzen, damit Sie damit arbeiten können.
Robert Harvey
6

Was sind die Unterschiede zwischen Datenstrukturen und Datenbanken?

Auf abstrakter Ebene gibt es keine - eine Datenbank ist eine Datenstruktur.

Auf einer bestimmten Ebene haben Datenbanken normalerweise den Zweck, Daten zu speichern, normalerweise in einem Format, das entweder für Einfügungen, Aktualisierungen, Abrufen, Verbinden oder einen anderen Zweck (oder eine Kombination) optimiert ist.

Wenn Sie beispielsweise eine Tabelle in einem RDBMS mit einem Datenarray vergleichen, kann der Unterschied in der Laufzeit des Algorithmus, der Menge an Code, die Sie schreiben müssen, der Menge an Speicher, die Sie zum Ausführen des Algorithmus benötigen, oder liegen die Flexibilität, von außerhalb Ihres Programms / Algorithmus zu arbeiten / auf die Daten zuzugreifen.

Wann verwenden wir Algorithmen, die Datenstrukturen verwenden, die ausschließlich in Ihrer eigenen Logik und nicht in der der Datenbank definiert sind?

In der Tendenz würde ich argumentieren

a) Verwenden einer Datenbank, wenn Sie Daten auf eine Weise beibehalten müssen, auf die über die Laufzeit oder den Zweck des jeweiligen Algorithmus hinaus zugegriffen werden kann.

b) Verwenden Sie Ihre eigene (speicherinterne) Datenstruktur, wenn die Laufzeitgeschwindigkeit eine Rolle spielt oder keine Persistenz erforderlich ist

Wenn Ihr Algorithmus beispielsweise Kundendatensätze verarbeitet, möchten Sie diese Kundendatensätze möglicherweise speichern (z. B. um alle Kunden in einem bestimmten Bereich zu finden), um sie später von einem anderen Programm / Algorithmus zu verwenden und für einen ganz anderen Zweck (z. B. um die wertvollsten Kunden zu finden) ). In diesem Fall ist es wahrscheinlich eine gute Idee, eine Datenbank zum Speichern der Daten zu verwenden.

Beachten Sie jedoch, dass es das Konzept von In-Memory-Datenbanken gibt, bei denen Daten aus Leistungsgründen nicht unbedingt beibehalten werden. ZB Redis oder HANA .

Wann sind die Methoden in der Datenbank weniger effizient als Methoden in Ihrer eigenen Logik?

Die Antwort hängt sehr stark von den Umständen und der (Art der) verwendeten Datenbank ab. Ich würde die Frage umformulieren zu "Was macht eine Methode effizient?" Anschließend werden die Methoden (= Algorithmus) bewertet, die Sie für Ihre eigene Datenstruktur verwenden würden, im Vergleich zu den von der Datenbank verwendeten Methoden. Siehe auch nächster Punkt.

Wie ist die Verarbeitung von Daten mit Datenstrukturen schneller als die Verarbeitung in der Datenbank?

Dies hängt wiederum von den Besonderheiten ab. Im Allgemeinen ist die Verarbeitung von Daten im Arbeitsspeicher, auf die der Prozess, auf dem Ihr Algorithmus ausgeführt wird, direkt zugreifen kann, schneller als das Senden einer Anforderung an einen anderen Prozess (auf demselben Computer oder über ein Netzwerk) und das Zurücksenden der Ergebnisse . Wenn sich die Daten jedoch bereits in der Datenbank befinden, kann das Senden eines Befehls - beispielsweise einer SQL-Anweisung zum Verknüpfen zweier Tabellen und zum Berechnen einer Aggregatfunktion - und das Abrufen nur einer kleinen Zusammenfassung oder Teilmenge der Daten wesentlich effizienter sein als das erstmalige Übertragen aller Daten Daten und Berechnung der Ergebnisse lokal (unter Verwendung Ihrer eigenen Datenstrukturen).

Miraculixx
quelle
1

Der Festplattenzugriff ist bei diesem Vorgang in erster Linie am teuersten als der Netzwerkzugriff (http://serverfault.com/questions/238417/are-networks-now-faster-than-disks). Sofern sich Ihre Datenbank nicht in einem 1-Gbit / s-Netzwerk und im selben Netzwerk wie Ihr Web- / Anwendungsserver befindet, ist die Netzwerkleistung für größere Datenmengen nicht so wichtig wie die Festplattenleistung. Oder wenn sich Ihre Daten zufällig auf sehr schnellen Solid-State-Festplatten befinden, die schneller sind als der typische Netzwerkzugriff. Außerdem bieten Datenbanken normalerweise einen IPC-Mechanismus wie Named Pipes anstelle von TCP / IP, wenn sich die Datenbank auf demselben Server wie Ihr Anwendungsserver befindet.

Wenn Sie den größten Teil der gesamten Datenstruktur zwischen den Anforderungen im Speicher behalten können, ist dies im Allgemeinen die schnellste Wahl. Wenn Sie dies nicht können, ist es schwierig, eine gute Datenbankstruktur mit normalisierten Tabellen und geeigneten Indizes für die Such- und Aktualisierungsleistung für andere als kleine Datensätze zu übertreffen, insbesondere in einem System mit Millionen von Datensätzen.

Relationale Datenbanken verwenden normalerweise einen B + -Baum oder eine Variante davon unter der Haube und haben viele Optimierungen wie die Datenausrichtung auf Festplatten- und Pufferpools für Datensätze, auf die häufig zugegriffen wird. Dadurch können sie große Datenmengen schnell verarbeiten, insbesondere wenn es um Aggregation oder Filterung geht.

Peter Smith
quelle
Bitte sagen Sie mir, ob ich das richtig verstanden habe. Wenn ich das, was Sie gesagt haben, immer dann anwenden kann, wenn ich daran denke, mit den Daten zu arbeiten, wenn ich den Arbeitssatz im Speicher behalten kann, ist das schneller. Versuchen Sie andernfalls, die Datenbank zu verwenden, um diese Ergebnisse zu liefern, oder suchen Sie nach einer Möglichkeit, die Datenbank mehr abzufragen.
Hulkmeister
@hulkmeister ja im Allgemeinen, es sei denn, der Datensatz ist sehr klein oder die Datenbank befindet sich entfernt von Ihrem Standort in einem langsamen Netzwerk.
Peter Smith
0

Was meinst du mit einer Datenbank? Meinen Sie eine relationale Datenbank wie MySQL oder SQL Server? Eine relationale Datenbank ist eine Metadatenstruktur, die eine Teilmenge der vom relationalen Modell definierten Operationen unterstützt . Die Theorie des relationalen Modells, die in den 60er Jahren hauptsächlich von Edgar Codd ausgearbeitet wurde.

Das relationale Modell ist sehr universell und flexibel, aber das bedeutet, dass es die Struktur der Daten oder Zugriffsmuster nicht ausnutzen kann. Datenstrukturen sind nützlich, wenn Sie etwas über die Daten wissen und wissen, wie auf sie zugegriffen wird. Wenn Sie beispielsweise wissen, dass die letzten Daten, die Sie in eine Datenstruktur einfügen, die ersten Daten sind, die Sie ausgeben möchten, können Sie einen Stapel verwenden.

Ich habe die relationale Datenbank als Metadatenstruktur bezeichnet, da es sich im Allgemeinen um ein ziemlich großes Softwarepaket handelt, das viele Datenstrukturen wie Stapel, Warteschlangen, Bäume und Listen verwendet, um die abstrakte Datenstruktur einer relationalen Tabelle zu erstellen.

Charles E. Grant
quelle
Entschuldigung, brauchen Sie nur eine Klarstellung darüber, was "ziemlich wad" in Bezug auf den letzten Absatz bedeutet?
Hulkmeister
@hulkmeister, sorry das hätte 'groß' sein sollen nicht 'bit'. Das relationale Modell ist sehr abstrakt und ziemlich komplex. Die Bereitstellung einer Implementierung, die tatsächlich eine angemessene Leistung erbringt, insbesondere eine, die ACID ((Atomicity, Consistency, Isolation, Durability)) bereitstellt, erfordert eine Menge ziemlich ausgefeilten Codes, der hinter den Kulissen ausgeführt wird.
Charles E. Grant