Eigenes Datenbanksystem erstellen [geschlossen]


65

Ich muss lernen, wie Datenbanken funktionieren, um sie effizienter zu nutzen, und ich lerne auf diese Weise.

Ich möchte mein eigenes Datenbanksystem erstellen. Ich beziehe mich nicht auf die Erstellung einer Pseudodatenbank, die mithilfe von Abfragen Dateien analysiert. Dies wäre einfach eine Dateisystemschnittstelle mit einer Abfragesprache. Ich spreche von der tatsächlichen Struktur einer Datenbank-Engine. Und da das, was ich vorhabe, weder relational noch dokumentenorientiert ist (es ist "knotenorientiert", falls es das überhaupt gibt), würde ich jede Ressource benötigen, um so abstrakt und hochgradig wie möglich zu sein.

Wie würde ich das schaffen? Welche Ressourcen / Tutorials / Bücher kann ich lesen, um sie zu verstehen?

Die Sprache spielt keine Rolle. Im Idealfall wäre der Code ein Pseudocode zur Veranschaulichung des Konzepts, der nicht an eine bestimmte Sprache gebunden ist, aber alles kann. Ich konnte auf Google nichts zu diesem Thema finden (da ich in diesem Bereich so Analphabet bin, gebe ich möglicherweise nicht die richtige Suche ein).

Wenn solche Ressourcen nicht zur Verfügung stehen, dann wäre meiner Meinung nach etwas darüber, wie man einen Kunden erstellt, zumindest ein Schritt in die richtige Richtung.


15
Warum nicht stattdessen einen Compiler schreiben? Oder noch besser, Ihr eigenes Betriebssystem? Wenn Sie es wirklich ernst meinen mit dem Schreiben Ihrer eigenen Datenbank, gibt es tausend und eine Open-Source-Datenbank: Studieren Sie ihren Quellcode, tragen Sie ein paar Patches bei. Dann denken Sie daran, Ihre eigenen zu bauen.
Yannis

4
Sie können Kurse für Hochschul- und Hochschulabsolventen absolvieren. Es gibt viele Open-Source-Kurse online. Sie können auch einige Lehrbücher kaufen und diese in Ihrer Freizeit studieren. Dies gibt Ihnen einige Ideen und Ansatzpunkte. Das Lesen des Verlaufs und der Neuigkeiten zu PostgreSQL wird ebenfalls hilfreich sein (in Bezug auf die Vorstellungskraft, obwohl es Ihnen keine Vorstellung davon gibt, wie diese Funktionen tatsächlich implementiert sind)
Uhr

9
I studied open-source DBs, but their codebase is too huge: Wenn so etwas wie redis oder FlockDB zu groß ist für Sie zu lesen, ich sehe nicht , wie Sie schreiben oder eigene Datenbank fertig werden.
Yannis

10
@YannisRizos Fairerweise ist das Lesen von Code (imo) viel schwieriger als das Schreiben selbst.
AlexWebr

12
@Xananax: Höre nicht auf die Frösche ( crystal-reflections.com/stories/story_73.htm ). Tun Sie, was immer Sie wollen, und es ist nicht erforderlich, ein Ziel zu haben, an dem Sie Freude haben.

Antworten:


61

(es ist "knotenorientiert", falls es das überhaupt gibt)

Fang hier an. Wenn Sie sich mit einer komplexen Anwendung wie einer Datenbank befassen (selbst eine einfache Datenbank ist eine komplexe Anwendung), sollten Sie mit der Geschichte der Domäne und der richtigen Terminologie vertraut sein und zumindest eine sehr genaue Vorstellung von der Architektur haben. Sie können mit dem Wikipedia-Artikel in der Datenbank beginnen . Verbrachte ein paar Tage damit, alle Artikel zu den verwandten Konzepten und den verschiedenen Datenbanktypen zu lesen.

Und da ist das, was ich vorhabe, weder relational noch dokumentenorientiert

