SQLite als Dateiformat für Anwendungen verwenden
(sqlite.org)- SQLite-Datenbankdateien sind ein einzeldateibasiertes Format, das sich gut zum Speichern oder Austauschen von Anwendungszuständen eignet
- Im Vergleich zu benutzerdefinierten Formaten, Datei-Sammlungen (pile-of-files) und ZIP-basierten Formaten sind sie strukturierter und lassen sich mit einem SQL-Schema klar definieren
- Durch Transaktionen, Indizes und eine höhere Abfragesprache werden Datenzugänglichkeit und Stabilität sichergestellt; außerdem werden inkrementelle Updates und Mehrprozesszugriff unterstützt
- Plattformübergreifende Kompatibilität, Erweiterbarkeit, Performance und Schnittstellen für viele Sprachen verbessern Entwicklungseffizienz und Wartbarkeit
- Mit einer klaren Datenstruktur und schemaorientiertem Design lassen sich bessere Anwendungsqualität und langfristige Datenhaltbarkeit erreichen
Das Konzept von Anwendungsdateiformaten
- Ein Anwendungsdateiformat ist eine Dateistruktur, mit der der Zustand eines Programms auf Datenträger gespeichert oder Informationen zwischen Programmen ausgetauscht werden
- Beispiele: DOC, DWG, PDF, XLS, GIT, EPUB, ODT, PPT, ODP usw.
- Ein Dateiformat (file format) speichert ein einzelnes Objekt (z. B. JPEG, GIF, XHTML), während ein Anwendungsformat (application format) mehrere Objekte und ihre Beziehungen gemeinsam speichert
- Die meisten Anwendungsformate lassen sich in drei Typen einteilen
- Benutzerdefiniertes Format: DOC, DWG, PDF usw. mit app-spezifischer Binärstruktur, auf die externe Tools nicht zugreifen können
- Datei-Sammlung (pile-of-files): eine aus mehreren Dateien bestehende Struktur wie bei Git; teils gut lesbar, aber schwerer zu transportieren und in der Konsistenz zu verwalten
- ZIP-basiertes Format (wrapped pile-of-files): eine als ZIP komprimierte Datei-Sammlung wie EPUB, ODT oder ODP; zwar eine einzelne Datei, aber bei Änderungen muss alles neu geschrieben werden
SQLite als neues Anwendungsdateiformat
- Eine SQLite-Datenbank kann selbst mit einem einfachen Key/Value-Schema (
CREATE TABLE files(filename TEXT PRIMARY KEY, content BLOB);) eine Datei-Sammlungs-Struktur ersetzen- Bei Komprimierung liegt der Größenunterschied zu ZIP-Archiven innerhalb von ±1 %
- Änderungen sind auf Ebene einzelner Dateien möglich, sodass kein vollständiges Neuschreiben nötig ist
- SQLite kann zahlreiche Tabellen, Felder, Datentypen, Constraints und Indizes enthalten und dadurch komplexe Datenbeziehungen effizient ausdrücken
- Es bietet die Ausdrucksstärke benutzerdefinierter Formate, ist aber bei Spezifikation und Codeumfang deutlich kompakter und ohne Spezialwerkzeuge zugänglich
Die wichtigsten Vorteile des SQLite-Formats
-
1. Einfachere Entwicklung
- Schon durch Einbinden der SQLite-Bibliothek oder der einzelnen Quelldatei (
sqlite3.c) ist die Datei-E/A vollständig abgedeckt - Spart Tausende Zeilen Code und senkt die Wartungskosten
- Weltweit sind Milliarden von SQLite-Dateien im Einsatz, mit gründlich getesteter Stabilität
- Schon durch Einbinden der SQLite-Bibliothek oder der einzelnen Quelldatei (
-
2. Dokumentstruktur in einer einzigen Datei
- Alle Daten werden in einer einzigen Datei gespeichert, was Verschieben, Kopieren und Anhängen erleichtert
- Über die Application ID im Dateikopf lässt sich der Dokumenttyp erkennen
-
3. Höhere Abfragesprache
- Mit SQL lässt sich die Logik des Datenzugriffs vereinfachen; Entwickler müssen nur noch definieren, „was“ abgefragt werden soll
- Gegenüber key/value-basierten Dateien verringern Transaktionen, Indizes und Schema die Fehleranfälligkeit
-
4. Zugängliche Inhalte
- SQLite-Dateien sind ein klar dokumentiertes offenes Format und können direkt mit Kommandozeilenwerkzeugen gelesen werden
- Die Library of Congress empfiehlt es für die langfristige digitale Archivierung
- Durch Abwärtskompatibilität seit 2004 ist langfristige Zugänglichkeit gewährleistet
-
5. Plattformübergreifende Kompatibilität
- Voll kompatibel zwischen 32/64-Bit, unterschiedlichen Endianness-Systemen sowie Windows- und Unix-Plattformen
- Texte unterstützen automatische Konvertierung zwischen UTF-8 und UTF-16LE/BE
-
6. Atomare Transaktionen
- Selbst bei Systemfehlern oder Stromausfall wird vollständiges Schreiben ohne Datenbeschädigung garantiert
- Änderungen lassen sich gruppieren, rollbacken und validieren; Fossil DVCS nutzt diese Funktion
-
7. Inkrementelle und kontinuierliche Updates
- Es werden nur geänderte Teile auf den Datenträger geschrieben, was Geschwindigkeit erhöht und SSD-Verschleiß verringert
- Automatisches Speichern sowie die Beibehaltung von Undo/Redo-Stacks über Sitzungen hinweg sind möglich
-
8. Einfache Erweiterbarkeit
- Neue Funktionen lassen sich durch das Hinzufügen neuer Tabellen oder Spalten erweitern, bei kompatiblen bestehenden Queries
- Strukturänderungen sind deutlich einfacher als bei benutzerdefinierten Formaten
-
9. Performance
- Lesen und Schreiben ist schneller als bei Datei-Sammlungen, besonders bei BLOBs unter 100 KB
- Bereits durch zusätzliche Indizes oder das Ausführen von
ANALYZElässt sich die Performance verbessern - Bei benutzerdefinierten Formaten sind für dieselben Probleme Codeänderungen nötig
-
10. Gleichzeitiger Zugriff durch mehrere Prozesse
- SQLite koordiniert gleichzeitigen Zugriff automatisch
- Mehrere Prozesse können gleichzeitig lesen, Schreibzugriffe werden sequenziell verarbeitet
- Schutz vor Formatbeschädigung wird automatisch sichergestellt
-
11. Unterstützung für viele Programmiersprachen
- Für C, C++, C#, Java, Python, Ruby, JavaScript usw. gibt es Schnittstellen für die meisten Sprachen
- Mehrere Sprachen und Teams können mit einem gemeinsamen Schema zusammenarbeiten
-
12. Bessere Anwendungsarchitektur
- Das SQLite-Schema selbst dient als vollständige Dokumentation des Dateiformats
- Während benutzerdefinierte Formate Hunderte Seiten Spezifikation benötigen, ist ein SQL-Schema kompakt und klar
- Mit Zitaten von Fred Brooks, Rob Pike und Linus Torvalds wird die Bedeutung datenstrukturzentrierten Designs betont
Fazit
- SQLite ist nicht in jeder Situation perfekt, aber in den meisten Anwendungen eine bessere Wahl als benutzerdefinierte, Datei-Sammlungs- oder ZIP-Formate
- Als Dateiformat auf hohem Abstraktionsniveau vereint es Stabilität, Erweiterbarkeit, Performance, Zugänglichkeit und Kompatibilität
und ist damit bei der Entwicklung der nächsten Generation von Anwendungen ein ernstzunehmender Kandidat für ein Standard-Dateiformat
1 Kommentare
Hacker-News-Kommentar
Damals wurde an Offline-Karten für das iPad gearbeitet, und es war extrem umständlich, unzählige kleine PNG-Kacheln (256 px) per USB oder über das Netzwerk zu übertragen.
Also wurden die Kacheln gebündelt in SQLite gespeichert, was den Transport erleichterte und auch die Verwaltung von Prüfsummen vereinfachte.
Die Kacheln waren über X, Y, Z (Zoomstufe) indiziert und ließen sich in einer relationalen DB leicht handhaben; auf dem iPad konnte man mithilfe der Dateiendung und von Metadaten sogar ein App-Icon anhängen.
Ein eigenes Dateiformat zu entwerfen war abschreckend, aber mit DBs war man vertraut, daher konnte ein CLI-Tool gebaut werden, mit dem sich das Format in verschiedenen Sprachen leicht handhaben ließ.
Unzählige Tools können SQLite-Daten lesen, und allein mit der CLI ist die Arbeit mit Daten sehr bequem.
Es existiert seit über 20 Jahren und ist eine der weltweit am gründlichsten getesteten Softwares.
Es ist einfach, zugleich leistungsfähig und hochzuverlässig; für die langfristige Datenaufbewahrung ist SQLite als Dateiformat aus meiner Sicht eine der besten Entscheidungen.
Im Projekt Internet-Places-Database wurde ein HTML-UI verwendet, und dank Bootstrap-Komponenten war es für jeden ohne separate Installation zugänglich.
Alle Daten werden aus einer einzigen SQLite-Datei gelesen und zurückgegeben.
Die DB ist groß, daher ist das Durchsuchen langsam, aber es wird über eine effiziente Navigationsmethode nachgedacht, die den Suchbereich einschränkt.
Wenn die Grundstruktur des Blogs erstellt und als Datei an Familienmitglieder weitergegeben wurde, mussten sie nur noch schreiben und veröffentlichen.
Näheres dazu steht in diesem Blogbeitrag.
Bei einer Baumstruktur kann man JSON auch als Blob speichern, aber dann gehen die Vorteile teilweise verloren.
Wenn jedoch Bilder oder Binärdaten mit enthalten sind, ist SQLite deutlich im Vorteil — leichter zu handhaben als ZIP.
SQLite unterstützt auch rekursive Abfragen, sodass sich selbstreferenzielle Daten sauber ausdrücken lassen.
JSON-Blobs in ein TEXT-Feld zu legen ist zwar einfach, aber dadurch verliert man SQL-Vorteile wie Migrationen und Indizierung.
Die meisten Daten wirken oberflächlich hierarchisch, werden aber relational, wenn man sie entlang verschiedener Schnitte betrachtet.
Schade ist nur, dass relationale Typen in Programmiersprachen nicht gut ausgedrückt werden.
SQLite unterstützt auch Abfragen auf JSON-ähnliche Objekte.
Allerdings war die CLI zu minimalistisch, und im Nachhinein wäre ein besseres Tool sinnvoll gewesen.
Sogar rekursive Referenzen sind möglich.
Mit DuckDB habe ich Ausgabedateien eines hierarchischen Modells in einer einzigen SQL-abfragbaren Datei zusammengeführt, wodurch sich die Storage- und Analyse-Pipeline vereinfacht hat.
Wenn langfristige Datenaufbewahrung wichtig ist, scheint SQLite besonders ideal zu sein.
Da die Konfigurationen bereits in Postgres-Tabellen gespeichert sind, lassen sich bestimmte Einstellungen einfach bereitstellen, indem man sie in eine SQLite-Datei überführt.
Da es ein Binärformat ist, sinkt auch das Risiko versehentlicher Änderungen.
Umgekehrt lassen sich Produktionsdaten für Tests ebenso leicht als SQLite-Datei exportieren.
Ich habe mich immer gefragt, wie Menschen Ideen oder Produkte so gut verkaufen können.