Como escrever um mecanismo de banco de dados simples [fechado]


143

Estou interessado em aprender como funciona um mecanismo de banco de dados (ou seja, as partes internas dele). Conheço a maioria das estruturas básicas de dados ensinadas em CS (árvores, tabelas de hash, listas etc.), bem como um bom entendimento da teoria dos compiladores (e implementamos um intérprete muito simples), mas não entendo como seguir sobre como escrever um mecanismo de banco de dados. Procurei tutoriais sobre o assunto e não encontrei nenhum, por isso espero que outra pessoa possa me apontar na direção certa. Basicamente, gostaria de obter informações sobre o seguinte:

  • Como os dados são armazenados internamente (ou seja, como as tabelas são representadas etc.)
  • Como o mecanismo encontra os dados necessários (por exemplo, execute uma consulta SELECT)
  • Como os dados são inseridos de maneira rápida e eficiente

E quaisquer outros tópicos que possam ser relevantes para isso. Ele não precisa ser um banco de dados em disco - mesmo um banco de dados em memória é bom (se for mais fácil), porque eu só quero aprender os princípios por trás dele.

Muito obrigado pela sua ajuda.

Respostas:


55

Se você é bom em ler código, o estudo do SQLite ensina a você toda a carga sobre o design do banco de dados. É pequeno, por isso é mais fácil de entender. Mas também é escrito profissionalmente.

http://sqlite.org/


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

1
O que provavelmente é tão pequeno quanto você pode criar um mecanismo de banco de dados totalmente funcional usando uma linguagem de chaves. SQLite também está disponível em C #.
Robert Harvey


4
Eu recomendo ler o código do SQLite 2.5.0: github.com/davideuler/SQLite-2.5.0-for-code-reading , é uma versão anterior do SQLite que pode ser compilada e executada no GCC moderno (eu testei (MacOS 10.13 e Debian 8)
david euler

1
cstack.github.io/db_tutorial é um bom ponto de partida.
Ashish Negi

25

A resposta a esta pergunta é enorme. esperamos que uma tese de doutorado responda 100%;), mas podemos pensar nos problemas um por um:

  • Como armazenar os dados internamente: você deve ter um arquivo de dados contendo seus objetos de banco de dados e um mecanismo de cache para carregar os dados em foco e alguns dados em torno deles na RAM, desde que você tenha uma tabela, com alguns dados, criaríamos um formato de dados para converter esta tabela em um arquivo binário, concordando com a definição de um delimitador de coluna e de linha e verifique se esse padrão de delimitador nunca é usado nos seus dados. ou seja, se você selecionou <*> por exemplo para separar colunas, deve validar os dados que está colocando nesta tabela para não conter esse padrão. você também pode usar um cabeçalho de linha e um cabeçalho de coluna especificando o tamanho da linha e algum número de indexação interno para acelerar sua pesquisa e, no início de cada coluna, ter o comprimento dessa coluna como "Adam", 1, 11.1, "

  • Como localizar itens rapidamente, tente usar hash e indexação para apontar para os dados armazenados e armazenados em cache com base em diferentes critérios, seguindo o mesmo exemplo acima. Você pode classificar o valor da primeira coluna e armazená-lo em um objeto separado, apontando para o ID da linha dos itens classificados em ordem alfabética. , e assim por diante

  • Como acelerar a inserção de dados que eu sei da Oracle é que eles inserem dados em um local temporário na RAM e no disco e realizam tarefas domésticas periodicamente, o mecanismo de banco de dados fica ocupado o tempo todo otimizando sua estrutura, mas, ao mesmo tempo, não quer perder dados em caso de falta de energia de algo assim. tente manter os dados nesse local temporário sem classificação, acrescente seu armazenamento original e, mais tarde, quando o sistema estiver livre, recorra a seus índices e limpe a área temporária quando terminar

boa sorte, ótimo projeto.


11

O SQLite já foi mencionado antes, mas quero acrescentar alguma coisa.

Eu, pessoalmente, aprendi muito estudando o SQlite. O interessante é que eu não fui ao código fonte (apesar de ter apenas uma rápida olhada). Aprendi muito lendo o material técnico e observando especialmente os comandos internos que ele gera. Ele possui um próprio intérprete baseado em pilha e você pode ler o código P que ele gera internamente apenas usando o explica. Assim, você pode ver como várias construções são traduzidas para o mecanismo de baixo nível (surpreendentemente simples - mas esse também é o segredo de sua estabilidade e eficiência).



9

Ok, eu encontrei um site que tem algumas informações sobre SQL e implementação - é um pouco difícil vincular à página que lista todos os tutoriais, então eu os vincularei um por um:


8

Eu sugeriria focar em www.sqlite.org

É recente, pequeno (código fonte de 1 MB), de código aberto (para que você possa descobrir por si mesmo) ...

Foram escritos livros sobre como é implementado:

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

Ele roda em uma variedade de sistemas operacionais, tanto para computadores de mesa quanto para celulares, de modo que é fácil experimentar e aprender sobre isso será útil agora e no futuro.

Ele ainda tem uma comunidade decente aqui: /programming/tagged/sqlite


1
O tamanho do byte para 3.10 é agora quase 7.0 mb de código fonte. Apenas alguns privados poderiam digerir tudo isso de uma só vez. No entanto, este também é um bom lugar para começar.
Laurie Stearn

1
De fato. Tendo recentemente passado algum tempo dentro do código fonte do SQLite para encontrar um bug no SQLCipher, é um pesadelo absoluto. A vida era mais simples 6 anos atrás :-)
michael Aubert

Apenas uma pergunta rápida, como eu perdi a festa, acho que seria muito mais relaxante (e talvez útil) começar da primeira versão? Na verdade, devo fazê-lo para toda leitura séria de código de grandes projetos?
Nicholas Humphrey

7

pode ser que você possa aprender com o HSQLDB . Eu acho que eles oferecem banco de dados pequeno e simples para aprender. você pode olhar para os códigos, pois é de código aberto.


3

Não tenho certeza se isso se encaixaria nos seus requisitos, mas eu havia implementado um banco de dados simples orientado a arquivos com suporte para simples (SELECT, INSERT , UPDATE ) usando perl.
O que fiz foi armazenar cada tabela como um arquivo em disco e entradas com um padrão bem definido e manipular os dados usando ferramentas linux incorporadas, como awk e sed. para melhorar a eficiência, os dados acessados ​​com frequência foram armazenados em cache.


1
você ainda tem o código, você pode compartilhar um link
GK1 04/04

3

Se o MySQL lhe interessar, eu também sugeriria esta página wiki , que contém algumas informações sobre como o MySQL funciona. Além disso, você pode dar uma olhada em Entendendo o MySQL Internals .

Você também pode considerar olhar para uma interface não SQL para o seu mecanismo de Banco de Dados. Por favor, dê uma olhada no Apache CouchDB . É o que você chamaria, um sistema de banco de dados orientado a documentos.

Boa sorte!


E se você quiser procurar outro banco de dados: sqlserverinternals.com, seus nbooks nos internos do servidor SQl são os principais.
HLGEM
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.