Als nächstes wählen Sie Relational oder NoSQl. Wenn Sie sich für NoSQL entscheiden, sollten Sie einen NoSQL-Typ auswählen. Dies ist äußerst wichtig, da Sie keine Architekturdokumente finden, in denen alle verschiedenen Datenbankfamilien behandelt werden. Es ist nicht wirklich wichtig, welche Sie auswählen, wählen Sie einfach eine und bleiben Sie dabei.

Die Sprache spielt keine Rolle.

Ja, (leider), denn nachdem Sie eine Datenbankfamilie ausgewählt haben, sollten Sie Code aus Open-Source-Datenbanken dieser Familie untersuchen. Es gibt einige allgemeine Richtlinien, nach denen gesucht werden muss:

  • Relativ kleine Codebasis
  • Architekturdokumente oder zumindest ein Entwicklungsblog,
  • Die Datenbank, die Sie auswählen, sollte in der Nähe dessen liegen, was in der Familie als generisch gilt. Es wäre schwieriger, daraus zu lernen, wenn sie hochspezialisiert ist.

Einige Beispiele, die passen:

Holen Sie sich den Quellcode, kompilieren Sie ihn und spielen Sie damit herum. Sie müssen keine Patches oder ähnliches einreichen. Sehen Sie sich einfach den Code an und nehmen Sie hier und da kleine Änderungen vor, um zu sehen, was passiert. Es ist ein inkrementeller Prozess. Je mehr Sie damit spielen, desto einfacher wird es, die Funktionsweise des Codes zu verstehen. Wenn das erste Projekt, das Sie ausgewählt haben, äußerst schwer zu verstehen ist, fahren Sie mit dem nächsten fort.

Eine weitere großartige Option wäre, sich auf die Entwicklung einer Engine für MySQL zu konzentrieren, wie @NB in ​​einer früheren Antwort nahe legt .

Wenn Sie an einem Punkt angelangt sind, an dem Sie in der Lage sind, etwas Nützliches mit der Codebasis zu tun, beteiligen Sie sich an der Community des Projekts. Auf diese Weise finden Sie am einfachsten detailliertere Ressourcen zu den betreffenden Konzepten.

Und dann können Sie endlich mit der Arbeit an Ihrer Datenbank beginnen. Zuerst könnten Sie einfach einen extrem verkleinerten Klon des Codes schreiben, den Sie untersucht haben. Es muss nicht originell sein, viele großartige Projekte begannen als Klone oder Gabeln.

Welche Ressourcen / Tutorials / Bücher kann ich lesen, um sie zu verstehen?

Es gibt einige Bücher:

Und ein paar hundert weitere sowie eine Vielzahl von wissenschaftlichen Artikeln, die Sie problemlos über Google nachverfolgen können. Sie müssen zunächst definieren, was Sie tun möchten, und dann nach einem Buch suchen. Wenn Sie sich auf eine Community von anderen Datenbankautoren einlassen, können Sie auch die Liste der Bücher eingrenzen und möglicherweise viel bessere Vorschläge als die oben genannten erhalten.

Viel Glück! Ich erwarte einen Kommentar mit einem Link zu Ihrem Repository, wenn Sie fertig sind. Und wenn Sie noch nie fertig sind, hinterlassen Sie einen Kommentar, der mich daran erinnert, dass ich den Compiler, mit dem ich 2001 angefangen habe, noch nicht fertiggestellt habe.


5
das ist ein schöner Beitrag
Chani

2
Das ist super! Noch mehr von dir :) Ich würde gerne fast jede andere Antwort akzeptieren, aber da ich mir eine aussuchen muss, muss es das sein. I'm expecting a comment with a link to your repository when you're done: ganz sicher! Nochmals vielen Dank an Sie und alle anderen, das war wirklich erhebend.
Xananax,

3
Und für alle, die nach den gleichen Antworten suchen: Ich finde, flockDB ist der beste Kandidat zum Lernen, die Codebasis ist sehr klein, der Code sehr gut lesbar (obwohl ich kein Skala spreche) und leicht zu verstehen.
Xananax,

