Warum sollten Sie SQLite verwenden?

Wenn Sie bei fast allen Geschäftsanwendungen die Haube anheben, erfahren Sie, wie Sie strukturierte Daten speichern und verwenden können. Unabhängig davon, ob es sich um eine clientseitige App, eine App mit einem Web-Front-End oder eine Edge-Device-App handelt, ist wahrscheinlich eine eingebettete Datenbank erforderlich.

SQLite ist eine einbettbare Open-Source-Datenbank, die in C geschrieben und mit herkömmlichem SQL abfragbar ist und diese Anwendungsfälle und mehr abdeckt. SQLite ist schnell, portabel und zuverlässig, unabhängig davon, ob Sie nur Kilobyte Daten oder Multi-Gigabyte-Blobs speichern.

Wo Sie SQLite verwenden können

Einer der größten Vorteile von SQLite ist, dass es fast überall ausgeführt werden kann. SQLite wurde auf eine Vielzahl von Plattformen portiert: Windows, MacOS, Linux, iOS, Android und mehr. Insbesondere Windows-Benutzer können vorkompilierte Binärdateien für reguläres Win32, UWP, WinRT und .Net verwenden. Unabhängig vom Bereitstellungsziel für Ihre App steht wahrscheinlich eine SQLite-Edition zur Verfügung oder eine Möglichkeit, den C-Quellcode auf dieses Ziel zu portieren.

Apps, die SQLite verwenden, müssen nicht in einer bestimmten Sprache geschrieben sein, solange es eine Möglichkeit gibt, in C. geschriebene externe Bibliotheken zu binden und mit diesen zu arbeiten. Die Binärdateien von SQLite sind in sich geschlossen, sodass für die Bereitstellung keine besondere Magie erforderlich ist. Sie können einfach in dasselbe Verzeichnis wie die Anwendung verschoben werden.

Viele Sprachen verfügen über allgemeine Bindungen für SQLite als Bibliothek und können diese in Verbindung mit anderen Datenbankzugriffsebenen für die Sprache verwenden. Python bündelt beispielsweise die SQLite-Bibliothek als Standardelement mit der Standardversion des Python-Interpreters. Darüber hinaus haben Dritte eine Vielzahl von ORMs und Datenschichten geschrieben, die SQLite verwenden, sodass Sie nicht über unformatierte SQL-Zeichenfolgen (die nicht nur ungeschickt, sondern auch potenziell gefährlich sind) auf SQLite zugreifen müssen.

Schließlich ist der Quellcode für SQLite gemeinfrei, sodass er ohne praktische Einschränkungen in anderen Programmen wiederverwendet werden kann.

SQLite Vorteile

Der häufigste und offensichtlichste Anwendungsfall für SQLite ist die Verwendung einer herkömmlichen, tabellenorientierten relationalen Datenbank. SQLite unterstützt Transaktionen und atomares Verhalten, sodass Sie bei einem Programmabsturz oder sogar einem Stromausfall keine beschädigte Datenbank erhalten.

SQLite verfügt über Funktionen in High-End-Datenbanken wie die Volltextindizierung und die Unterstützung von JSON-Daten. Anwendungsdaten, die normalerweise in halbstrukturierten Formaten wie YAML oder XML gespeichert sind, können als SQLite-Tabellen gespeichert werden, sodass auf die Daten einfacher zugegriffen und sie schneller verarbeitet werden können.

SQLite bietet auch eine schnelle und leistungsstarke Möglichkeit zum Speichern von Konfigurationsdaten für ein Programm. Anstatt ein Dateiformat wie YAML zu analysieren, kann ein Entwickler SQLite als Schnittstelle zu diesen Dateien verwenden - oft viel schneller als manuell zu bearbeiten. SQLite kann mit speicherinternen Daten oder externen Dateien (z. B. CSV-Dateien) arbeiten, als wären sie native Datenbanktabellen, und bietet eine praktische Möglichkeit, diese Daten abzufragen.

