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.
fonte
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.
fonte
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).
fonte
Existem livros sobre o tema que um bom ponto de partida seria : Sistemas de Banco de Dados: O Livro Completo de Garcia-Molina, Ullman e Widom
fonte
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:
fonte
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
fonte
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.
fonte
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.
fonte
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!
fonte