Gute Gründe, KEINE relationale Datenbank zu verwenden?


139

Können Sie bitte auf alternative Datenspeicherungs-Tools verweisen und gute Gründe für deren Verwendung anstelle guter alter relationaler Datenbanken angeben? Meiner Meinung nach nutzen die meisten Anwendungen selten die volle Leistung von SQL - es wäre interessant zu sehen, wie eine SQL-freie Anwendung erstellt wird.

Antworten:


148

Einfache Textdateien in einem Dateisystem

  • Sehr einfach zu erstellen und zu bearbeiten
  • Benutzer können einfach mit einfachen Tools (z. B. Texteditoren, Grep usw.) arbeiten.
  • Effiziente Speicherung von Binärdokumenten

XML- oder JSON-Dateien auf der Festplatte

  • Wie oben, jedoch mit etwas mehr Fähigkeit, die Struktur zu validieren.

Tabellenkalkulations- / CSV-Datei

  • Sehr leicht zu verstehendes Modell für Geschäftsanwender

Subversion (oder ein ähnliches festplattenbasiertes Versionskontrollsystem)

  • Sehr gute Unterstützung für die Versionierung von Daten

Berkeley DB (Grundsätzlich eine festplattenbasierte Hashtabelle)

  • Konzeptionell sehr einfach (nur nicht eingegebener Schlüssel / Wert)
  • Ziemlich schnell
  • Kein Verwaltungsaufwand
  • Unterstützt Transaktionen, glaube ich

Amazon Simple DB

  • Ähnlich wie Berkeley DB, glaube ich, aber gehostet

Googles App Engine-Datenspeicher

  • Gehostet und hoch skalierbar
  • Schlüsselwertspeicherung pro Dokument (dh flexibles Datenmodell)

CouchDB

  • Dokumentfokus
  • Einfache Speicherung von halbstrukturierten / dokumentbasierten Daten

Muttersprachensammlungen (im Speicher gespeichert oder auf der Festplatte serialisiert)

  • Sehr enge Sprachintegration

Benutzerdefinierte (handgeschriebene) Speicher-Engine

  • Potenziell sehr hohe Leistung in erforderlichen Anwendungsfällen

Ich kann nicht behaupten, viel über sie zu wissen, aber Sie möchten vielleicht auch einen Blick auf Objektdatenbanksysteme werfen .


10
Es wäre großartig, wenn Sie auch die Nachteile jeder Wahl erläutern würden. Wie soll man sonst wählen? Danke,
Sklivvz

4
Das Schreiben von Millionen von Zeilen in eine Datenbank kann einen Tag dauern, während das Anhängen von einer Million Protokollzeilen an eine Datei nur wenige Minuten dauert. Ich werde nie verstehen, warum Leute darauf bestehen, Protokolldaten in eine Datenbank zu stellen.
Aaron Digulla

33
Aaron: Ich habe einen Grund: SELECT Nachrichten FROM log WHERE (Datum ZWISCHEN 2009-01-01 UND 2009-03-01) AND type = 'error' AND system = 'windows' :) Wie würden Sie das aus einer Textdatei laden? ?
Tomáš Fejfar

1
Ich bin nach Möglichkeit stark für Textdateien. Sie können sie nicht immer verwenden, aber wenn Sie können, sind sie viel einfacher zu diagnostizieren.
Loren Pechtel

berkeley db hat definitiv transaktionen. Textdateien und XML / JSON-Dateien tun dies nicht, sodass Multithread-Apps sie stampfen können, wenn Sie nicht vorsichtig sind. CSV-Dateien eignen sich hervorragend für die Sammlung von Parametern, da Geschäftsbenutzer sie einfach anzeigen und ohne zusätzliche Tools bearbeiten können. Textdateien eignen sich hervorragend für Anwendungen zum einmaligen Schreiben / Lesen fast nie wie die Protokollierung. Um einen Ansatz zu wählen, müssen Sie herausfinden, was Sie erreichen wollen
O. Jones

26

Die Antwort von Matt Sheppard ist großartig (mod up), aber ich würde diese Faktoren berücksichtigen, wenn ich an eine Spindel denke:

  1. Struktur: Bricht es offensichtlich in Stücke oder machen Sie Kompromisse?
  2. Verwendung: Wie werden die Daten analysiert / abgerufen / erfasst?
  3. Lebensdauer: Wie lange sind die Daten nützlich?
  4. Größe: Wie viele Daten gibt es?

