web-dev-qa-db-fra.com

Comment écrire un moteur de base de données simple

Je suis intéressé à apprendre le fonctionnement d’un moteur de base de données (c’est-à-dire son fonctionnement interne). Je connais la plupart des structures de données de base enseignées dans CS (arbres, tables de hachage, listes, etc.) ainsi qu'une très 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 à propos de l'écriture d'un moteur de base de données. J'ai cherché des tutoriels sur le sujet et je n'ai pas pu en trouver. J'espère donc que quelqu'un d'autre pourra m'orienter 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 pouvant être pertinent à cet égard. 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 convient (si c'est plus facile), car je veux juste en apprendre le principe.

Merci beaucoup pour votre aide.

136
a_m0d

Si vous êtes doué pour la lecture de code, étudier SQLite vous apprendra beaucoup de choses sur la conception de bases de données. C'est petit, il est donc plus facile de faire le tour de la tête. Mais c'est aussi écrit professionnellement.

http://sqlite.org/

53
Robert Harvey

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 devez 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 celles-ci dans RAM supposons que vous avez une table, avec Pour certaines données, nous créerions un format de données pour convertir cette table en un fichier binaire, en nous accordant sur la définition d’un délimiteur de colonne et d’un délimiteur de ligne et en veillant à ce que ce type de délimiteur ne soit jamais utilisé dans vos données proprement dites. Pour sélectionner <*>, par exemple, pour séparer les colonnes, vous devez valider que les données que vous placez dans cette table ne contiennent pas 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 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, "123 ABC Street POBox 456", vous pouvez l’avoir comme <& RowHeader, 1> <& Col1, CHR, 4 > Adam <& Col2, num, 1,0> 1 <& Col3, Num, 2,1> 111 <& Col4, CHR, 24> 123 rue ABC Case postale 456 <& RowTrailer>

  • Pour rechercher rapidement des éléments, essayez d’utiliser le hachage et l’indexation pour pointer des données stockées et mises en cache sur la base de critères différents, en prenant comme 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 la ligne des éléments triés par ordre alphabétique. , etc

  • Comment accélérer l’insertion de données que je sais d’Oracle, c’est qu’ils insèrent des données dans un emplacement temporaire à la fois dans RAM et sur disque et effectuent des tâches ménagères sur une base périodique, le moteur de base de données est occupé à l’optimisation permanente de ses fonctions) essayez de conserver les données dans cet emplacement temporaire sans tri, ajoutez votre stockage d'origine, et plus tard, lorsque le système est libre, utilisez votre indexe et efface la zone temporaire une fois terminé

bonne chance, bon projet.

25
A.Rashad

Il existe des livres sur le sujet. Un bon point de départ serait Database Systems: The Complete Book de Garcia-Molina, Ullman et Widom

11
djna

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 n’ai pas utilisé le code source (même si j’en ai jeté un coup d’œil rapide). J'ai beaucoup appris en lisant le matériel technique et en examinant plus particulièrement les commandes internes qu'il génère. Il possède un interpréteur basé sur la pile et vous pouvez lire le code P qu’il génère en interne simplement en utilisant explique. Ainsi, vous pouvez voir comment différentes constructions sont traduites dans le moteur de bas niveau (cela est étonnamment simple - mais c'est aussi le secret de sa stabilité et de son efficacité).

10
Juergen

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

8
a_m0d

Je suggérerais de mettre l'accent sur www.sqlite.org

C'est récent, petit (code source 1MB), open source (pour que vous puissiez le découvrir vous-même) ...

Des livres ont été écrits sur sa mise en œuvre:

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

Il fonctionne sur divers systèmes d'exploitation pour les ordinateurs de bureau et les téléphones mobiles. Il est donc facile d'expérimenter et d'apprendre à le connaître sera utile maintenant et à l'avenir.

Il a même une communauté décente ici: https://stackoverflow.com/questions/tagged/sqlite

8
michael aubert

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 consulter les codes car il est open source.

7
nightingale2k1

Si MySQL vous intéresse, je suggérerais également ceci page wiki , qui contient des informations sur le fonctionnement de MySQL. Vous voudrez peut-être aussi jeter un oeil à Comprendre les aspects internes de MySQL.

Vous pouvez également envisager de rechercher une interface non SQL pour votre moteur de base de données. S'il vous plaît jeter un oeil à Apache CouchDB . C'est ce qu'on appelle un système de base de données orienté document.

Bonne chance!

3
user59634

Je ne suis pas sûr que cela convienne à vos besoins, mais j’avais implémenté une base de données orientée fichier avec un support pour 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 un disque et les entrées avec un modèle bien défini, puis manipulé les données à l’aide d’outils linux intégrés tels que awk et sed. pour améliorer l'efficacité, les données fréquemment consultées ont été mises en cache.

2
sud03r