Créer mon propre système de base de données [fermé]


65

Je dois apprendre le fonctionnement des bases de données pour pouvoir les utiliser plus efficacement. Ma façon d'apprendre consiste à le faire.

Je veux créer mon propre système de base de données. Je ne parle pas de la création d'une pseudo-base de données qui utiliserait une requête pour analyser des fichiers; ce serait simplement une interface de système de fichiers avec un langage de requête. Je parle de la structure réelle d'un moteur de base de données. Et comme ce que je pense n’est ni relationnel ni orienté document (c’est «orienté nœud», s’il existe), il faudrait que toute ressource soit aussi abstraite et de haut niveau que possible.

Alors, comment pourrais-je créer cela? Quelles ressources / tutoriels / livres puis-je lire pour comprendre?

La langue n'a pas d'importance. Idéalement, le code serait un pseudo-code pour illustrer le concept, non lié à un langage particulier, mais n'importe quoi ferait l'affaire. Je n'ai rien trouvé à ce sujet sur Google (étant donné que je suis tellement analphabète sur le sujet, je ne saisis peut-être pas la bonne recherche).

Si de telles ressources ne sont pas disponibles, alors quelque chose sur la façon de créer un client serait au moins un pas dans la bonne direction.


15
Pourquoi ne pas écrire un compilateur à la place? Ou mieux encore, votre propre système d'exploitation? Si vous êtes vraiment sérieux au sujet de l'écriture de votre propre base de données, il existe mille et une bases de données open source: étudiez leur code source, contribuez à quelques correctifs. Alors commencez à penser à construire le vôtre.
Yannis

4
Vous pouvez suivre des cours de base de données de niveau universitaire et supérieur. Il existe de nombreux cours open source en ligne. Vous pouvez également acheter quelques manuels et les étudier à votre guise. Cela vous donnera quelques idées et points de départ. La lecture de l'historique et des nouvelles de PostgreSQL vous aidera également (en termes d'imagination, même si cela ne vous donnera aucune idée de la façon dont ces fonctionnalités sont réellement implémentées)
vendredi

9
I studied open-source DBs, but their codebase is too huge: Si quelque chose comme redis ou flockdb est trop énorme pour que vous puissiez le lire, je ne vois pas comment vous allez gérer l'écriture ou votre propre base de données.
Yannis

10
@YannisRizos En toute justice, lire du code (imo) est beaucoup plus difficile que de l'écrire vous-même.
AlexWebr

12
@Xananax: n'écoutez pas les grenouilles ( crystal-reflections.com/stories/story_73.htm ). Faites ce que vous aimez et il n’est pas nécessaire d’avoir un objectif pour profiter du processus.

Réponses:


62

