# paulDB π¦π³οΈβπ
> **Eine eigene HTAP-Datenbank in Rust.**
> Row- *und* Column-Storage in einer Engine, mit einem Delta-Merge-Konzept,
> inspiriert von SAP HANA. Ein Langzeitprojekt β gebaut, um zu *verstehen*, nicht nur zu benutzen.
---
## Was ist paulDB?
paulDB ist mein Versuch, eine Datenbank von Grund auf selbst zu schreiben β in Rust.
Nicht, weil die Welt noch eine Datenbank braucht, sondern weil ich wissen will, **warum**
Datenbanken so funktionieren, wie sie funktionieren. Jede Zeile Code hier ist eine
Antwort auf eine Frage, die ich mir sonst nur theoretisch beantworten kΓΆnnte:
- Wie speichert eine Engine Daten wirklich auf Platte und im Speicher?
- Wie wird aus `SELECT β¦ WHERE β¦` ein ausgefΓΌhrter Plan?
- Wie hΓ€lt man OLTP (schnelle Einzelzugriffe) und OLAP (groΓe Aggregationen)
in *einem* System gleichzeitig schnell β also **HTAP**?
- Wie macht HANA das mit **Delta** und **Main** β und kann ich das nachbauen?
paulDB ist mein βCrafting Interpreters", nur fΓΌr Datenbanken.
---
## Warum HTAP + Delta-Merge?
Klassische Systeme zwingen zur Wahl:
| | Optimiert fΓΌr | Speicherform |
|---|---|---|
| **OLTP** | viele kleine Schreib-/Lesezugriffe | Row-Store (Zeilen) |
| **OLAP** | wenige groΓe Aggregationen | Column-Store (Spalten) |
**HTAP** (Hybrid Transactional/Analytical Processing) will beides in einem System.
SAP HANA lΓΆst das elegant ΓΌber zwei Bereiche:
```mermaid
flowchart LR
W[Schreibzugriffe] --> DELTA[DELTA
schreib-optimiert]
R[Leseanalysen] --> MAIN[MAIN
lese-optimiert, komprimiert]
DELTA -- Delta-Merge periodisch --> MAIN
```
```
Schreibzugriffe Leseanalysen
β β
βΌ βΌ
βββββββββββββββ Delta-Merge ββββββββββββββββ
β DELTA β ββββββββββββββββΆ β MAIN β
β (schreib- β (periodisch) β (lese- β
β optimiert) β β optimiert, β
β β β komprimiert) β
βββββββββββββββ ββββββββββββββββ
```
- **Delta**: schreib-optimiert, nimmt neue Daten schnell auf.
- **Main**: lese-optimiert, stark komprimiert, ideal fΓΌr Analytik.
- **Delta-Merge**: schiebt periodisch Delta β Main, hΓ€lt Lesezugriffe schnell.
Genau dieses Prinzip ist das HerzstΓΌck von paulDB.
---
## Architektur-Vision
```
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β SQL-Frontend β
β Parser β AST β Planner β Optimizer β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Execution Engine β
β (vektorisiert, wo es geht) β
βββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββ€
β Row-Store β Column-Store β
β (OLTP / Delta) β (OLAP / Main) β
βββββββββββββββββββββββββββββ΄βββββββββββββββββββββββββββ€
β Transaktionen: MVCC + WAL β Delta-Merge-Worker β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Storage Layer (Pages, B-Tree) β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
```
---
## Roadmap
Etappenweise β jede Stufe ist fΓΌr sich ein vollstΓ€ndiges Lernziel.
*(Reihenfolge ist Plan, kein Versprechen an einen Zeitpunkt.)*
- [ ] **Etappe 0 β Fundament**: Rust lernen, Projektstruktur, `cargo`, Tests
- [ ] **Etappe 1 β Storage Engine**: Pages, ein einfacher B-Tree, Lesen/Schreiben auf Platte
- [ ] **Etappe 2 β Row-Store + REPL**: Tabellen, Zeilen einfΓΌgen/lesen, kleine SQL-Teilmenge
- [ ] **Etappe 3 β SQL-Parser**: Tokenizer β AST β einfacher Planner
- [ ] **Etappe 4 β Transaktionen**: WAL (Write-Ahead-Log), Crash-Recovery, ACID-Grundlagen
- [ ] **Etappe 5 β MVCC**: Multi-Version-Concurrency, mehrere Leser/Schreiber
- [ ] **Etappe 6 β Column-Store**: spaltige Speicherung, Kompression, vektorisierte Aggregation
- [ ] **Etappe 7 β Delta-Merge**: Delta + Main, periodischer Merge-Worker β das HTAP-Herz β€οΈ
- [ ] **Etappe 8 β Optimizer**: Statistiken, Histogramme, kostenbasierte Planwahl
---
## Prinzipien
- **Verstehen vor Benutzen.** Jedes Modul kommentiert das *Warum*, nicht nur das *Was*.
- **Klein, aber echt.** Lieber eine simple Engine, die wirklich lΓ€uft, als ein leeres Framework.
- **Analogien nutzen.** paulDB β Postgres β HANA β DuckDB β Vergleiche machen Konzepte greifbar.
- **Ehrlich zum Stand.** Was lΓ€uft, lΓ€uft. Was noch nicht da ist, steht offen in der Roadmap.
---
## Lernressourcen
Die Schultern, auf denen paulDB steht:
- π **Database Internals** β Alex Petrov *(Storage Engines, B-Trees, verteilte Systeme)*
- π **Crafting Interpreters** β Robert Nystrom *(Parser, AST, Interpreter β fΓΌrs SQL-Frontend)*
- π» **[cstack/db_tutorial](https://cstack.github.io/db_tutorial/)** *(eine simple DB Schritt fΓΌr Schritt in C)*
- ποΈ **SQLite Source Code** *(das Vorbild fΓΌr βklein, robust, vollstΓ€ndig")*
- π¦ **The Rust Programming Language** (βthe Book") + **Rust by Example**
---
## Status
π± **Vision-Phase.** paulDB ist aktuell ein Zuhause fΓΌr einen Traum, der bewusst wartet,
bis mein SAP-Fundament steht. Das ist kein RΓΌckstand β das ist Reihenfolge.
Ein leeres Repo mit klarem Plan ist kein Hochstapeln. Es ist ein Versprechen an mich selbst.
---
von Paul Horn Β· gebaut, um zu verstehen Β· auf dem Weg nach BC ποΈ