Wie schreibe ich eine einfache Datenbank-Engine? [Geschlossen]

143

Ich bin daran interessiert zu erfahren, wie eine Datenbank-Engine funktioniert (dh die Interna davon). Ich kenne die meisten grundlegenden Datenstrukturen, die in CS gelehrt werden (Bäume, Hash-Tabellen, Listen usw.), sowie ein ziemlich gutes Verständnis der Compilertheorie (und habe einen sehr einfachen Interpreter implementiert), aber ich verstehe nicht, wie es geht über das Schreiben einer Datenbank-Engine. Ich habe nach Tutorials zu diesem Thema gesucht und konnte keine finden. Ich hoffe, dass mich jemand anderes in die richtige Richtung weisen kann. Grundsätzlich möchte ich Informationen zu folgenden Themen:

  • Wie die Daten intern gespeichert werden (dh wie Tabellen dargestellt werden usw.)
  • Wie die Engine die benötigten Daten findet (z. B. eine SELECT-Abfrage ausführen)
  • Wie Daten schnell und effizient eingefügt werden

Und alle anderen Themen, die dafür relevant sein könnten. Es muss keine On-Disk-Datenbank sein - selbst eine In-Memory-Datenbank ist in Ordnung (wenn es einfacher ist), weil ich nur die Prinzipien dahinter lernen möchte.

Vielen Dank für deine Hilfe.

a_m0d
quelle

Antworten:

55

Wenn Sie gut darin sind, Code zu lesen, lernen Sie durch das Studium von SQLite eine ganze Menge Bootsdesign. Es ist klein, so dass es einfacher ist, den Kopf herumzuwickeln. Es ist aber auch professionell geschrieben.

http://sqlite.org/

Robert Harvey
quelle
2
LOC der SQLite-Download-Shell.c => 3135, sqlite3.c => 136332, sqlite3ext.h => 447, sqlite3.h => 7097, total => 147011
Khaja Minhajuddin
1
Das ist wahrscheinlich so klein, wie Sie eine voll funktionsfähige Datenbank-Engine mit einer geschweiften Klammer erstellen können. SQLite ist auch in C # verfügbar.
Robert Harvey
1
@Ibrahim Najjar github.com/CsharpDatabase/csharp-sqlite
Robert Harvey
4
Ich empfehle, den Code von SQLite 2.5.0 zu lesen: github.com/davideuler/SQLite-2.5.0-for-code-reading , es ist eine frühe Version von SQLite, die auf modernem GCC kompiliert und ausgeführt werden kann (ich habe getestet es auf MacOS 10.13 und Debian 8)
David Euler
1
cstack.github.io/db_tutorial ist ein guter Ausgangspunkt.
Ashish Negi
25

Die Antwort auf diese Frage ist riesig. Erwarten Sie, dass eine Doktorarbeit zu 100% beantwortet wird;), aber wir können uns die Probleme einzeln vorstellen:

  • So speichern Sie die Daten intern: Sie sollten über eine Datendatei mit Ihren Datenbankobjekten und einen Caching-Mechanismus verfügen, um die Daten im Fokus zu laden, und einige Daten um sie herum in den Arbeitsspeicher. Angenommen, Sie haben eine Tabelle, mit einigen Daten würden wir ein Datenformat erstellen Um diese Tabelle in eine Binärdatei zu konvertieren, müssen Sie sich auf die Definition eines Spalten- und Zeilenbegrenzers einigen und sicherstellen, dass ein solches Begrenzungsmuster in Ihren Daten selbst niemals verwendet wird. Wenn Sie beispielsweise <*> ausgewählt haben, um Spalten zu trennen, sollten Sie die Daten, die Sie in diese Tabelle einfügen, überprüfen, um dieses Muster nicht zu enthalten. Sie können auch einen Zeilen- und einen Spaltenkopf verwenden, indem Sie die Zeilengröße und eine interne Indexnummer angeben, um die Suche zu beschleunigen, und am Anfang jeder Spalte die Länge dieser Spalte wie "Adam", 1, 11.1, angeben. ""

  • So finden Sie Elemente schnell: Verwenden Sie Hashing und Indizierung, um auf gespeicherte und zwischengespeicherte Daten zu verweisen. Verwenden Sie dazu das gleiche Beispiel wie oben. Sie können den Wert der ersten Spalte sortieren und in einem separaten Objekt speichern, das auf die Zeilen-ID der Elemente zeigt, die alphabetisch sortiert sind , und so weiter

  • Wie ich das Einfügen von Daten beschleunige, weiß ich von Oracle, dass sie Daten an einem temporären Ort sowohl im RAM als auch auf der Festplatte einfügen und regelmäßig die Verwaltung übernehmen. Das Datenbankmodul ist ständig damit beschäftigt, seine Struktur zu optimieren, aber gleichzeitig tun wir dies nicht Ich möchte Daten bei einem Stromausfall verlieren. Versuchen Sie also, Daten ohne Sortierung an diesem temporären Ort zu speichern, fügen Sie Ihren ursprünglichen Speicher hinzu und später, wenn das System frei ist, greifen Sie auf Ihre Indizes zurück und löschen Sie den temporären Bereich, wenn Sie fertig sind

