kestrel

Un motore di database relazionale da zero in Kotlin: parser SQL, storage su B-tree, executor, transazioni WAL e CLI. Esegue query SQL reali ed è coperto da una suite di test completa.

kestrel
TL;DR

Un motore di database relazionale scritto da zero in Kotlin: parser SQL proprio, un executor di query, storage su B-albero e transazioni con giornale WAL. In più una CLI e una suite di test completa.

Panoramica

kestrel è un motore di database relazionale scritto da zero in Kotlin. Ha tutto ciò che rende un database un database, e non solo un deposito di dati: un parser SQL proprio, un executor di query, storage basato su B-albero, transazioni con giornale WAL, e in più una CLI e una suite di test completa. Esegue vere query SQL invece di fingere di gestirle.

Nel quotidiano un database è una riga: esegui una query, ottieni righe. Scriverlo da zero strappa via questo comfort e mostra quante cose accadono sotto - ed è proprio questo percorso verso il basso il senso di questo progetto.

Dietro un solo innocente SELECT si cela una catena di domande difficili. Come tenere i dati sul disco per trovarli in fretta? Come tradurre il testo SQL in un piano di esecuzione che sappia cosa leggere e in quale ordine? E la più dura: come non perdere una scrittura quando la corrente sparisce a metà operazione?

Ognuna di queste domande è nel quotidiano nascosta dietro il comfort di un database già pronto. Scrivere un motore da zero le tira fuori una a una e costringe a risolverle davvero, invece di liquidarle con un gesto. Per questo un database è uno dei migliori progetti che ci si possa porre per capire il computer più a fondo.

Il percorso completo di una query

kestrel prende una query ordinaria e la fa passare per il percorso completo - dal testo fino ai byte sul disco. Ogni fase ha un compito e passa il suo risultato alla successiva, e il tutto si segue col dito, da una riga di SQL fino al punto in cui i dati atterrano.

demo.sql · sql
CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT);
INSERT INTO users VALUES (1, 'ada');
SELECT name FROM users WHERE id = 1;
1
Parser

il testo SQL si trasforma in un albero di query.

2
Executor

l'albero diventa un piano: cosa leggere e in quale ordine.

3
Storage

i dati vivono in un B-albero perché le ricerche per chiave siano rapide.

4
WAL

ogni modifica va prima nel giornale, solo dopo al suo posto.

Gli strati del motore

StratoCompito
ParserSQL in un albero di query
Executoralbero in un piano di esecuzione
Storagedati in un B-albero per ricerche rapide
WALun giornale d'intento prima della scrittura reale

WAL, ovvero perché non perdi i dati

La parte più difficile di un database è invisibile finché qualcosa non va storto. Il WAL è il meccanismo che decide se, dopo uno spegnimento improvviso, il database torna a uno stato coerente o ti lascia con una transazione scritta a metà. La regola è semplice e inviolabile: prima scrivere l'intento nel giornale, poi la modifica reale - mai il contrario.

!
Attenzione

Il WAL non è un ornamento. È lui a decidere se, dopo uno spegnimento improvviso, il database torna a uno stato coerente o ti lascia con una transazione scritta a metà. Prima scrivere l'intento nel giornale, poi la modifica reale - ogni inversione di quest'ordine è una potenziale perdita di dati.

Il risultato: conoscenza che resta

È un progetto che, una volta finito, cambia il modo in cui guardi ogni altro database - perché all'improvviso sai cosa c'è sotto quel singolo SELECT. kestrel esegue vere query, supera una suite di test completa e ha una CLI, quindi non è uno schizzo ma un motore funzionante. E la conoscenza che resta vale più del codice stesso.

Altri progetti

Altri lavori della stessa categoria - scopri come affrontiamo sfide simili.

Hai un progetto simile?

Contattaci - il preventivo è gratuito e arriva entro un'ora.