Ist die Verwendung eines Datenbankservers sinnvoll, wenn die Anwendung nur lokale Aufgaben ausführt?


41

Ich habe einige Anwendungen gesehen, bei denen es sich im Wesentlichen um Anwendungssoftware handelt, die lokal auf dem System ausgeführt wird (sodass sie nicht viel über das Netzwerk kommunizieren). Diese Anwendungen scheinen von Datenbankservern abhängig zu sein, um ihre Daten zu speichern.

Ein Beispiel für eine Anwendung ist Amarok (ein beliebter Musikplayer unter Linux). Ich weiß nicht, ob sie das immer noch tun, aber ich erinnere mich, dass die Installation von Amarok bedeutete, dass Sie einen MySQL-Server installieren und ihn die ganze Zeit im Hintergrund laufen lassen mussten.

Was ist der Vorteil eines Servers für den lokalen Speicher im Vergleich zu einer kleineren Embedded SQL-Lösung wie SQLite? Ich spreche von Anwendungssoftware im Allgemeinen, nicht unbedingt von Amarok (das war nur ein Beispiel). Gibt es Situationen, in denen die Verwendung eines Datenbankservers im Vergleich zu einer eingebetteten Datenbank sinnvoll ist?


4
Eine Datenbank zu haben kann sehr wichtig sein. Eine In-Process-Datenbank oder eine Separate-Process-Datenbank ist eine Implementierungsentscheidung / -detail.
9000,

2
Ich verstehe das. Die Frage ist eher, warum Sie für lokale Anwendungen eine separate Prozessdatenbank (z. B. einen MySQL-Server) anstelle einer In-Process-Datenbank (z. B. SQLite) auswählen sollten.
9a3eedi

Antworten:


29

SQLite bietet eine ziemlich gute Übersicht darüber, wann es zu verwenden ist oder nicht, im Vergleich zu Alternativen:

https://www.sqlite.org/whentouse.html

Diese Zusammenfassung fasst den SQLite-Anwendungsfall meiner Erfahrung nach sehr gut zusammen:

SQLite konkurriert nicht mit Client / Server-Datenbanken. SQLite konkurriert mit fopen ().

In diesem Punkt wird der Artikel ausführlich behandelt. Es gibt auch einen Abschnitt mit dem Titel "Situationen, in denen ein Client / Server-RDBMS möglicherweise besser funktioniert". Kurz gesagt, sind sie:

  • Client / Server-Anwendungen : Mehrere Benutzer über ein Netzwerk.
  • Hochvolumige Websites : Entweder schreibintensiv oder leseintensiv genug, um Sharding zu erfordern.
  • Sehr große Datensätze : Größer als auf einer Festplatte angemessen gespeichert werden kann.
  • Hohe Parallelität : insbesondere gleichzeitige Schreibvorgänge.

@ 9a3eedi: Tatsächlich gibt es unter diesen vier Punkten keinen, der ein Szenario mit einem vollständigen Datenbankserver in Kombination mit lokalem Speicher beschreibt (insbesondere die ersten beiden sind das genaue Gegenteil davon). Möchten Sie uns also erklären, warum Sie sich für diesen Punkt entschieden haben? Antwort, obwohl es nicht zu Ihrer ursprünglichen Frage passt? Übrigens habe ich diese Antwort aus genau diesem Grund abgelehnt.
Doc Brown

@DocBrown: Spezielle Fälle , in denen Sie sollten eine Client / Server RDBMS sind [siehe Antwort] verwenden; für alles andere funktioniert SQLite einwandfrei. Ich bin mir nicht sicher, was dort unklar ist. Wenn Sie glauben, dass dies erforderlich ist, können Sie die Antwort jederzeit bearbeiten.
Denis de Bernardy

Die ursprüngliche Frage betraf bestimmte Fälle, in denen eine ac / s-Datenbank sinnvoll ist, wenn die Anwendung nur lokale Aufgaben ausführt (siehe Titel) oder einen Server für die lokale Speicherung verwendet ( siehe Fragentext ). Die vier obigen Szenarien sind entweder das genaue Gegenteil davon (die ersten beiden) oder sehr unwahrscheinlich oder ungewöhnlich als "lokale" Szenarien (die zweiten beiden). Also, was Sie geschrieben haben, ist nicht falsch, aber es passt nicht zu der Frage.
Doc Brown

@DocBrown - und die kurze Antwort lautet: Es macht keinen Sinn, es sei denn, Sie haben es mit übergroßen Datensätzen zu tun oder müssen gleichzeitig schreiben. (Oder aus offensichtlichen Gründen, wenn Sie etwas benötigen, das SQLite nicht bietet.) Wenn Ihnen dieser Punkt nicht klar ist, können Sie die Antwort auch hier bearbeiten.
Denis de Bernardy

