Comment écrire un moteur de base de données simple [fermé]


143

Je suis intéressé à apprendre comment fonctionne un moteur de base de données (c'est-à-dire les composants internes de celui-ci). Je connais la plupart des structures de données de base enseignées dans CS (arbres, tables de hachage, listes, etc.) ainsi qu'une assez bonne compréhension de la théorie du compilateur (et j'ai implémenté un interpréteur très simple) mais je ne comprends pas comment y aller sur l'écriture d'un moteur de base de données. J'ai recherché des tutoriels sur le sujet et je n'en ai trouvé aucun, j'espère donc que quelqu'un d'autre pourra me diriger dans la bonne direction. En gros, je voudrais des informations sur les points suivants:

  • Comment les données sont stockées en interne (c'est-à-dire comment les tables sont représentées, etc.)
  • Comment le moteur trouve les données dont il a besoin (par exemple, exécuter une requête SELECT)
  • Comment les données sont insérées de manière rapide et efficace

Et tout autre sujet qui pourrait être pertinent à ce sujet. Il n'est pas nécessaire que ce soit une base de données sur disque - même une base de données en mémoire est très bien (si c'est plus facile) parce que je veux juste apprendre les principes derrière cela.

Merci beaucoup pour votre aide.

Réponses:


55

Si vous êtes doué pour lire du code, étudier SQLite vous apprendra tout un tas de choses sur la conception de bases de données. Il est petit, il est donc plus facile de comprendre. Mais c'est aussi écrit de manière professionnelle.

http://sqlite.org/


2
LOC du shell de téléchargement sqlite.c => 3135, sqlite3.c => 136332, sqlite3ext.h => 447, sqlite3.h => 7097, total => 147011
Khaja Minhajuddin

1
Ce qui est probablement aussi petit que vous pouvez créer un moteur de base de données entièrement fonctionnel en utilisant un langage d'accolades. SQLite est également disponible en C #.
Robert Harvey


4
Je recommande de lire le code de SQLite 2.5.0: github.com/davideuler/SQLite-2.5.0-for-code-reading , c'est une première version de SQLite qui peut être compilée et exécutée sur GCC moderne (j'ai testé it sur MacOS 10.13 et Debian 8)
david euler

1
cstack.github.io/db_tutorial est un bon point de départ.
Ashish Negi

25

La réponse à cette question est énorme. attendez-vous à ce qu'une thèse de doctorat y réponde à 100%;) mais nous pouvons penser aux problèmes un par un:

  • Comment stocker les données en interne: vous devriez avoir un fichier de données contenant vos objets de base de données et un mécanisme de mise en cache pour charger les données en focus et certaines données autour de lui dans la RAM en supposant que vous avez une table, avec quelques données, nous créerions un format de données pour convertir cette table en un fichier binaire, en s'accordant sur la définition d'un délimiteur de colonne et d'un délimiteur de ligne et assurez-vous qu'un tel modèle de délimiteur n'est jamais utilisé dans vos données elles-mêmes. c'est-à-dire que si vous avez sélectionné <*> par exemple pour séparer les colonnes, vous devez valider les données que vous placez dans ce tableau pour ne pas contenir ce modèle. vous pouvez également utiliser un en-tête de ligne et un en-tête de colonne en spécifiant la taille de la ligne et un certain numéro d'indexation interne pour accélérer votre recherche, et au début de chaque colonne pour avoir la longueur de cette colonne comme "Adam", 1, 11.1, "

  • Comment trouver rapidement des éléments Essayez d'utiliser le hachage et l'indexation pour pointer sur les données stockées et mises en cache en fonction de différents critères en prenant le même exemple ci-dessus, vous pouvez trier la valeur de la première colonne et la stocker dans un objet séparé pointant sur l'ID de ligne des éléments triés par ordre alphabétique , etc

  • Comment accélérer l'insertion de données que je connais d'Oracle, c'est qu'ils insèrent des données dans un endroit temporaire à la fois dans la RAM et sur le disque et font du ménage régulièrement, le moteur de base de données est occupé tout le temps à optimiser sa structure mais dans le même temps nous ne le faisons pas veulent perdre des données en cas de panne de courant de quelque chose comme ça. alors essayez de conserver les données dans cet endroit temporaire sans tri, ajoutez votre stockage d'origine, et plus tard, lorsque le système est libre, utilisez vos index et effacez la zone temporaire lorsque vous avez terminé

bonne chance, super projet.


11

SQLite a déjà été mentionné, mais je veux ajouter quelque chose.

J'ai personnellement beaucoup appris en étudiant SQlite. Ce qui est intéressant, c'est que je ne suis pas allé au code source (même si je viens de jeter un coup d'œil). J'ai beaucoup appris en lisant le matériel technique et en regardant particulièrement les commandes internes qu'il génère. Il a son propre interpréteur basé sur la pile à l'intérieur et vous pouvez lire le P-Code qu'il génère en interne simplement en utilisant expl. Ainsi, vous pouvez voir comment diverses constructions sont traduites dans le moteur de bas niveau (c'est étonnamment simple - mais c'est aussi le secret de sa stabilité et de son efficacité).



9

D'accord, j'ai trouvé un site qui contient des informations sur SQL et l'implémentation - il est un peu difficile de créer un lien vers la page qui répertorie tous les tutoriels, donc je vais les lier un par un:


8

Je suggérerais de me concentrer sur www.sqlite.org

C'est récent, petit (code source 1 Mo), open source (vous pouvez donc le découvrir par vous-même) ...

Des livres ont été écrits sur la façon dont il est mis en œuvre:

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

Il fonctionne sur une variété de systèmes d'exploitation pour les ordinateurs de bureau et les téléphones mobiles, il est donc facile d'expérimenter et d'en apprendre davantage à ce sujet sera utile maintenant et à l'avenir.

Il a même une communauté décente ici: /programming/tagged/sqlite


1
La taille d'octet pour 3.10 est maintenant de près de 7,0 Mo de code source. Seuls quelques privilégiés pouvaient digérer tout cela en une seule séance. Néanmoins, c'est aussi un bon endroit pour commencer.
Laurie Stearn

1
En effet. Ayant récemment passé du temps dans le code source de SQLite afin de trouver un bogue dans SQLCipher, c'est un cauchemar absolu. La vie était plus simple il y a 6 ans :-)
michael aubert

Juste une petite question car j'ai raté la fête, je suppose que ce serait beaucoup plus relaxant (et peut-être utile) de partir de la première version? En fait, je devrais le faire pour toute lecture de code sérieuse de grands projets?
Nicholas Humphrey

7

peut-être que vous pouvez apprendre de HSQLDB . Je pense qu'ils offrent une base de données petite et simple pour l'apprentissage. vous pouvez regarder les codes car il est open source.


3

Je ne sais pas si cela répondrait à vos besoins, mais j'avais implémenté une base de données simple orientée fichier avec prise en charge de simple ( SELECT, INSERT , UPDATE) en utilisant perl.
Ce que j'ai fait, c'est que j'ai stocké chaque table sous forme de fichier sur le disque et les entrées avec un modèle bien défini et j'ai manipulé les données en utilisant des outils Linux intégrés comme awk et sed. pour améliorer l'efficacité, les données fréquemment consultées ont été mises en cache.


1
avez-vous toujours le code, pouvez-vous partager un lien
GK1

3

Si MySQL vous intéresse, je vous suggère également cette page wiki , qui contient des informations sur le fonctionnement de MySQL. Vous voudrez peut-être également jeter un œil à Comprendre les composants internes de MySQL .

Vous pouvez également envisager de rechercher une interface non SQL pour votre moteur de base de données. Veuillez jeter un œil à Apache CouchDB . C'est ce que vous appelleriez, un système de base de données orienté document.

Bonne chance!


ET si vous voulez regarder une autre base de données: sqlserverinternals.com, ses nbooks sur les serveurs internes de SQl sont le top-nitch.
HLGEM
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.