(c'est "orienté nœud", si cela existe même)

Commencer ici. Lorsque vous traitez avec une application complexe telle qu'une base de données (même une base de données simple est une application complexe), vous devez connaître l'historique du domaine et la terminologie appropriée et avoir au moins une idée très détaillée de l'architecture. Vous pouvez commencer par l'article de Wikipedia sur Database . J'ai passé quelques jours à lire tous les articles sur les concepts associés et les différents types de bases de données.

Et puisque ce que je pense n’est ni relationnel ni orienté document

Ensuite, vous choisissez Relational ou NoSQl. Si vous choisissez NoSQL, vous devez choisir un type de NoSQL. C'est extrêmement important, vous ne trouverez pas de documents architecturaux traitant de toutes les familles de bases de données. Peu importe lequel vous choisissez, choisissez-en un et respectez-le.

La langue n'a pas d'importance.

Oui (malheureusement), car après avoir sélectionné une famille de bases de données, vous devez commencer à explorer le code des bases de données open source de cette famille. Il existe quelques directives génériques sur ce qu'il faut rechercher:

  • Relativement petite base de code,
  • Documents architecturaux ou au moins un blog de développement,
  • La base de données que vous choisissez doit être proche de ce qui est considéré comme générique dans la famille. Il serait plus difficile d’apprendre si elle est hautement spécialisée.

Quelques exemples qui correspondent à:

Obtenez la source, compilez-la et jouez avec elle. Vous n'avez pas besoin de soumettre des correctifs ou quoi que ce soit d'intéressant, mais d'explorer le code et de faire de petites modifications ici et là pour voir ce qui se passe. C'est un processus incrémental, plus vous y jouez, plus il sera facile de comprendre ce que fait le code. Si le premier projet que vous avez choisi semble extrêmement difficile à comprendre, passez au suivant.

Une autre option intéressante serait de vous concentrer sur la construction d’un moteur pour MySQL, comme le suggère @NB dans une réponse précédente .

Si vous atteignez un point où vous êtes capable de faire quelque chose d’utile avec le code, impliquez-vous dans la communauté du projet, c’est le moyen le plus simple de trouver des ressources plus détaillées sur les concepts en question.

Et enfin, commencez à travailler sur votre base de données. Au début, vous pouvez simplement écrire un clone extrêmement réduit du code que vous avez exploré. Cela n'a pas besoin d'être original, bon nombre de projets géniaux ont été lancés sous forme de clones ou de fourchettes.

Quelles ressources / tutoriels / livres puis-je lire pour comprendre?

Il y a pas mal de livres:

Et quelques centaines d’autres, plus une myriade d’articles scientifiques que vous pourriez facilement retrouver via Google. Vous devez d'abord définir ce que vous voulez faire, puis rechercher un livre. S'impliquer dans une communauté d'auteurs de bases de données similaires vous aidera également à réduire la liste des livres et peut-être à obtenir des suggestions bien meilleures que celles mentionnées ci-dessus.

Bonne chance! J'attends un commentaire avec un lien vers votre référentiel lorsque vous avez terminé. Et si vous n’avez jamais terminé, veillez à laisser un commentaire me rappelant que je n’ai toujours pas terminé le compilateur que j’ai commencé à écrire en 2001.


5
C'est un bon post
Chani

2
C'est super! Encore plus venant de toi :) J'aimerais accepter presque chaque réponse, mais depuis que je dois en choisir une, ça doit être ça. I'm expecting a comment with a link to your repository when you're done: très certainement! Merci encore, à vous et à tous les autres, c'était vraiment édifiant.
Xananax

3
Et pour tous ceux qui viennent ici cherchent les mêmes réponses: je trouve que flockDB est le meilleur candidat à apprendre, le code est très petit, le code très lisible (bien que je ne parle pas scala) et facile à comprendre.
Xananax

@Yannis, Btw, parmi les livres que vous recommandez, ceux que vous avez lus?
Pacerier

@Xananax Sooo, comment ça se passe? Tout référentiel que nous pouvons regarder? :)
Radu Murzea

27

Tu devrais juste le faire et arrêter de trop penser. Profiter du processus d'apprentissage et de l'enthousiasme sont des cadeaux.

Demander aux autres si c'est une bonne idée n'est certainement pas une bonne stratégie . Si j'avais écouté toutes les grenouilles, je travaillerais toujours chez Ikea aujourd'hui pour pousser le caddie du parking au dépôt.

Vous n'êtes pas obligé de vous justifier comme Ayende l'a fait dans cet article intéressant . La question était:

Cependant, en tant que développeur pragmatique, je me demande quelle est la nouveauté de ce projet dans un marché saturé où il existe des alternatives assez matures telles que CouchDB, MongoDB, Tokyo, Redis et bien d’autres. Nombre de ces produits sont également multiplates-formes et fonctionnent à la vitesse du C avec une expérience éprouvée. Ils sont utilisés dans de très grands sites Web où leurs capacités de partage et leur tolérance aux pannes ont été poussées loin.

Si vous aimez le processus, ne vous inquiétez pas de l'objectif, vous avez déjà gagné.


4
+1, très réfléchi et réponse pédagogique :-) ... vraiment bonne réponse à quelqu'un qui veut faire quelque chose
Pankaj Upadhyay

Très beau effectivement. J'étais sur le point d'accepter cela. Je ne l'ai pas fait parce que je pensais que la réponse de yannis était plus précise et plus susceptible d'aider les gens qui avaient la même question. Mais c'était vraiment encourageant. Merci beaucoup.
Xananax

Yannis répond est meilleur que le mien et mérite votre choix

6

"(c'est" orienté noeud ", si cela existe même)". - C'est peut-être pour ça que tu ne trouves pas grand chose!

Plongez dans la version 0.1 et voyez où vous en êtes. Vous pouvez en apprendre davantage en essayant de produire ce que vous voulez, en demandant ce que vous "devriez" faire. Donnez-lui quelques jours, puis examinez où vous en êtes.

Il y a environ 18 ans, j'ai écrit un système de base de données (pour le plaisir, allez-y) avec des index btree et j'ai énormément appris.