Ein besonderer Vorteil von CSV-Dateien gegenüber RDBMS besteht darin, dass sie leicht komprimiert und auf praktisch jeden anderen Computer übertragen werden können. Wir führen große Datenübertragungen durch, und alles ist einfach genug. Wir verwenden nur eine große CSV-Datei und können mit Tools wie rsync einfach skripten. Um die Wiederholung großer CSV-Dateien zu verringern, können Sie beispielsweise YAML verwenden . Ich bin mir nicht sicher, ob ich etwas wie JSON oder XML speichern würde, es sei denn, Sie hatten erhebliche Beziehungsanforderungen.

Bei nicht erwähnten Alternativen sollten Sie Hadoop , eine Open-Source-Implementierung von MapReduce , nicht außer Acht lassen. Dies sollte gut funktionieren, wenn Sie eine TONNE lose strukturierter Daten haben, die analysiert werden müssen, und Sie möchten sich in einem Szenario befinden, in dem Sie nur 10 weitere Maschinen hinzufügen können, um die Datenverarbeitung zu handhaben.

Zum Beispiel habe ich versucht, die Leistung zu analysieren, bei der es sich im Wesentlichen um alle Zeitnummern verschiedener Funktionen handelt, die auf rund 20 Computern protokolliert wurden. Nachdem ich versucht hatte, alles in ein RDBMS zu stecken, wurde mir klar, dass ich die Daten nach der Aggregation wirklich nicht erneut abfragen muss. Und es ist nur in seinem aggregierten Format für mich nützlich. Also behalte ich die Protokolldateien bei, komprimiere sie und lasse die aggregierten Daten in einer Datenbank.

Hinweis: Ich bin eher daran gewöhnt, mit "großen" Größen zu denken.


5
Eine Gefahr von CSV-Dateien besteht darin, dass das Entkommen richtig gemacht werden muss. Es ist einfach, einen CSV-Reader oder -Schreiber zu implementieren, der der Spezifikation nicht wirklich entspricht, da er so täuschend einfach aussieht und einige Feinheiten aufweist: en.wikipedia.org/wiki/Comma-separated_values#Specification
Jared Updike

10

Das Dateisystem ist praktisch zum Speichern von Binärdaten, was in relationalen Datenbanken nie besonders gut funktioniert.



6

Wenn Sie keine ACID benötigen , benötigen Sie wahrscheinlich nicht den Overhead eines RDBMS. Stellen Sie also zuerst fest, ob Sie das benötigen. Die meisten der hier bereitgestellten Nicht-RDBMS-Antworten enthalten keine ACID.


1
Können Sie ein Beispiel geben, warum / wenn ACID nicht benötigt wird?
Ivan Voroshilin

1
@vibneiro, wenn die Datenbank nur einen einzigen Benutzer hat, der nur sequentielle Operationen ausführt, oder das Risiko von Datenbankinkonsistenzen im Falle eines Stromausfalls akzeptabel ist oder das Konzept der Datenbanktransaktionen nicht gilt oder keine Einschränkungen erforderlich sind, Kaskaden, Trigger oder dergleichen, dann kann ein Nicht- ACID- Nicht-RDBMS-Anbieter (z. B. eine Textdatei mit einer RDBMS-ähnlichen API) ausreichen. Beispielsweise kann Ihre Anwendung eine Datenbank mit historischen Diagnosemeldungen führen, für die ACID völlig irrelevant ist und "log.txt" ausreicht.
Bzlm

Es stellt sich heraus, dass in sehr seltenen Fällen keine Säure benötigt wird. Ich frage mich, warum dann NoSQL-Datenbanken so beliebt sind. Die meisten von ihnen unterstützen nicht die volle SÄURE.
Ivan Voroshilin

@vibneiro, NoSQL ist normalerweise einfacher, leichter, einbettbarer, selbsthostbarer, intuitiver, flexibler und normalerweise mit etwas ACID. Wenn Sie keine relationalen Daten haben, ist ein RDBMS wahrscheinlich nicht das, was Sie brauchen.
Bzlm

6

Benutzerdefinierte (handgeschriebene) Speicher-Engine / Potenziell sehr hohe Leistung in erforderlichen Anwendungsfällen

http://www.hdfgroup.org/