Nun, wenn Sie wirklich glauben, dass diese Liste vollständig ist (und daher eine versteckte Aussage machen, dass die Verwendung eines C / S-DB-Servers für ein lokales Szenario keinen Sinn ergibt), dann bin ich anderer Meinung und glaube nicht, dass ich mich verbessern kann Ihre Antwort, indem Sie einige Klarstellungen hinzufügen.
Doc Brown

28

Selbst für ein einzelnes System mit einem einzelnen Benutzer ist ein "echter" Datenbankserver sinnvoll:

  1. Es wird eine vertraute Sprache ( SQL ) verwendet. SQLite verwendet SQL, aber einige eingebettete Datenbanken (z. B. Objektdatenbank , NoSQL ) verwenden kein SQL. Diese haben tendenziell eine höhere Lernkurve, da sie weniger häufig sind.
  2. Es bietet referenzielle Integrität, Einschränkungen, Trigger usw., die Produkte wie SQLite möglicherweise nicht oder zumindest nicht vollständig bereitstellen.
  3. Durch die Ausrichtung auf eine echte ACID- kompatible Mehrbenutzer- Netzwerkdatenbank kann die Anwendung in einem Einzelbenutzer- / Einzelarbeitsstationsszenario oder als gehostete Mehrbenutzeranwendung mit derselben Codebasis ausgeführt werden .
  4. Der Benutzer hat die Möglichkeit, die Daten offline mit Standardtools (z. B. SQL Developer, MySQL Workbench, SQL Server Management Studio) zu untersuchen, Daten mit diesen Tools zu laden oder zu sichern. Dies ist jedoch mit vielen eingebetteten Datenbanken verschiedener Art möglich Typen, Leute, die vielleicht besser mit diesen Tools aus der C / S-Datenbankwelt vertraut sind.

Der Hauptnachteil ist die Installation und Wartung der Datenbankserversoftware, die für nichttechnische Benutzer (und sogar für viele technische Benutzer) etwas komplex ist. Betriebssysteme wie Linux machen dies einfacher: Ich habe PostgreSQL und MySQL auf meinem Linux-System ausgeführt. Ich habe Anwendungen installiert, die sich mit wenig bis gar keiner Interaktion meinerseits in sie eingebunden haben.


9
Eigentlich ist es ein Datenbanksystem (nämlich Sybase SQL Anywhere) mit voller SQL - Unterstützung, referentielle Integrität, ACID, gespeicherte Prozeduren, die sie nicht eine Server - Konfiguration oder eine Installation als Dienst erfordern , wenn sie in einer lokalen Konfiguration laufen (obwohl es sein kann , Setup für eine Mehrbenutzerumgebung). Ich kenne kein anderes Datenbanksystem mit diesen Eigenschaften, wenn jemand eine kennt, würde mich interessieren.
Doc Brown

3
@DocBrown IIRC MS SQLServer Compact gibt Ihnen dies als DLL, obwohl LocalDB wahrscheinlich die bessere Wahl ist - die Installation als Dienst ist nicht erforderlich, erfordert jedoch Administratorrechte.
gbjbaanb

5
Neben SQLite, das in der Antwort merkwürdigerweise bereits erwähnt wurde, bieten eine Reihe von Nicht-SQL-Datenbanken und datenbankähnlichen Systemen, z. B. OrientDB, Solr und andere, eine spezielle Einbettungsunterstützung .
mikołak

14
SQLite bietet referenzielle Integrität (muss jedoch aktiviert sein) und grundlegende Einschränkungen. Es ist auch bedeutend schneller als die meisten Server, wenn es richtig verwendet wird. Der Hauptnachteil gegenüber dem Server besteht darin, dass es sich um einen Einzelschreiber handelt.
Jan Hudec

2
@DocBrown: Die eingebettete Datenbank von Firebird bietet vollständige SQL-Unterstützung, einschließlich referentieller Integrität, ACID-Garantien, gespeicherter Prozesse und Trigger. Es wurde nicht verwendet, um mehrere gleichzeitige Verbindungen zu einer eingebetteten Datenbank zu unterstützen, und ich bin nicht sicher, ob diese Einschränkung noch besteht oder nicht, aber der gesamte SQL-Funktionsumfang ist vorhanden.
Mason Wheeler

21

Ich denke, es hat mit Trägheit zu tun.

Amarok basiert auf XMMS aus dem Jahr 1997. Um gute Datenbankfähigkeiten zu haben, musste ein Server verwendet werden, da dieser viel leistungsfähiger war als die dateibasierten Lösungen, die auf keinen Fall über gute Datenbankfähigkeiten verfügten.