4

Cela semble être un bon projet. Apparemment, votre objectif n'est pas de créer un logiciel de production, mais de vous familiariser avec les bases de données et le processus de création d'un système de base de données.

Je ne pense pas vraiment que vous deviez faire beaucoup de recherche. Il semble que l'objectif soit de faire l'expérience de la création d'un système de base de données basé sur des noeuds.

Voici comment je pourrais commencer:

  1. Choisissez votre langue préférée ou une langue que vous souhaitez améliorer.
  2. Créez l'objet nœud (ou tout ce qui est le plus proche dans votre langue). Découvrez comment les lier.
  3. Faites une courte liste d'instructions SQL que vous allez d'abord implémenter.
  4. Décidez comment enregistrer les données. Une solution évidente consiste à sérialiser tous les nœuds, à les charger au démarrage du programme et à les enregistrer à la fin du programme.

Une fois que vous maîtriserez les bases, vous aurez une meilleure idée de ce qui est difficile ou problématique. Vous pourrez ensuite faire des recherches à ce sujet, trouver des améliorations et les intégrer.


1
Je suis les étapes que vous avez suggérées. 1,2,3 ne sont pas un problème. Cependant, je suis perplexe par # 4. Dans le cas de grandes quantités de données, comment pourrais-je charger en mémoire uniquement les parties pertinentes? J'ai pensé à tout stocker sous forme de données binaires et de conserver un autre fichier d'index, mais que se passe-t-il si l'utilisateur n'interroge pas par index? Je devrais tout de même parcourir tout le fichier ... Je suppose qu'il est temps de poser une autre question
Xananax,

Pourquoi ne pas simplement tout stocker en mémoire? Si vous dédiez 1 Go, cela contiendrait beaucoup de données. Vous pouvez également stocker chaque nœud de données binaires sur le disque, ce qui vous donnerait 1 Go pour le texte. C'est beaucoup de texte. Quoi qu'il en soit, je pense que la gestion d'une base de données de plus de 1 Go n'est pas au cœur de l'exercice.
B Seven

En outre, vous pouvez créer de nombreuses méthodes pour travailler efficacement avec 1 Go de mémoire. Vous pouvez améliorer cette partie du système ultérieurement. Une solution consiste à charger toutes les informations sur les nœuds en mémoire, mais à stocker les données de chaque nœud sur le disque. De cette façon, vous pouvez traverser efficacement les nœuds et accéder au disque uniquement pour récupérer les données dont vous avez réellement besoin.
B Seven

3

Écrire votre propre base de données «afin de comprendre comment tout cela fonctionne» est la seule bonne raison de le faire (car les bases de données sont difficiles à obtenir et difficiles à prouver). Tu es fou, mais dans le bon sens!

Afin de voir comment cela se passe, je suggère de regarder SQLite. La source SQLite ne contient qu'environ 1,3 Mo de compression, et il s’agit d’une base de données transactionnelle entièrement conforme à ACID. C'est aussi du domaine public et l'auteur principal est un gars sympa qui, j'en suis sûr, se fera un plaisir de répondre à vos questions. (Je pense que la solution la plus simple consiste à valider réellement des informations sur un disque; il est étonnamment difficile de persuader les systèmes d'exploitation et le matériel informatique de cesser de mentir et d'écrire réellement la transaction MAINTENANT, et je suis si heureux de ne jamais avoir à écrire une base de données.)


1
La base de code SQLite approche 0,2 * 10 ^ 6 loc (5 Mo décompressé), ce n'est pas si petit.
Yannis

1
@Yannis: comparez avec MySQL ou PostgreSQL ou avec l'un des autres systèmes de base de données serveur…
Donal Fellows


3

J'ai besoin d'apprendre comment fonctionnent les bases de données

Apprendre l'algèbre relationnelle.

Trouvez un petit moteur de base de données et apprenez la source.

afin de les utiliser plus efficacement

Nan. Vous devez apprendre à utiliser efficacement une base de données. Vous pourriez être un meilleur conducteur si vous comprenez le fonctionnement de votre voiture, mais vous serez un meilleur conducteur si vous vous concentrez vraiment sur la conduite.

Suivez les itinéraires traditionnels: suivez un cours, lisez un livre, passez en revue vos pairs, posez des questions, utilisez l’index luke .


5
Learn relational algebra.En supposant que op s'intéresse aux bases de données relationnelles, bien sûr ...
11:06
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.