Wenn Sie über enorme Datenmengen verfügen, können Sie HDF, das hierarchische Datenformat, verwenden, anstatt Ihre eigenen zu rollen.

http://en.wikipedia.org/wiki/Hierarchical_Data_Format :

HDF unterstützt verschiedene Datenmodelle, einschließlich mehrdimensionaler Arrays, Rasterbilder und Tabellen.

Es ist auch hierarchisch wie ein Dateisystem, aber die Daten werden in einer magischen Binärdatei gespeichert.

HDF5 ist eine Suite, die die Verwaltung extrem großer und komplexer Datensammlungen ermöglicht.

Denken Sie an Petabyte an NASA / JPL-Fernerkundungsdaten.


4

Tag auch,

Ein Fall, an den ich denken kann, ist, wenn die Daten, die Sie modellieren, nicht einfach in einer relationalen Datenbank dargestellt werden können.

Ein solches Beispiel ist die Datenbank, die von Mobilfunkbetreibern zur Überwachung und Steuerung von Basisstationen für Mobilfunknetze verwendet wird.

In fast allen diesen Fällen wird eine OO-Datenbank verwendet, entweder ein kommerzielles Produkt oder ein selbstgerolltes System, das Hierarchien von Objekten ermöglicht.

Ich habe an einer 3G-Überwachungsanwendung für ein großes Unternehmen gearbeitet, das namenlos bleibt, dessen Logo jedoch ein Rotweinfleck ist (- :, und sie haben eine solche OO-Datenbank verwendet, um alle verschiedenen Attribute für einzelne Zellen innerhalb der zu verfolgen Netzwerk.

Die Abfrage solcher DBs erfolgt mit proprietären Techniken, die normalerweise vollständig frei von SQL sind.

HTH.

Prost,

rauben


4
Warum eignen sich Basisstationsdaten nicht gut für das relationale Modell?
Kaybenleroll

3

Objektdatenbanken sind keine relationalen Datenbanken. Sie können sehr praktisch sein, wenn Sie nur einige Objekte in eine Datenbank einfügen möchten. Sie unterstützen auch die Versionierung und ändern Klassen für Objekte, die bereits in der Datenbank vorhanden sind. db4o ist der erste, der mir in den Sinn kommt.


3

In einigen Fällen (z. B. Finanzmarktdaten und Prozesskontrolle) müssen Sie möglicherweise eine Echtzeitdatenbank anstelle eines RDBMS verwenden. Siehe Wiki-Link


3

Vor einigen Jahren wurde ein RAD-Tool namens JADE geschrieben, das über ein integriertes OODBMS verfügt. Frühere Inkarnationen der DB-Engine unterstützten auch Digitalk Smalltalk. Wenn Sie die Anwendungserstellung mit einem Nicht-RDBMS-Paradigma testen möchten, ist dies möglicherweise ein Anfang.

Andere OODBMS-Produkte umfassen Objectivity , GemStone (Sie benötigen VisualWorks Smalltalk, um die Smalltalk-Version auszuführen, es gibt jedoch auch eine Java-Version). Es gab auch einige Open-Source-Forschungsprojekte in diesem Bereich - EXODUS und sein Nachkomme SHORE kommen in den Sinn.

Leider schien das Konzept einen Tod zu erleiden, wahrscheinlich aufgrund des Fehlens eines klar sichtbaren Standards und der relativ schlechten Ad-hoc-Abfragefähigkeit im Vergleich zu SQL-basierten RDMBS-Systemen.

Ein OODBMS eignet sich am besten für Anwendungen mit Kerndatenstrukturen, die am besten als Diagramm miteinander verbundener Knoten dargestellt werden. Ich habe immer gesagt, dass die Quintessenz der OODBMS-Anwendung ein Multi-User-Dungeon (MUD) ist, in dem Räume Avatare von Spielern und andere Objekte enthalten.


2
Früher war es richtig, dass Sie einen Client Smalltalk benötigten, um GemStone / S (für Desktop-Apps) zu verwenden, aber mit den Webframeworks Aida ( aidaweb.si ) und Seaside ( seaside.st ) kann GemStone / S direkt als Anwendung verwendet werden Server. Siehe die Informationen auf GLASS ( seaside.gemstone.com )
Dale Henrichs

Ein weiterer Grund wäre, wenn Sie sich für die Datenqualität interessieren. In einem OODB wie Gemstone ist es viel einfacher, komplexe Gültigkeitsregeln durchzusetzen.
Stephan Eggermont

Die Ad-hoc-Abfragefunktionen von OODBMS sind viel besser als die von SQL-basierten RDBMS-es
Stephan Eggermont

1

Sie können einen langen Weg gehen, indem Sie nur Dateien verwenden, die im Dateisystem gespeichert sind. RDBMSs können Blobs immer besser verarbeiten. Dies kann jedoch eine natürliche Methode sein, um Bilddaten und dergleichen zu verarbeiten, insbesondere wenn die Abfragen einfach sind (Auflisten und Auswählen einzelner Elemente).

Andere Dinge, die nicht sehr gut in ein RDBMS passen, sind hierarchische Datenstrukturen, und ich vermute, dass Geodaten und 3D-Modelle auch nicht so einfach zu bearbeiten sind.

Dienste wie Amazon S3 bieten einfachere Speichermodelle (Schlüssel-> Wert), die SQL nicht unterstützen. Skalierbarkeit ist dort der Schlüssel.

Excel-Dateien können ebenfalls nützlich sein, insbesondere wenn Benutzer in der Lage sein müssen, die Daten in einer vertrauten Umgebung zu bearbeiten und eine vollständige Anwendung zu erstellen, um dies zu tun, ist dies nicht möglich.


1

Es gibt eine Vielzahl von Möglichkeiten zum Speichern von Daten - selbst "relationale Datenbanken" decken eine Reihe von Alternativen ab, von einer einfachen Codebibliothek, die eine lokale Datei (oder Dateien) so manipuliert, als wäre es eine relationale Datenbank auf Einzelbenutzerbasis dateibasierte Systeme, die mehrere Benutzer mit einer großzügigen Auswahl seriöser "serverbasierter" Systeme versorgen können.

Wir verwenden häufig XML-Dateien - Sie erhalten gut strukturierte Daten, nützliche Tools zum Abfragen derselben sowie die Möglichkeit, gegebenenfalls Änderungen vorzunehmen, etwas, das von Menschen gelesen werden kann, und Sie müssen sich dann keine Gedanken über die Funktionsweise der DB-Engine (oder die Funktionsweise der) machen DB-Motor). Dies funktioniert gut für Dinge, die im Wesentlichen schreibgeschützt sind (in unserem Fall meistens aus einer Datenbank an anderer Stelle generiert), und auch für Einzelbenutzersysteme, bei denen Sie die Daten einfach laden und nach Bedarf speichern können - aber Sie schaffen Möglichkeiten bei Problemen, wenn Sie mehrere Benutzer bearbeiten möchten - mindestens eine einzelne Datei.