Die bevorstehende und zunehmende Beliebtheit guter lokaler eingebetteter Datenbanken wie SQLlite ist relativ neu.


Soweit ich mich erinnere, war AmaroK 1 (das möglicherweise auf XMMS basiert) nicht von einem Datenbankserver abhängig. Es war Amarok 2, das mit KDE4 veröffentlicht wurde und die Abhängigkeit einführte, und zu der Zeit fand ich es sehr seltsam, dass ich MySQL installieren und im Hintergrund
laufen lassen musste

10

Das wichtigste Unterscheidungsmerkmal ist die Nebenläufigkeit .

Wenn Sie nur eine Anwendung haben, die in einer Instanz für den Benutzer ausgeführt wird, ist die eingebettete Lösung (ob SQLite oder ein Objektspeicher) normalerweise in Ordnung.

Wenn Sie jedoch mehrere Instanzen haben, die die Datenbank gleichzeitig bearbeiten müssen, benötigen Sie einen Server, um sie zu synchronisieren. SQLite lässt nur einen Schreibzugriff auf die gesamte Datenbank zu, ebenso wie die meisten anderen eingebetteten Lösungen. Und wenn Sie sogar mehrere Anwendungen haben, müssen Sie wahrscheinlich detailliertere Bedingungen festlegen, die die eingebetteten Lösungen im Allgemeinen auch nicht zulassen.


5

Viele der anderen Antworten sprechen von Nebenläufigkeit als Vorteil. Da die Datenbank jedoch als Server ausgeführt wird, kann die Datenbank Aufgaben ausführen, ohne dass die Anwendung ausgeführt werden muss. Dies kann Wartung, Backups, Synchronisation mit einem anderen Server oder eine geplante Aufgabe sein.

Wenn Sie der Meinung sind, Ihre App könnte sich in eine Client / Server-App verwandeln, sollten Sie ein RDBMS von Anfang an verwenden, anstatt es später zu portieren.

Ich habe keine Ahnung, ob das gegebene Beispiel dies ausnutzt oder nicht.


2

Wenn Sie kein Embedded-System mit wenig Arbeitsspeicher und CPU betreiben, schadet es Ihnen meiner Meinung nach nicht, wenn Sie einen Server im Hintergrund betreiben.

Das lokale Ausführen eines Datenbankservers ist in Ordnung. Die Datenbank soll auf Daten zugreifen und diese bearbeiten. Der Netzwerkzugriff ist ein Plus, der möglicherweise benötigt wird oder nicht. Es gibt einige technische und wissenschaftliche Werkzeuge, die dies tun.

Angenommen, Sie verwenden Daten in einer lokalen Anwendung. Warum sollten Sie keine Datenbank verwenden? im gegensatz zu was?


Wenn ich eine Anwendung für normale Benutzer bereitstellen würde (z. B. einen Musik-Player wie AmaroK), würde ich meinen, dass die Installation von MySQL-Server und die Ausführung im Hintergrund eine etwas zu große Systemanforderung darstellen und von den Benutzern ausgeführt werden nicht wie. Aber ich denke, es hängt von der Anwendung ab. Dies ist im Gegensatz zur Verwendung von SQLite.
9a3eedi

2

Dies hängt von Ihrer Datenabstraktion und dem gesamten Anwendungsbereich, den Anforderungen an das Zugriffsmanagement, den geplanten Investitionen in die Datenpflege, der Dringlichkeit des erforderlichen Prototyps und dem Lernstand ab.

Wenn Sie eine eng integrierte Datenbank für eine Anwendung sicherstellen möchten, auf die keine anderen Anwendungen zugreifen müssen, erstellen Sie Inseln mit eingebetteter Datenbank. Als Beispiel sei die Mozilla Firefox Web Storage-Implementierung mit SQLite genannt.

Wenn Sie mit begrenzten Datenmengen noch effizienter arbeiten möchten, ist eine Auswahl an In-Memory-Datenbanken vorzuziehen.

Auf der anderen Seite ist ein zentrales DBMS erforderlich, wenn in vielen Anwendungen mehrere Abfragen für dieselben Daten ausgeführt werden und eine bessere Strukturierung der Datenspeicherung erforderlich ist, um die Leistung zu optimieren. Ich werde es unbedingt für wissenschaftliche Forschung bevorzugen, wenn es eine große Datenmenge erfordert und die Antwortzeit für Abfragen die allgemeine Benutzererfahrung drastisch beeinflusst.

Für den Amarok-Fall war es vermutlich eine Auswahl von Open-Source-DBMS zu dieser Zeit, bevor sie den Pfad eingebetteter Datenbanken wählten.

Wenn Sie eine bestimmte Systemdefinition zur Hand haben, ist es einfacher, Nachteile und Vorteile zu gewichten.

V / r, Umut

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.