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.
quelle
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.
quelle
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).
quelle
Es gibt Bücher zu diesem Thema. Ein guter Ausgangspunkt wären Datenbanksysteme: Das vollständige Buch von Garcia-Molina, Ullman und Widom
quelle
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:
quelle
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
quelle
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.
quelle
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.
quelle
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