Da SQLite eine einzelne eigenständige Binärdatei ist, ist es einfach, sie mit einer App bereitzustellen und bei Bedarf mit der App zu verschieben. Jede von SQLite erstellte Datenbank enthält auch eine einzelne Datei, die mithilfe von SQL-Befehlen komprimiert oder optimiert werden kann.

Binäre Erweiterungen von Drittanbietern für SQLite bieten noch mehr Funktionen. SQLCipher fügt SQLite-Datenbankdateien eine 256-Bit-AES-Verschlüsselung hinzu. Mit SQLite-Bloomfilter können Sie Bloom-Filter aus Daten in einem bestimmten Feld erstellen.

Viele andere Projekte von Drittanbietern bieten zusätzliche Tools für SQLite, z. B. die Visual Studio Code-Erweiterung, mit der Datenbanken in Visual Studio Code durchsucht werden können, oder die interaktive LiteCLI-Befehlszeile für SQLite. Eine kuratierte Liste von SQLite-Ressourcen auf GitHub enthält viele weitere.

SQLite vs. MySQL 

SQLite wird am häufigsten mit MySQL (oder MariaDB) verglichen - dem weit verbreiteten Open-Source-Datenbankprodukt, das ein Grundnahrungsmittel der heutigen Anwendungsstapel ist. So sehr SQLite auch MySQL ähnelt, es gibt viele Unterschiede zwischen diesen beiden Datenbanken - und gute Gründe, je nach Anwendungsfall eine gegenüber der anderen zu bevorzugen.

Datentypen

SQLite hat relativ wenige Datentypen - BLOB, NULL, INTEGER und TEXT. MySQL (oder MariaDB) hingegen verfügt über dedizierte Datentypen für Datum und Uhrzeit, verschiedene Präzisionen von Ganzzahlen und Gleitkommazahlen und vieles mehr.

Wenn Sie relativ wenige Datentypen speichern oder Ihre Datenschicht zur Validierung der Daten verwenden möchten, ist SQLite hilfreich. Wenn Sie jedoch möchten, dass Ihre Datenschicht eine eigene Validierung und Normalisierung bietet, wählen Sie MySQL (oder MariaDB).

Konfiguration und Abstimmung

Die Konfigurations- und Optimierungsoptionen von SQLite sind minimal. Die meisten internen oder Befehlszeilen-Flags für SQLite befassen sich mit Randfällen oder Abwärtskompatibilität. Dies passt zur allgemeinen Philosophie von SQLite: Vereinfachen Sie die Standardoptionen für die meisten gängigen Anwendungsfälle.

MySQL (oder MariaDB) verfügt über eine Vielzahl von datenbank- und installationsspezifischen Konfigurationsoptionen - Sortierungen, Indizierung, Leistungsoptimierung usw. Diese Fülle an Optionen ist das Ergebnis von MySQL, das weitaus mehr Funktionen bietet. Möglicherweise müssen Sie MySQL weiter optimieren, aber es liegt wahrscheinlich daran, dass Sie in erster Linie versuchen, mehr zu tun.

Einzelbenutzer- oder Mehrbenutzerdatenbank

SQLite eignet sich am besten für Anwendungen mit einem einzelnen gleichzeitigen Benutzer, z. B. eine Desktop- oder mobile App. MySQL und MariaDB sind für die gleichzeitige Verwendung mehrerer Benutzer ausgelegt. MySQL und MariaDB können auch Cluster- und Scale-Out-Lösungen bereitstellen, SQLite jedoch nicht.

SQLite vs. eingebettete Datenbanken

