Crea il mio sistema di database [chiuso]


65

Devo imparare come funzionano i database per usarli in modo più efficiente e il mio modo di apprendere è farlo.

Voglio creare il mio sistema di database. Non mi riferisco alla creazione di uno pseudo database che utilizzerebbe la query per analizzare i file; questa sarebbe semplicemente un'interfaccia del filesystem con un linguaggio di query. Sto parlando della struttura effettiva di un motore di database. E poiché ciò che ho in mente non è né relazionale né orientato ai documenti (è "orientato al nodo", se esiste), avrei bisogno di qualsiasi risorsa per essere il più astratta e di alto livello possibile.

Quindi come potrei fare per crearlo? Quali risorse / tutorial / libri posso leggere per capire?

La lingua non ha alcuna importanza. Idealmente, il codice sarebbe uno pseudo-codice per illustrare il concetto, non legato a un linguaggio particolare, ma farebbe qualsiasi cosa. Non sono riuscito a trovare nulla sull'argomento su Google (dal momento che sono così analfabeta sull'argomento, forse non sto semplicemente inserendo la ricerca giusta).

Se tali risorse non sono disponibili, suppongo che qualcosa su come creare un client sarebbe almeno un passo nella giusta direzione.


15
Perché non scrivere un compilatore invece? O ancora meglio, il tuo sistema operativo? Se sei seriamente intenzionato a scrivere il tuo database, ci sono un migliaio di database open source là fuori: studia il loro codice sorgente, contribuisci con alcune patch. Quindi inizia a pensare di costruirne uno tuo.
yannis,

4
Puoi seguire alcuni corsi di database a livello universitario e universitario. Ci sono molti corsi open source online. Puoi anche acquistare alcuni libri di testo e studiarli nel tempo libero. Questo ti darà alcune idee e punti di partenza. Anche leggere la storia e le notizie su PostgreSQL sarà di aiuto (in termini di immaginazione, anche se non ti darà idea di come siano effettivamente implementate queste funzionalità)
rwong

9
I studied open-source DBs, but their codebase is too huge: Se qualcosa come redis o flockdb è troppo grande per essere letto, non vedo come farai per scrivere o possedere un database.
yannis,

10
@YannisRizos In tutta onestà, leggere il codice (imo) è molto più difficile che scriverlo da soli.
AlexWebr,

12
@Xananax: non ascoltare le rane ( crystal-reflections.com/stories/story_73.htm ). Fai quello che ti piace e non è necessario avere un obiettivo per trarre piacere dal processo.

Risposte:


62

(è "orientato al nodo", se esiste)

Comincia qui. Quando si ha a che fare con un'applicazione complessa come un database (anche un semplice database è un'applicazione complessa), è necessario conoscere la storia del dominio e la terminologia corretta e avere almeno un'idea di livello molto alto dell'architettura. Potresti iniziare dall'articolo di Wikipedia sul database . Ho trascorso alcuni giorni a leggere tutti gli articoli sui concetti correlati e sui diversi tipi di database.

E poiché ciò che ho in mente non è né relazionale né orientato ai documenti

Quindi, scegli Relazionale o NoSQl. Se scegli NoSQL, dovresti scegliere un tipo di NoSQL. Questo è estremamente importante, non troverai alcun documento architettonico che discute tutte le diverse famiglie di database. Non importa quale scegli, basta sceglierne uno e attenersi ad esso.

La lingua non ha alcuna importanza.

Sì, purtroppo, perché dopo aver scelto una famiglia di database dovresti iniziare a esplorare il codice dai database open source di quella famiglia. Ci sono alcune linee guida generiche su cosa cercare:

  • Base di codice relativamente piccola,
  • Documenti di architettura o almeno un blog di sviluppo,
  • Il database che scegli dovrebbe essere vicino a ciò che è considerato generico nella famiglia, sarebbe più difficile imparare se è altamente specializzato.

Alcuni esempi adatti:

Ottieni la fonte, compila e gioca con esso. Non è necessario inviare patch o nulla di speciale, basta esplorare il codice e apportare piccole modifiche qua e là per vedere cosa succede. È un processo incrementale, più ci giochi, più sarà facile capire cosa fa il codice. Se il primo progetto che hai scelto sembra estremamente difficile da capire, passa al successivo.