Für uns ist das schon alles - wir werden entweder etwas verwenden, das SQL unterstützt (MS bietet eine Reihe von Tools an, die von einer DLL ausgeführt werden, um Einzelbenutzer-Aufgaben bis hin zum Unternehmensserver auszuführen, und alle sprechen dasselbe SQL (mit Einschränkungen am unteren Ende)) oder wir werden XML als Format verwenden, da (für uns) die Ausführlichkeit selten ein Problem darstellt.

Wir müssen derzeit keine Binärdaten in unseren Apps bearbeiten, damit diese Frage nicht auftaucht.

Murph


1

Möglicherweise möchten Sie die Verwendung eines LDAP-Servers anstelle einer herkömmlichen SQL-Datenbank in Betracht ziehen, wenn die Anwendungsdaten stark schlüssel- / wertorientiert und hierarchisch sind.


1

BTree-Dateien sind oft viel schneller als relationale Datenbanken. SQLite enthält eine BTree-Bibliothek, die gemeinfrei ist (wie in echt 'gemeinfrei', ohne den Begriff lose zu verwenden).

Ehrlich gesagt, wenn ich ein Mehrbenutzersystem wollte, müsste ich viel davon überzeugen, keine anständige relationale Serverdatenbank zu verwenden.


BTrees sind die grundlegende Implementierung normaler Indizes. Oracle unterstützt indexorganisierte Tabellen, die nur eine als Index implementierte Tabelle sind. Sie sind schneller zu lesen, langsamer zu schreiben und verwenden einen B-Baum. Siehe: < oracle.com/technology/products/oracle9i/datasheets/iots/… >
Borjab

1