SQLite ist bei weitem nicht die einzige einbettbare Datenbank. Viele andere bieten ähnliche Funktionen, betonen jedoch unterschiedliche Anwendungsfälle oder Bereitstellungsmodelle.

  • Apache Derby : Eine einbettbare SQL-Engine, die auch von Oracle als Java DB neu verpackt wurde. Da Derby in Java geschrieben ist und die JVM benötigt, ist es hauptsächlich für die Einbettung in Java-Apps konzipiert.
  • Firebird Embedded : Die Firebird-Datenbank, die plattformübergreifend ausgeführt wird und viele High-End-Funktionen bietet, ist als Bibliothek verfügbar, die in eine Clientanwendung eingebettet werden kann. Der Funktionsumfang ist im Vergleich zu SQLite gut, aber SQLite verfügt über eine weitaus größere Benutzergemeinschaft und Support-Basis.
  • Realm : Eine leistungsstarke relationale Datenbank, die für mobile Umgebungen, hauptsächlich Android, entwickelt wurde, aber auch Desktop-Umgebungen wie Windows unterstützen kann. Realm ist jedoch objektbasiert und verwendet keine SQL-Abfragen - gut, wenn Sie lieber kein SQL verwenden möchten, aber schlecht, wenn SQL vertraut und komfortabel ist.
  • VistaDB : Eine eingebettete Datenbank für die .NET-Laufzeit. VistaDB ist in Versionen verfügbar, die für die verschiedenen Varianten und Inkarnationen von .Net spezifisch sind, und mit vielen Unternehmensfunktionen wie der vollständigen Datenbankverschlüsselung. Es ist jedoch ein kommerzielles Produkt, kein Open Source.
  • Berkeley DB : Ein Oracle-Projekt, nominell ein Schlüssel- / Wertspeicher, der jedoch SQLite in neueren Editionen verwendet, um SQL-Abfragen zu verarbeiten. Das zugrunde liegende Datenbankmodul von Berkeley DB weist Leistungsverbesserungen auf, mit denen SQLite nicht mithalten kann, z. B. die Möglichkeit, mehrere Schreibvorgänge gleichzeitig auszuführen.

Wann sollte SQLite nicht verwendet werden?

Aufgrund der Entwurfsoptionen von SQLite ist es für einige Szenarien gut geeignet, für andere jedoch schlecht. Hier sind einige Stellen, an denen SQLite nicht gut funktioniert:

  • Apps, die Funktionen verwenden, die SQLite nicht unterstützt. SQLite unterstützt eine Reihe relationaler Datenbankfunktionen nicht und wird in vielen Fällen auch nicht versuchen, sie zu unterstützen. Viele sind Eckfälle, aber selbst einer davon kann den Deal brechen.
  • Apps, die Scale-Out-Designs erfordern. SQLite-Instanzen sind singulär und unabhängig, ohne native Synchronisation zwischen ihnen. Sie können nicht zusammengeschlossen oder zu einem Cluster zusammengefasst werden. Jede Softwareanwendung, die ein Scale-Out-Design verwendet, kann SQLite nicht verwenden.
  • Apps mit gleichzeitigen Schreibvorgängen von mehreren Verbindungen. SQLite sperrt die Datenbank für Schreibvorgänge, sodass alles, was mehrere gleichzeitige Schreibvorgänge umfasst, zu Leistungsproblemen führen kann. Apps mit mehreren gleichzeitigen Lesevorgängen sind jedoch im Allgemeinen schnell. SQLite 3.7.0 und höher bietet den Write-Ahead-Protokollierungsmodus, mit dem mehrere Schreibvorgänge schneller ausgeführt werden können, weist jedoch einige Einschränkungen auf. Für eine Alternative gilt Berkeley DB, wie oben erwähnt.
  • Apps, die eine starke Datentypisierung erfordern. SQLite hat relativ wenige Datentypen - zum Beispiel keinen nativen Datetime-Typ. Dies bedeutet, dass die Durchsetzung dieser Typen von der Anwendung durchgeführt werden muss. Wenn Sie möchten, dass die Datenbank im Gegensatz zur Anwendung Eingaben für Datums- / Uhrzeitwerte normalisiert und einschränkt, funktioniert SQLite möglicherweise nicht für Sie.