Come scrivere un semplice motore di database [chiuso]


143

Sono interessato a sapere come funziona un motore di database (cioè i suoi interni). Conosco la maggior parte delle strutture di dati di base insegnate in CS (alberi, tabelle hash, elenchi, ecc.) Nonché una buona conoscenza della teoria dei compilatori (e ho implementato un interprete molto semplice) ma non capisco come procedere sulla scrittura di un motore di database. Ho cercato tutorial sull'argomento e non sono riuscito a trovarne nessuno, quindi spero che qualcun altro possa indicarmi la giusta direzione. Fondamentalmente, vorrei informazioni su quanto segue:

  • Come i dati vengono archiviati internamente (ovvero come sono rappresentate le tabelle, ecc.)
  • In che modo il motore trova i dati di cui ha bisogno (ad es. Eseguire una query SELECT)
  • Come vengono inseriti i dati in modo rapido ed efficiente

E qualsiasi altro argomento che possa essere rilevante per questo. Non deve essere un database su disco - anche un database in memoria va bene (se è più facile) perché voglio solo imparare i principi dietro di esso.

Molte grazie per il vostro aiuto.

Risposte:


55

Se sei bravo a leggere il codice, studiare SQLite ti insegnerà un intero carico sulla progettazione del database. È piccolo, quindi è più facile avvolgere la testa. Ma è anche scritto professionalmente.

http://sqlite.org/


2
LOC del download sqlite shell.c => 3135, sqlite3.c => 136332, sqlite3ext.h => 447, sqlite3.h => 7097, totale => 147011
Khaja Minhajuddin

1
Che è probabilmente il più piccolo possibile per creare un motore di database completamente funzionale usando un linguaggio di parentesi graffe. SQLite è disponibile anche in C #.
Robert Harvey,


4
Consiglio di leggere il codice di SQLite 2.5.0: github.com/davideuler/SQLite-2.5.0-for-code-reading , è una versione iniziale di SQLite che può essere compilata ed eseguita su GCC moderno (ho testato su MacOS 10.13 e Debian 8)
David Euler,

1
cstack.github.io/db_tutorial è un buon punto di partenza.
Ashish Negi,

25

La risposta a questa domanda è enorme. aspettiamo che una tesi di dottorato abbia una risposta al 100%;) ma possiamo pensare ai problemi uno per uno:

  • Come archiviare i dati internamente: dovresti avere un file di dati contenente i tuoi oggetti di database e un meccanismo di memorizzazione nella cache per caricare i dati in primo piano e alcuni dati attorno ad essi nella RAM presuppongono che tu abbia una tabella, con alcuni dati, creeremo un formato dati per convertire questa tabella in un file binario, concordando la definizione di delimitatore di colonna e delimitatore di riga e assicurarsi che tale modello di delimitatore non venga mai utilizzato nei dati stessi. cioè se hai selezionato <*> ad esempio per separare le colonne, dovresti convalidare i dati che stai inserendo in questa tabella per non contenere questo modello. potresti anche utilizzare un'intestazione di riga e un'intestazione di colonna specificando la dimensione della riga e un numero di indicizzazione interno per velocizzare la ricerca e all'inizio di ogni colonna per avere la lunghezza di questa colonna come "Adam", 1, 11.1, "

  • Come trovare rapidamente gli articoli prova a utilizzare l'hash e l'indicizzazione per puntare ai dati archiviati e memorizzati nella cache in base a criteri diversi prendendo lo stesso esempio sopra, puoi ordinare il valore della prima colonna e archiviarlo in un oggetto separato che punta all'ID di riga degli elementi ordinati alfabeticamente , e così via

  • Come velocizzare l'inserimento dei dati che conosco da Oracle è che inseriscono i dati in un posto temporaneo sia nella RAM che sul disco e fanno le pulizie su base periodica, il motore di database è sempre impegnato a ottimizzare la sua struttura ma allo stesso tempo non lo facciamo vuole perdere dati in caso di interruzione di corrente di qualcosa del genere. quindi prova a conservare i dati in questo luogo temporaneo senza ordinamento, aggiungi la memoria originale e in seguito quando il sistema è libero, ricorri gli indici e cancella l'area temporanea quando hai finito

buona fortuna, grande progetto.


11

SQLite è stato menzionato prima, ma voglio aggiungere qualcosa.

Personalmente ho imparato molto studiando SQlite. La cosa interessante è che non sono andato al codice sorgente (anche se ho appena dato una breve occhiata). Ho imparato molto leggendo il materiale tecnico e osservando in particolare i comandi interni che genera. Ha un proprio interprete basato su stack interno e puoi leggere il P-Code che genera internamente semplicemente usando spiega. Così puoi vedere come i vari costrutti vengono tradotti nel motore di basso livello (che è sorprendentemente semplice - ma che è anche il segreto della sua stabilità ed efficienza).



9

Ok, ho trovato un sito che contiene alcune informazioni su SQL e l'implementazione - è un po 'difficile collegarsi alla pagina che elenca tutti i tutorial, quindi li collegherò uno per uno:


8

Suggerirei di concentrarmi su www.sqlite.org

È recente, piccolo (codice sorgente 1 MB), open source (in modo da poterlo capire da solo) ...

Sono stati scritti libri su come è implementato:

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

Funziona su una varietà di sistemi operativi sia per computer desktop che per telefoni cellulari, quindi sperimentare è facile e apprenderlo sarà utile ora e in futuro.

Ha anche una comunità decente qui: /programming/tagged/sqlite


1
La dimensione in byte per 3.10 è ora quasi 7,0 mb di codice sorgente. Solo pochi privilegiati potrebbero digerire tutto ciò in una sola seduta. Tuttavia, questo è anche un buon punto di partenza.
Laurie Stearn,

1
Infatti. Avere recentemente trascorso un po 'di tempo all'interno del codice sorgente di SQLite per trovare un bug in SQLCipher, è un vero incubo. La vita è stata più semplice 6 anni fa :-)
michael aubert il

Solo una domanda veloce visto che ho perso la festa, immagino che sarebbe molto più rilassante (e forse utile) iniziare dalla prima versione? In realtà dovrei farlo per tutte le letture di codici seri di grandi progetti?
Nicholas Humphrey,

7

forse puoi imparare da HSQLDB . Penso che offrano un database piccolo e semplice per l'apprendimento. puoi guardare i codici poiché è open source.


3

Non sono sicuro che si adattasse alle tue esigenze, ma avevo implementato un semplice database orientato ai file con supporto per simple ( SELECT, INSERT , UPDATE) usando perl.
Quello che ho fatto è stato archiviare ogni tabella come file su disco e voci con uno schema ben definito e manipolare i dati usando strumenti Linux integrati come awk e sed. per migliorare l'efficienza, i dati a cui si accedeva di frequente venivano memorizzati nella cache.


1
hai ancora il codice, puoi condividere un link
GK1

3

Se MySQL ti interessa, suggerirei anche questa pagina wiki , che ha alcune informazioni su come funziona MySQL. Inoltre, potresti dare un'occhiata a Comprensione di MySQL Internals .

Potresti anche considerare di guardare un'interfaccia non SQL per il tuo motore di database. Dai un'occhiata ad Apache CouchDB . È quello che chiamereste un sistema di database orientato ai documenti.

In bocca al lupo!


E se vuoi guardare un altro db: sqlserverinternals.com, i suoi nbook sugli interni del server SQl sono i migliori.
HLGEM,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.