@Yannis, übrigens, welches der Bücher, die Sie empfehlen, ist das, was Sie gelesen haben?
Pacerier

@Xananax Sooo wie geht es weiter? Gibt es ein Repository, das wir uns ansehen können? :)
Radu Murzea

27

Sie sollten es einfach tun und aufhören, zu viel nachzudenken. Spaß am Lernen und Begeisterung sind Geschenke.

Andere zu fragen, ob es eine gute Idee ist, ist sicherlich keine gute Strategie . Wenn ich all die Frösche gehört hätte, würde ich heute noch bei Ikea arbeiten und den Einkaufswagen vom Parkplatz zum Depot schieben.

Sie müssen sich nicht so rechtfertigen wie Ayende in diesem interessanten Beitrag . Die Frage war:

Als pragmatischer Entwickler frage ich mich jedoch, was dieses Projekt in einem gesättigten Markt bietet, in dem Sie ausgereifte Alternativen wie CouchDB, MongoDB, Tokio, Redis und viele mehr haben. Viele dieser Produkte sind plattformübergreifend und laufen mit bewährter C-Geschwindigkeit. Sie werden auf sehr großen Websites eingesetzt, auf denen ihre Sharding-Fähigkeiten und Fehlertoleranz weit verbreitet sind.

Wenn Sie sich an dem Prozess erfreuen, machen Sie sich keine Sorgen um das Ziel, Sie haben bereits gewonnen.


4
+1, sehr nachdenkliche und lehrreiche Antwort :-) ... wirklich nette Antwort an jemanden, der etwas tun will
Pankaj Upadhyay

Tatsächlich sehr nett. Ich war kurz davor, das zu akzeptieren. Ich habe es nicht getan, weil ich dachte, Yannis 'Antwort sei zutreffender und würde eher Menschen helfen, die die gleiche Frage haben. Aber das war definitiv ermutigend. Danke vielmals.
Xananax,

Yannis Antwort ist besser als meine und verdient Ihre Wahl

6

msgstr "(es ist" knotenorientiert ", falls es das überhaupt gibt)". - Vielleicht finden Sie deshalb nicht viel!

Tauchen Sie mit Version 0.1 ein und sehen Sie, wo Sie es bekommen. Sie können mehr aus dem Versuch lernen, das zu produzieren, was Sie wollen, indem Sie fragen, was Sie tun sollen. Nehmen Sie sich ein paar Tage Zeit und überprüfen Sie, wo Sie sind.

Vor ungefähr 18 Jahren habe ich ein grundlegendes Datenbanksystem (zum Spaß, go figure) mit Btree-Indizes geschrieben und eine Menge gelernt.


4

MySQL verfügt über eine steckbare Speicher-Engine-Struktur. Vielleicht möchten Sie herausfinden, wie Engines für MySQL erstellt werden.


4

Klingt nach einem tollen Projekt. Anscheinend ist es Ihr Ziel, keine Produktionssoftware zu erstellen, sondern sich mit Datenbanken und dem Prozess der Erstellung eines Datenbanksystems vertraut zu machen.

Ich glaube nicht, dass Sie viel recherchieren müssen. Es scheint, als ob der Zweck darin besteht, die Grundlagen für die Erstellung eines knotenbasierten Datenbanksystems zu erlernen.

So würde ich anfangen:

  1. Wählen Sie Ihre Lieblingssprache oder eine Sprache, die Sie verbessern möchten.
  2. Erstellen Sie das Knotenobjekt (oder was auch immer in Ihrer Sprache am nächsten ist). Finde heraus, wie du sie verknüpfen kannst.
  3. Erstellen Sie eine kurze Liste der SQL-Anweisungen, die Sie zuerst implementieren werden.
  4. Entscheiden Sie, wie die Daten gespeichert werden sollen. Eine naheliegende Lösung besteht darin, alle Knoten zu serialisieren, zu laden, wenn das Programm startet, und zu speichern, wenn das Programm endet.