Viel Glück, tolles Projekt.

A. Rashad
quelle
11

SQLite wurde bereits erwähnt, aber ich möchte etwas hinzufügen.

Ich persönlich habe durch das Studium von SQlite viel gelernt. Das Interessante ist, dass ich nicht zum Quellcode gegangen bin (obwohl ich nur einen kurzen Blick darauf geworfen habe). Ich habe viel gelernt, indem ich das technische Material gelesen und mir die internen Befehle angesehen habe, die es generiert. Es verfügt über einen eigenen stapelbasierten Interpreter und Sie können den intern generierten P-Code einfach mit EXPLAIN lesen. So können Sie sehen, wie verschiedene Konstrukte in die Low-Level-Engine übersetzt werden (das ist überraschend einfach - aber das ist auch das Geheimnis seiner Stabilität und Effizienz).

Jürgen
quelle
9

Okay, ich habe eine Site gefunden, die einige Informationen zu SQL und Implementierung enthält. Es ist etwas schwierig, auf die Seite zu verlinken, auf der alle Tutorials aufgelistet sind. Deshalb werde ich sie einzeln verknüpfen:

a_m0d
quelle
8

Ich würde vorschlagen, sich auf www.sqlite.org zu konzentrieren

Es ist neu, klein (Quellcode 1 MB), Open Source (damit Sie es selbst herausfinden können) ...

Es wurden Bücher darüber geschrieben, wie es implementiert wird:

http://www.sqlite.org/books.html

Es läuft auf einer Vielzahl von Betriebssystemen sowohl für Desktop-Computer als auch für Mobiltelefone, sodass das Experimentieren einfach ist und das Erlernen davon jetzt und in Zukunft nützlich sein wird.

Hier gibt es sogar eine anständige Community: /programming/tagged/sqlite

michael aubert
quelle
1
Die Bytegröße für 3.10 beträgt jetzt fast 7,0 MB Quellcode. Nur wenige Privilegierte konnten das alles in einer Sitzung verdauen. Trotzdem ist dies auch ein guter Anfang.
Laurie Stearn
1
Tatsächlich. Nachdem Sie kürzlich einige Zeit im Quellcode von SQLite verbracht haben, um einen Fehler in SQLCipher zu finden, ist dies ein absoluter Albtraum. Das Leben war einfacher vor 6 Jahren :-)
Michael Aubert
Nur eine kurze Frage, da ich die Party verpasst habe. Ich denke, es wäre viel entspannter (und vielleicht nützlicher), mit der ersten Version zu beginnen. Eigentlich sollte ich das für alle ernsthaften Code-Lesungen von großen Projekten tun?
Nicholas Humphrey
7

Vielleicht können Sie von HSQLDB lernen . Ich denke, sie bieten eine kleine und einfache Datenbank zum Lernen. Sie können sich die Codes ansehen, da es sich um Open Source handelt.

Nachtigall2k1
quelle
3

Ich bin nicht sicher, ob es Ihren Anforderungen entsprechen würde, aber ich hatte eine einfache dateiorientierte Datenbank mit Unterstützung für simple ( SELECT, INSERT , UPDATE) mit Perl implementiert .
Ich habe jede Tabelle als Datei auf der Festplatte und mit Einträgen mit einem genau definierten Muster gespeichert und die Daten mit integrierten Linux-Tools wie awk und sed bearbeitet. Zur Verbesserung der Effizienz wurden häufig aufgerufene Daten zwischengespeichert.

sud03r
quelle
1
Haben Sie noch den Code, können Sie einen Link teilen
GK1
3

Wenn MySQL Sie interessiert, würde ich dies auch vorschlagen Wiki-Seite , die einige Informationen über die Funktionsweise von MySQL enthält. Vielleicht möchten Sie auch einen Blick auf das Verständnis von MySQL-Interna werfen .

Sie können auch eine Nicht-SQL-Schnittstelle für Ihr Datenbankmodul in Betracht ziehen. Bitte werfen Sie einen Blick auf Apache CouchDB . Es ist das, was Sie als dokumentenorientiertes Datenbanksystem bezeichnen würden.

Viel Glück!


quelle
Und wenn Sie sich eine andere Datenbank ansehen möchten : sqlserverinternals.com sind ihre nbooks auf SQl-Server-Interna die Top-Nitch.
HLGEM