Volltextdatenbanken, die mit Proximity-Operatoren wie "innerhalb von 10 Wörtern von" usw. abgefragt werden können.

Relationale Datenbanken sind für viele Zwecke ein ideales Geschäftswerkzeug - einfach zu verstehen und zu entwerfen, schnell genug, angemessen, auch wenn sie nicht von einem Genie entworfen und optimiert wurden, das "die volle Leistung nutzen" kann usw.

Einige Geschäftszwecke erfordern jedoch eine Volltextindizierung, die relationale Engines entweder nicht bereitstellen oder nachträglich in Angriff nehmen. Insbesondere in den Bereichen Recht und Medizin gibt es große Mengen unstrukturierten Textes zum Speichern und Durchblättern.


1

Außerdem: * Eingebettete Szenarien - Wo normalerweise etwas kleineres als ein vollwertiges RDBMS verwendet werden muss. Db4o ist eine ODB, die in einem solchen Fall leicht verwendet werden kann. * Schnelle oder Proof-of-Concept-Entwicklung - hier möchten Sie sich auf das Geschäft konzentrieren und müssen sich keine Gedanken über die Persistenzschicht machen


1

Der CAP-Satz erklärt es kurz und bündig. SQL bietet hauptsächlich "Starke Konsistenz: Alle Clients sehen dieselbe Ansicht, auch wenn Aktualisierungen vorhanden sind".


1

KISS: Halte es klein und einfach


1
Das ist die höfliche Version ... Ich habe öfter gehört "Halte es einfach, dumm" ... oder, schluck, vielleicht ist es genau das, was mir die Leute sagen! :-(
GreenMatt

1

Ich würde RDBMS anbieten :) Wenn Sie keine Probleme mit der Einrichtung / Verwaltung haben möchten, wählen Sie SQLite. Eingebautes RDBMS mit vollständiger SQL-Unterstützung. Sie können sogar jeden Datentyp in einer beliebigen Spalte speichern.

Hauptvorteil gegenüber beispielsweise einer Protokolldatei: Wenn Sie eine große haben, wie werden Sie darin suchen? Mit der SQL Engine erstellen Sie einfach einen Index und beschleunigen den Betrieb erheblich.

Informationen zur Volltextsuche: SQLite verfügt auch über Module für die Volltextsuche.

Genießen Sie einfach eine schöne Standardschnittstelle zu Ihren Daten :)


0

Ein guter Grund, keine relationale Datenbank zu verwenden, ist, wenn Sie über einen massiven Datensatz verfügen und eine massiv parallele und verteilte Verarbeitung der Daten durchführen möchten. Der Google Web Index wäre ein perfektes Beispiel für einen solchen Fall.

Hadoop hat auch eine Implementierung des Google-Dateisystems namens Hadoop Distributed File System .


0

Ich würde Lua dringend als Alternative zur Datenspeicherung nach SQLite empfehlen.

Weil:

  • Die Sprache wurde zunächst als Datenbeschreibungssprache konzipiert
  • Die Syntax ist für Menschen lesbar (XML nicht ).
  • Man kann Lua-Chunks für zusätzliche Leistung zu Binärdateien kompilieren

Dies ist die Option "Sammlung von Muttersprachen" der akzeptierten Antwort. Wenn Sie C / C ++ als Anwendungsebene verwenden, ist es durchaus sinnvoll, die Lua-Engine (100 KB Binärdatei) nur zum Lesen oder Ausschreiben von Konfigurationen / Daten einzusetzen.


Lua ist eine Programmiersprache. Dieser Vorschlag könnte verallgemeinert werden, um Persistenz- / Serialisierungsfunktionen einer beliebigen Programmiersprache vorzuschlagen (z. B. Pickle / Shelve in Python oder JSON / YAML für Perl et al. Usw.). Dies gilt überhaupt nicht für gleichzeitigen Zugriff und ACID-Garantien.
Jim Dennis

Du hast recht. Was in meinem Eintrag fehlte, war die implizite schreibgeschützte Natur einer solchen Verwendung. In einem solchen Szenario halte ich an meinem Text fest. Für das Lesen und Schreiben macht die Verwendung von Lua auf diese Weise absolut keinen Sinn. In vielen Fällen sind Metadaten eines Dateisystems meist schreibgeschützt, sodass ein solcher Ansatz keine vollständige Ro-Anforderung bedeutet.
Akauppi
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.