Criar meu próprio sistema de banco de dados [fechado]

65

Preciso aprender como os bancos de dados funcionam para usá-los com mais eficiência, e minha maneira de aprender é fazê-lo.

Eu quero criar meu próprio sistema de banco de dados. Não estou me referindo à criação de um pseudo-banco de dados que usaria a consulta para analisar arquivos; isso seria simplesmente uma interface do sistema de arquivos com uma linguagem de consulta. Eu estou falando sobre a estrutura real de um mecanismo de banco de dados. E como o que tenho em mente não é relacional nem orientado a documentos (é "orientado a nós", se é que isso existe)), eu precisaria de qualquer recurso para ser o mais abstrato e de alto nível possível.

Então, como eu iria criar isso? Quais recursos / tutoriais / livros posso ler para entender?

O idioma não importa nem um pouco. Idealmente, o código seria um pseudocódigo para ilustrar o conceito, não vinculado a um idioma específico, mas qualquer coisa faria. Não consegui encontrar nada sobre o assunto no google (já que sou tão analfabeta no assunto, talvez não esteja apenas inserindo a pesquisa correta).

Se esses recursos não estiverem disponíveis, acho que algo sobre como criar um cliente seria pelo menos um passo na direção certa.

Xananax
fonte
15
Por que não escrever um compilador? Ou melhor ainda, seu próprio sistema operacional? Se você realmente quer escrever seu próprio banco de dados, existem mil e um bancos de dados de código aberto por aí: Estude o código-fonte deles, contribua com alguns patches. Então comece a pensar em construir o seu próprio.
yannis
4
Você pode fazer alguns cursos de banco de dados de nível superior e superior. Existem muitos cursos de código aberto online. Você também pode comprar alguns livros e estudá-los no tempo livre. Isso lhe dará algumas idéias e pontos de partida. Lendo a história e notícias sobre PostgreSQL também irá ajudar (em termos de imaginação, embora não lhe dará alguma idéia de como esses recursos são realmente implementadas)
rwong
9
I studied open-source DBs, but their codebase is too huge: Se algo como redis ou flockdb for muito grande para você ler, não vejo como você lida com a escrita ou com o próprio banco de dados.
yannis
10
@YannisRizos Para ser justo, ler código (imo) é muito mais difícil do que escrever você mesmo.
AlexWebr
12
@Xananax: não ouça os sapos ( crystal-reflections.com/stories/story_73.htm ). Faça o que quiser e não é necessário ter um objetivo para ter prazer no processo.

Respostas:

61

(é "orientado a nós", se isso existir)

Começa aqui. Ao lidar com um aplicativo complexo como um banco de dados (mesmo um banco de dados simples é um aplicativo complexo), você deve estar familiarizado com o histórico do domínio e com a terminologia apropriada e ter pelo menos uma idéia de nível muito alto da arquitetura. Você pode começar do artigo da Wikipedia sobre banco de dados . Passei alguns dias lendo todos os artigos sobre os conceitos relacionados e os diferentes tipos de banco de dados.

E como o que tenho em mente não é relacional nem orientado a documentos

Em seguida, você escolhe Relational ou NoSQl. Se você escolher o NoSQL, deverá escolher um tipo de NoSQL. Isso é extremamente importante, você não encontrará nenhum documento arquitetural que discuta todas as diferentes famílias de bancos de dados. Realmente não importa qual você escolher, basta escolher um e ficar com ele.

O idioma não importa nem um pouco.

Sim (infelizmente), porque depois de escolher uma família de bancos de dados, você deve começar a explorar o código nos bancos de dados de código aberto dessa família. Existem algumas diretrizes genéricas sobre o que procurar:

  • Base de código relativamente pequena,
  • Documentos arquitetônicos ou pelo menos um blog de desenvolvimento,
  • O banco de dados escolhido deve estar próximo do que é considerado genérico na família; seria mais difícil aprender com isso, se for altamente especializado.

Alguns exemplos que se encaixam:

Obtenha a fonte, compile-a e brinque com ela. Você não precisa enviar patches ou qualquer coisa que deseje, basta explorar o código e fazer pequenas alterações aqui e ali para ver o que acontece. É um processo incremental, quanto mais você brinca com ele, mais fácil será entender o que o código faz. Se o primeiro projeto escolhido parecer extremamente difícil de entender, passe para o próximo.

Outra ótima opção seria se concentrar na construção de um mecanismo para o MySQL, como o @NB sugere em uma resposta anterior .

Se você chegar a um ponto em que é capaz de fazer algo útil com a base de código, envolva-se na comunidade do projeto, essa é a maneira mais fácil de encontrar recursos mais detalhados sobre os conceitos envolvidos.

E, finalmente, comece a trabalhar no seu banco de dados. No começo, você pode escrever um clone extremamente reduzido do código que está explorando. Não precisa ser original, alguns ótimos projetos começaram como clones ou garfos.

Quais recursos / tutoriais / livros posso ler para entender?

Existem alguns livros:

E algumas outras centenas, além de uma infinidade de trabalhos acadêmicos que você pode rastrear facilmente via Google. Você precisa definir o que deseja fazer primeiro e depois procurar um livro. O envolvimento com uma comunidade de colegas autores de bancos de dados também ajudará você a restringir a lista de livros e, talvez, a obter sugestões muito melhores do que as anteriores.

Boa sorte! Estou esperando um comentário com um link para o seu repositório quando terminar. E se você nunca terminar, não deixe de comentar que ainda não terminei o compilador que comecei a escrever em 2001.

yannis
fonte
5
este é um bom post #
Chani 25/11
2
Isso é super! Ainda mais vindo de você :) Eu gostaria de aceitar uma resposta quase uma da outra, mas desde que eu tenho que escolher uma, isso tem que ser. I'm expecting a comment with a link to your repository when you're done: definitivamente! Mais uma vez obrigado a você e a todos os outros, isso foi realmente edificante.
Xananax
3
E para quem vem aqui procurando as mesmas respostas: considero o flockDB o melhor candidato para aprender, a base de código é realmente pequena, o código muito legível (embora eu não falo scala) e fácil de entender.
Xananax
@ Yannis, qual dos livros que você recomenda são os que você leu?
Pacerier
@Xananax Sooo, como está indo? Qualquer repositório que podemos olhar? :)
Radu Murzea
27

Você deveria fazê-lo e parar de pensar demais. Apreciar o processo de aprendizagem e entusiasmo são presentes.

Perguntar aos outros se é uma boa ideia certamente não é uma boa estratégia . Se eu tivesse ouvido todos os sapos, ainda trabalharia na Ikea hoje empurrando o carrinho de compras do estacionamento para o depósito.

Você não precisa se justificar como Ayende fez nesse post interessante . A questão era:

No entanto, como desenvolvedor pragmático, estou me perguntando o que esse projeto está oferecendo em um mercado saturado, onde você tem alternativas bastante maduras como CouchDB, MongoDB, Tóquio, Redis e muito mais? Muitos desses produtos também são multiplataforma e executam na velocidade C com um registro comprovado, sendo usados ​​em sites muito grandes, onde seus recursos de sharding e tolerância a falhas foram ampliados.

Se você gosta do processo, não se preocupe com o objetivo, você já venceu.


fonte
4
+1, muito pensativo e resposta ensino :-) ... muito bom resposta a alguém que quer fazer somehting
Pankaj Upadhyay
Muito bom mesmo. Eu estava prestes a aceitar isso. Não achei, porque achei a resposta de yannis mais direta e mais provável de ajudar as pessoas que tinham a mesma pergunta. Mas isso foi definitivamente encorajador. Muito obrigado.
Xananax
A resposta de Yannis é melhor do que a minha e merece sua escolha
6

"(é" orientado a nós ", se isso existir)". - Pode ser por isso que você não está encontrando muito!

Mergulhe na versão 0.1 e veja onde você chega. Você pode aprender mais tentando produzir o que deseja e perguntando o que "deve" fazer. Reserve alguns dias e depois revise onde você está.

Há cerca de 18 anos, escrevi um sistema básico de banco de dados (por diversão, entendi) com índices btree e aprendi bastante.

Jaydee
fonte
4

