web-dev-qa-db-de.com

So schreiben Sie eine einfache Datenbank-Engine

Ich möchte erfahren, wie eine Datenbank-Engine funktioniert (d. H. Deren Interna). Ich kenne die meisten in CS gelehrten grundlegenden Datenstrukturen (Bäume, Hash-Tabellen, Listen usw.) sowie ein ziemlich gutes Verständnis der Compilertheorie (und habe einen sehr einfachen Interpreter implementiert), verstehe aber nicht, wie ich vorgehen soll über das Schreiben einer Datenbank-Engine. Ich habe nach Tutorials zu diesem Thema gesucht und keine gefunden. Deshalb hoffe ich, dass jemand anderes mich in die richtige Richtung lenken kann. Grundsätzlich hätte ich gerne Informationen zu folgenden Themen:

  • Wie die Daten intern gespeichert werden (d. H. 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.

136
a_m0d

Wenn Sie gut darin sind, Code zu lesen, werden Sie durch das Studium von SQLite eine ganze Menge über das Datenbankdesign lernen. Es ist klein, also ist es einfacher, den Kopf herumzuwickeln. Es ist aber auch professionell geschrieben.

http://sqlite.org/

53
Robert Harvey

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

  • So speichern Sie die Daten intern: Sie sollten über eine Datendatei mit Ihren Datenbankobjekten und einen Caching - Mechanismus verfügen, um die fokussierten Daten und einige Daten in RAM vorausgesetzt, Sie haben eine Tabelle mit Bei einigen Daten würden wir ein Datenformat erstellen, um diese Tabelle in eine Binärdatei umzuwandeln, indem wir uns auf die Definition eines Spaltentrennzeichens und eines Zeilentrennzeichens einigen und sicherstellen, dass ein solches Trennzeichenmuster niemals in Ihren Daten selbst verwendet wird Wenn Sie <*> auswählen, um beispielsweise Spalten zu trennen, sollten Sie überprüfen, ob die Daten, die Sie in dieser Tabelle platzieren, dieses Muster nicht enthalten. Sie können auch einen Zeilenkopf und einen Spaltenkopf verwenden, indem Sie die Zeilengröße und eine interne Indexnummer für die Geschwindigkeit angeben Wenn Sie die Suche starten und zu Beginn jeder Spalte die Länge dieser Spalte wie "Adam", 1, 11.1, "123 ABC Street POBox 456" haben, können Sie sie wie <& RowHeader, 1> <& Col1, CHR, 4 > Adam <& Col2, num, 1,0> 1 <& Col3, Num, 2,1> 111 <& Col4, CHR, 24> 123 ABC Street POBox 456 <& RowTrailer>

  • Um Elemente schnell zu finden, versuchen Sie, mithilfe von Hashing und Indizierung auf gespeicherte und zwischengespeicherte Daten zu verweisen. Verwenden Sie dazu dieselben Kriterien wie oben. Sie können den Wert der ersten Spalte sortieren und in einem separaten Objekt speichern, das auf die Zeilen-ID von Elementen zeigt, die alphabetisch sortiert sind , und so weiter

  • Wie Sie das Einfügen von Daten, die ich von Oracle kenne, beschleunigen können, ist, dass sie Daten an einer temporären Stelle sowohl in RAM) als auch auf der Festplatte einfügen und regelmäßig das Housekeeping durchführen. Die Datenbank-Engine ist ständig damit beschäftigt, ihre Daten zu optimieren Struktur, aber in der gleichen Zeit wollen wir keine Daten verlieren, wenn die Stromversorgung ausfällt. Versuchen Sie also, die Daten ohne Sortieren an diesem temporären Ort zu belassen, fügen Sie Ihren ursprünglichen Speicher hinzu, und später, wenn das System frei ist, greifen Sie auf Ihr System zu indiziert und löscht den temporären Bereich, wenn Sie fertig sind

viel Glück, tolles Projekt.

25
A.Rashad

Es gibt Bücher zu diesem Thema. Ein guter Anfang wäre Database Systems: The Complete Book von Garcia-Molina, Ullman und Widom

11
djna

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

Ich persönlich habe viel gelernt, indem ich SQlite studiert habe. 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 hat einen eigenen Stack-basierten Interpreter und Sie können den P-Code, den es intern generiert, 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 ihrer Stabilität und Effizienz).

10
Juergen

Okay, ich habe eine Site gefunden, die einige Informationen zu SQL und Implementierung enthält. Es ist ein bisschen schwierig, einen Link zu der Seite zu erstellen, auf der alle Tutorials aufgelistet sind. Deshalb werde ich sie nacheinander verlinken:

8
a_m0d

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

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

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

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

Es kann auf einer Vielzahl von Betriebssystemen sowohl für Desktop-Computer als auch für Mobiltelefone ausgeführt werden, sodass das Experimentieren einfach ist und es jetzt und in Zukunft nützlich sein wird, sich darüber zu informieren.

Hier gibt es sogar eine anständige Community: https://stackoverflow.com/questions/tagged/sqlite

8
michael aubert

vielleicht können Sie aus HSQLDB lernen. Ich denke, sie bieten eine kleine und einfache Datenbank zum Lernen. Sie können sich die Codes ansehen, da es Open Source ist.

7
nightingale2k1

Wenn MySQL Sie interessiert, würde ich Ihnen auch dieses Wiki-Seite empfehlen, das einige Informationen über die Funktionsweise von MySQL enthält. Vielleicht möchten Sie sich auch MySQL-Interna verstehen ansehen.

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 nennen würden, ein dokumentorientiertes Datenbanksystem.

Viel Glück!

3
user59634

Ich bin mir 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.
Ich habe jede Tabelle als Datei auf der Festplatte und in 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.

2
sud03r