Un'altra grande opzione sarebbe quella di concentrarsi sulla costruzione di un motore per MySQL, come suggerisce @NB in ​​una risposta precedente .

Se raggiungi un punto in cui sei in grado di fare qualcosa di utile con la base di codice, essere coinvolto nella comunità del progetto, questo è il modo più semplice per trovare risorse più dettagliate sui concetti coinvolti.

E poi, finalmente, inizia a lavorare sul tuo database. All'inizio potevi semplicemente scrivere un clone estremamente ridotto del codice che stavi esplorando. Non deve essere originale, alcuni grandi progetti sono iniziati come cloni o forchette.

Quali risorse / tutorial / libri posso leggere per capire?

Ci sono alcuni libri:

E poche centinaia di altri, oltre a una miriade di documenti accademici che puoi facilmente rintracciare tramite Google. Devi prima definire cosa vuoi fare, quindi cercare un libro. Essere coinvolti con una comunità di colleghi autori di database ti aiuterà anche a restringere l'elenco dei libri e forse ottenere suggerimenti molto migliori di quanto sopra.

In bocca al lupo! Mi aspetto un commento con un link al tuo repository quando hai finito. E se non hai mai finito, assicurati di lasciare un commento che mi ricorda che non ho ancora finito quel compilatore che ho iniziato a scrivere nel 2001.


5
questo è un bel post
Chani il

2
Questo è super! Ancora di più viene da te :) Mi piacerebbe accettare quasi ogni altra risposta ma dato che devo sceglierne una, deve essere questa. I'm expecting a comment with a link to your repository when you're done: sicuramente! Grazie ancora, a te e a tutti gli altri, è stato davvero incoraggiante.
Xananax,

3
E per chiunque venga qui alla ricerca delle stesse risposte: trovo flockDB il miglior candidato da imparare, la base di codice è davvero piccola, il codice molto leggibile (anche se non parlo scala) e facile da capire.
Xananax,

@Yannis, tra quale dei libri che consigli sono quelli che hai letto?
Pacerier,

@Xananax Sooo come sta andando? Qualche repository che possiamo guardare? :)
Radu Murzea,

27

Dovresti semplicemente farlo e smettere di pensare troppo. Godere del processo di apprendimento ed entusiasmo sono doni.

Chiedere agli altri se è una buona idea non è certamente una buona strategia . Se avessi ascoltato tutte le rane, lavorerei ancora oggi a Ikea spingendo il carrello dal parcheggio al deposito.

Non devi giustificarti come ha fatto Ayende in quell'interessante post . La domanda era:

Tuttavia, come sviluppatore pragmatico, mi chiedo quali novità offre questo progetto in un mercato saturo in cui hai alternative abbastanza mature come CouchDB, MongoDB, Tokyo, Redis e molte altre? Molti di questi prodotti sono anche multipiattaforma e funzionano a velocità C con un record comprovato, essendo utilizzati in siti Web molto grandi in cui le loro capacità di condivisione e la tolleranza agli errori sono state spinte lontano.

Se ti piace il processo, non preoccuparti dell'obiettivo, hai già vinto.


4
+1, risposta molto premurosa e di insegnamento :-) ... davvero bella risposta a qualcuno che vuole fare qualcosa
Pankaj Upadhyay

Davvero molto bello. Ero sul punto di accettarlo. Non l'ho fatto perché pensavo che la risposta di Yannis fosse più precisa, e più probabile che potesse aiutare le persone a fare la stessa domanda. Ma questo è stato decisamente incoraggiante. Molte grazie.
Xananax,

La risposta di Yannis è migliore della mia e merita la tua scelta

6

"(è" orientato al nodo ", se esiste)". - Questo potrebbe essere il motivo per cui non trovi molto!

Tuffati con la versione 0.1 e vedi dove arrivi. Puoi imparare di più provando a produrre quello che vuoi che chiedendo cosa "dovresti" fare. Dagli qualche giorno e poi rivedi dove hai.