O MySQL possui uma estrutura de mecanismo de armazenamento conectável; pode ser uma idéia verificar como os mecanismos são criados para funcionar no MySQL.

Mjh
fonte
4

Parece um ótimo projeto. Aparentemente, seu objetivo não é criar um software de produção, mas aprender sobre bancos de dados e o processo de criação de um sistema de banco de dados.

Eu realmente não acho que você precise fazer muita pesquisa. Parece que o objetivo é obter a experiência do que é necessário para criar um sistema de banco de dados baseado em nó.

Aqui está como eu começaria:

  1. Escolha o seu idioma favorito ou um idioma que você deseja melhorar.
  2. Crie o objeto do nó (ou o que for mais próximo no seu idioma). Descubra como vinculá-los.
  3. Faça uma pequena lista de instruções SQL que você implementará primeiro.
  4. Decida como salvar os dados. Uma solução óbvia é serializar todos os nós, carregá-los quando o programa iniciar e salvá-los quando o programa terminar.

Depois de começar o básico, você terá muito mais informações sobre o que é difícil ou problemático. Então você pode fazer alguma pesquisa sobre isso, encontrar algumas melhorias e integrá-las.

B Seven
fonte
11
Estou seguindo os passos que você sugeriu. 1,2,3 não são problema. No entanto, estou perplexo com o # 4. No caso de grandes quantidades de dados, como carregaria na memória apenas as partes relevantes? Pensei em armazenar tudo como dados binários e manter outro arquivo de índice, mas e se o usuário não estiver consultando por índice? Eu ainda teria que percorrer todo o arquivo ... Eu acho que é hora para outra pergunta
Xananax
Por que não armazenar tudo na memória? Se você dedicar 1 GB, isso conteria muitos dados. Como alternativa, armazene cada nó de dados binários no disco e você terá 1 GB para texto. Isso é muito texto. Enfim, acho que lidar com um banco de dados maior que 1 GB não é central para o exercício.
B Seven
Além disso, você pode criar muitos métodos para trabalhar com eficiência dentro de 1 GB de memória. Você pode melhorar essa parte do sistema posteriormente. Uma solução é carregar todas as informações do nó na memória, mas armazenar os dados de cada nó no disco. Dessa forma, você pode atravessar com eficiência os nós e acessar apenas o disco para recuperar os dados realmente necessários.
B Seven
3

Escrever seu próprio banco de dados “para entender como tudo funciona” é a única boa razão para fazê-lo (já que os bancos de dados são muito difíceis de acertar e difíceis de provar). Você é louco, mas de um jeito bom!

Para ver como é feito, sugiro olhar para SQLite. A fonte SQLite é compactada em apenas 1,3 MB e é um banco de dados transacional totalmente compatível com ACID. Também é de domínio público e o autor principal é um cara legal que, com certeza, ficará feliz em responder às suas perguntas. (Acho que as partes mais complicadas são como comprometer verdadeiramente as informações no disco; convencer os sistemas operacionais e o hardware a parar de mentir e realmente escrever a transação. AGORA é surpreendentemente difícil e por que estou tão feliz por nunca ter que escrever um banco de dados.)

Donal Fellows
fonte
11
A base de código SQLite se aproxima de 0,2 * 10 ^ 6 loc (5MB descomprimido), não é que pequena.
precisa
11
@ Yannis: Compare com MySQL ou PostgreSQL ou qualquer outro sistema de banco de dados de servidor ...
Donal Fellows
3

Preciso aprender como funcionam os bancos de dados

Aprenda álgebra relacional.

Encontre um pequeno mecanismo de banco de dados, aprenda a fonte.

para usá-los com mais eficiência

Não. Você precisa aprender como usar com eficiência um banco de dados. Você pode ser um motorista melhor se entender como o carro funciona, mas será um motorista muito melhor se realmente se concentrar em dirigir.

Siga as rotas tradicionais: faça um curso, leia um livro, faça uma revisão por pares, faça perguntas, use o índice luke .

Incógnito
fonte
5
Learn relational algebra.Assumindo op está interessado em bancos de dados relacionais, é claro ...
yannis