Nachdem Sie die Grundlagen erarbeitet haben, haben Sie viel mehr Einblick in das, was schwierig oder problematisch ist. Dann können Sie Nachforschungen anstellen, Verbesserungen finden und diese integrieren.


1
Ich folge den von Ihnen vorgeschlagenen Schritten. 1,2,3 sind kein problem. Allerdings bin ich von # 4 überfordert. Wie würde ich bei großen Datenmengen nur die relevanten Teile in den Speicher laden? Ich dachte daran, alles als Binärdaten zu speichern und eine andere Indexdatei zu führen, aber was ist, wenn der Benutzer nicht nach Index fragt? Ich müsste immer noch die gesamte Datei durchlaufen ... Ich denke, es ist Zeit für eine andere Frage
Xananax

Warum nicht einfach alles in Erinnerung behalten? Wenn Sie 1 GB reservieren, enthält dies viele Daten. Speichern Sie alternativ jeden Binärdatenknoten auf der Festplatte, und Sie haben dann 1 GB für Text. Das ist viel Text. Wie auch immer, ich denke, der Umgang mit einer Datenbank, die größer als 1 GB ist, ist nicht zentral für die Übung.
B Seven

Sie können auch viele Methoden erstellen, um innerhalb von 1 GB Arbeitsspeicher effizient zu arbeiten. Sie können diesen Teil des Systems später verbessern. Eine Lösung besteht darin, alle Knoteninformationen in den Speicher zu laden, aber die Daten jedes Knotens auf der Festplatte zu speichern. Auf diese Weise können Sie die Knoten effizient durchlaufen und nur auf die Festplatte zugreifen, um die Daten abzurufen, die Sie wirklich benötigen.
B Seven

3

Das Schreiben einer eigenen Datenbank "um zu verstehen, wie alles funktioniert" ist der einzige gute Grund dafür (da Datenbanken verrückt schwer zu finden und schwer zu korrigieren sind). Du bist verrückt, aber auf eine gute Weise!

Um zu sehen, wie es gemacht wird, schlage ich vor, sich SQLite anzuschauen. Die SQLite-Quelle ist nur etwa 1,3 MB komprimiert und eine vollständig ACID-kompatible Transaktionsdatenbank. Es ist auch gemeinfrei und der Hauptautor ist ein netter Kerl, der sicher gerne Ihre Fragen beantwortet. (Ich denke, die schwierigsten Aspekte bestehen darin, Informationen wirklich auf die Festplatte zu übertragen. Betriebssysteme und Hardware davon zu überzeugen, nicht mehr zu lügen und die Transaktion JETZT wirklich zu schreiben, ist überraschend schwierig. Deshalb bin ich so froh, dass ich nie eine Datenbank schreiben muss.)


1
Die SQLite-Codebasis nähert sich 0,2 * 10 ^ 6 loc (5mb dekomprimiert), es ist nicht so klein.
Yannis

1
@Yannis: Vergleichen Sie mit MySQL oder PostgreSQL oder einem der anderen Server-DB-Systeme ...
Donal Fellows


3

Ich muss lernen, wie Datenbanken funktionieren

Lernen Sie relationale Algebra.

Finden Sie eine kleine DB-Engine, lernen Sie die Quelle.

um sie effizienter zu nutzen

Nee. Sie müssen lernen, wie Sie eine Datenbank effizient nutzen. Sie sind vielleicht ein besserer Fahrer, wenn Sie verstehen, wie Ihr Auto funktioniert, aber Sie sind ein viel besserer Fahrer, wenn Sie sich wirklich auf das Fahren konzentrieren.

Nehmen Sie an den traditionellen Routen teil: Nehmen Sie an einem Kurs teil, lesen Sie ein Buch, lesen Sie Peer Reviews, stellen Sie Fragen, verwenden Sie den Index luke .


5
Learn relational algebra.Angenommen, op ist natürlich an relationalen Datenbanken interessiert ...
yannis
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.