Circa 18 anni fa ho scritto un sistema di database di base (per divertimento, vai a capire) con indici btree e ho imparato moltissimo.



4

Sembra un grande progetto. Apparentemente il tuo obiettivo non è quello di creare un software di produzione, ma di conoscere i database e il processo di creazione di un sistema di database.

Non credo davvero che tu debba fare molte ricerche. Sembra che lo scopo sia quello di ottenere l'esperienza di ciò che accade nella creazione di un sistema di database basato su nodi.

Ecco come vorrei iniziare:

  1. Scegli la tua lingua preferita o una lingua che desideri migliorare.
  2. Crea l'oggetto nodo (o qualunque sia il più vicino nella tua lingua). Scopri come collegarli.
  3. Fai un breve elenco di istruzioni SQL che implementerai per prime.
  4. Decidi come salvare i dati. Una soluzione ovvia è serializzare tutti i nodi, caricarli all'avvio del programma e salvarli alla fine del programma.

Dopo aver funzionato le basi, avrai molte più informazioni su ciò che è difficile o problematico. Quindi puoi fare qualche ricerca al riguardo, trovare alcuni miglioramenti e integrarli.


1
Sto seguendo i passaggi che hai suggerito. 1,2,3 non sono un problema. Tuttavia, sono sconcertato dal numero 4. Nel caso di grandi quantità di dati, come caricare in memoria solo le parti pertinenti? Ho pensato di archiviare tutto come dati binari e mantenere un altro file indice, ma cosa succede se l'utente non esegue una query per indice? Dovrei ancora passare in
rassegna

Perché non archiviare tutto in memoria? Se dedichi 1 GB, ciò conterrebbe molti dati. In alternativa, memorizza ogni nodo di dati binari su disco e quindi avresti 1 GB per il testo. Questo è un sacco di testo. Ad ogni modo, penso che la gestione di un database di dimensioni superiori a 1 GB non sia fondamentale per l'esercizio.
B Sette,

Inoltre, puoi creare molti metodi per lavorare in modo efficiente entro 1 GB di memoria. Puoi migliorare quella parte del sistema in un secondo momento. Una soluzione è caricare tutte le informazioni del nodo in memoria, ma archiviare i dati di ciascun nodo sul disco. In questo modo puoi attraversare in modo efficiente i nodi e accedere al disco solo per recuperare i dati di cui hai veramente bisogno.
B Sette,

3

Scrivere il proprio database "in modo da capire come funziona tutto" è l'unica buona ragione per farlo (dato che i database sono pazzi per ottenere il giusto e difficili da dimostrare corretti). Sei pazzo, ma in senso buono!

Per vedere come è fatto, suggerisco di guardare SQLite. L' origine SQLite è compressa solo circa 1,3 MB ed è un database transazionale completamente conforme ACID. È anche di dominio pubblico e l'autore principale è un bravo ragazzo che sono sicuro che sarà felice di rispondere alle tue domande. (Penso che i bit più delicati arrivino nel modo in cui impegnare veramente le informazioni su disco; convincere i sistemi operativi e l'hardware a smettere di mentire e scrivere davvero la transazione ADESSO è sorprendentemente difficile e perché sono così felice di non dover mai scrivere un DB.)


1
La base di codice SQLite si avvicina a 0,2 * 10 ^ 6 loc (decompresso 5mb), non è così piccola.
yannis,

1
@Yannis: confronta con MySQL o PostgreSQL o qualsiasi altro sistema DB del server ...
Donal Fellows,


3

Devo imparare come funzionano i database

Impara l'algebra relazionale.

Trova un piccolo motore DB, impara l'origine.

per usarli in modo più efficiente

No. Devi imparare come utilizzare in modo efficiente un database. Potresti essere un guidatore migliore se capisci come funziona la tua auto, ma sarai un guidatore molto migliore se ti concentri davvero sulla guida.

Segui i percorsi tradizionali: segui un corso, leggi un libro, verifica tra pari, fai domande, usa l'indice luke .


5
Learn relational algebra.Supponendo che op sia interessato ai database relazionali ovviamente ...
yannis,
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.