Comment écrire un simple moteur de base de données
Je suis intéressé à apprendre comment un moteur de base de données fonctionne (c'est à dire à l'intérieur de celui-ci). Je sais que la plupart des structures de données de base enseignées dans les CS (arbres, tables de hachage, des listes, etc.) ainsi qu'une assez bonne compréhension de la théorie des compilateurs (et ont mis en œuvre très simple interprète), mais je ne comprends pas comment faire pour aller sur l'écriture d'un moteur de base de données. J'ai cherché des tutoriels sur le sujet et je ne pouvais pas trouver, donc je suis en espérant que quelqu'un d'autre peut me pointer dans la bonne direction. En gros, je voudrais des informations sur les éléments suivants:
- Comment les données sont stockées en interne (c'est à dire la manière dont 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)
- La façon dont les données sont insérées dans une manière rapide et efficace
Et tout autres sujets qui peuvent être pertinents pour cela. Il n'a pas à être une base de données de disque - même une base de données en mémoire est très bien (si c'est plus facile) parce que je veux apprendre les principes derrière elle.
Merci beaucoup pour votre aide.
OriginalL'auteur a_m0d | 2009-06-27
Vous devez vous connecter pour publier un commentaire.
Si vous êtes bon à la lecture du code, l'étude de SQLite, vous enseignera toute une cargaison au sujet de conception de base de données. Il est petit, il est donc plus facile à enrouler autour de votre tête. Mais c'est aussi par des professionnels de l'écrit.
http://sqlite.org/
Ce qui est probablement la plus petite que vous pouvez faire entièrement fonctionnel moteur de base de données à l'aide d'une accolade langue. SQLite est également disponible en C#.
Pouvez-vous s'il vous plaît poster un lien vers le code source en C#?
Najjar github.com/CsharpDatabase/csharp-sqlite
Je vous 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é et exécuté sur moderne GCC (je l'ai testé sur MacOS 10.13 et Debian 8)
OriginalL'auteur Robert Harvey
La réponse à cette question est d'une importance énorme. s'attendre à une thèse de DOCTORAT à avoir répondu à 100% 😉
mais nous pouvons penser à de la les 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 dans l'accent et certaines données autour d'elle dans la RAM
supposons que vous disposez d'une table, avec quelques données, il faudrait créer un format de données à convertir ce tableau dans un fichier binaire, par un accord sur la définition d'un délimiteur de colonne et un séparateur de lignes et assurez-vous un tel modèle d'délimiteur n'est jamais utilisé dans vos données elle-même. c'est à dire si vous avez sélectionné <*> par exemple pour séparer les colonnes, vous devez valider les données que vous placez dans ce tableau ne contiennent pas de ce modèle. vous pouvez également utiliser un en-tête de ligne et d'une colonne d'en-tête en spécifiant la taille de la ligne et à l'interne nombre d'indexation pour accélérer votre recherche, et au début de chaque colonne pour que la longueur de cette colonne
comme "Adam", 1, 11.1, "123 ABC de la Rue POBox 456"
vous pouvez l'avoir comme
<&RowHeader, 1><&Col1,CHR, 4>Adam<&Col2, num,1,0>1<&Col3, Num,2,1>111<&Col 4, CHR, 24>123 ABC de la Rue POBox 456<&RowTrailer>
Comment trouver rapidement les articles
essayez d'utiliser des fonctions de hachage et indexation de point de données stockées et mises en cache en fonction de différents critères
prenant le même exemple ci-dessus, vous pouvez trier la valeur de la première colonne et de la stocker dans un objet séparé de pointage à l'id de ligne d'articles triée par ordre alphabétique, et ainsi de suite
Comment insérer des données de vitesse
Je sais, d'Oracle, c'est qu'ils insérer des données dans un lieu temporaire à la fois dans la mémoire RAM et d'un disque et faire le ménage sur une base périodique, le moteur de base de données est occupé tout le temps de l'optimisation de sa structure, mais dans le même temps, nous ne voulons pas perdre les données en cas de panne de courant de quelque chose comme ça.
donc, essayez de garder les données dans ce lieu temporaire avec l'absence de tri, ajouter votre stockage d'origine, et plus tard, lorsque le système est libre resort votre index et claire le temp d'une zone lorsque le fait
bonne chance, grand projet.
OriginalL'auteur A.Rashad
Il y a des livres sur le sujet, un bon endroit pour commencer serait Systèmes De Base De Données: Le Livre Complet par Garcia-Molina, Ullman, et Widom
OriginalL'auteur djna
SQLite qui a été dit avant, mais je tiens à ajouter quelque chose.
Personnellement, j'ai beaucoup appris par l'étude de SQlite. La chose intéressante est que je n'ai pas aller à la source code (même si j'ai juste eu un bref coup d'œil). J'ai beaucoup appris en lisant la documentation technique et spécialement en regardant les commandes internes qu'il génère. Il dispose d'une pile en fonction de l'interprète à l'intérieur et vous pouvez lire le P-Code qu'il génère en interne en utilisant simplement les expliquer. Donc vous pouvez voir comment les différentes constructions sont convertis au faible niveau moteur (qui est étonnamment simple, mais c'est aussi le secret de sa stabilité et de l'efficacité).
OriginalL'auteur Juergen
Bon, j'ai trouvé un site qui contient des informations sur SQL et mise en œuvre - c'est un peu dur de faire un lien vers la page qui répertorie tous les tutoriels, je vais donc le lien un par un:
OriginalL'auteur a_m0d
Je dirais en se concentrant sur http://www.sqlite.org
C'est récent, de petite taille (le code source de 1 mo), l'open source (de sorte que vous pouvez le comprendre par vous-même)...
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 ordinateurs de bureau et les téléphones mobiles, de sorte expérimentation est facile et l'apprentissage à ce sujet sera utile dès maintenant et dans l'avenir.
Elle même a une bonne communauté ici: https://stackoverflow.com/questions/tagged/sqlite
En effet. Ayant récemment passé un certain temps à l'intérieur du code source de SQLite afin de trouver un bug dans SQLCipher, c'est un cauchemar absolu. La vie était plus simple il y a 6 ans 🙂
Juste une petite question que j'ai raté la partie, je suppose que ce serait beaucoup plus relaxant (et peut-être utile) pour démarrer à partir de la première version? En fait je dois le faire pour tous les graves lecture de code de grands projets?
OriginalL'auteur michael aubert
peut-être vous pouvez apprendre à partir de HSQLDB. Je pense qu'ils offre aux petites et simple de la base de données pour l'apprentissage. vous pouvez regarder les codes car il est open source.
OriginalL'auteur nightingale2k1
Si MySQL vous intéresse, je vous suggère aussi cette page wiki, qui a obtenu quelques informations sur la façon MySQL fonctionne. Aussi, vous voudrez peut-être jeter un oeil à La Compréhension De MySQL Internes.
Vous pouvez également envisager de regarder un non-interface SQL pour votre moteur de Base de données. Veuillez prendre un coup d'oeil à Apache CouchDB. Ses ce que vous appelleriez un document orienté système de base de données.
Bonne Chance!
Et si vous voulez regarder un autre db: sqlserverinternals.com sa nbooks sur SQl server internes sont le haut-nitch.
OriginalL'auteur
Je ne suis pas sûr qu'il corresponde à vos exigences, mais j'avais mis en place un simple fichier de base de données orientée avec prise en charge du simple (
SELECT, INSERT , UPDATE
) à l'aide de perl.Ce que j'ai fait j'ai stocké chaque table dans un fichier sur le disque et les entrées avec un motif défini et manipuler les données à l'aide dans la construction de linux, des outils comme awk et sed. pour l'amélioration de l'efficacité, les données les plus fréquemment utilisées ont été mis en cache.
OriginalL'auteur sud03r