Crear mi propio sistema de base de datos [cerrado]

65

Necesito aprender cómo funcionan las bases de datos para usarlas de manera más eficiente, y mi forma de aprender es hacerlo.

Quiero crear mi propio sistema de base de datos. No me estoy refiriendo a crear una pseudo-base de datos que usaría la consulta para analizar archivos; esto sería simplemente una interfaz de sistema de archivos con un lenguaje de consulta. Estoy hablando de la estructura real de un motor de base de datos. Y dado que lo que tengo en mente no es ni relacional ni orientado a documentos (está "orientado a nodos", si es que existe), necesitaría cualquier recurso para ser lo más abstracto y de alto nivel posible.

Entonces, ¿cómo haría para crear eso? ¿Qué recursos / tutoriales / libros puedo leer para entender?

El idioma no importa en lo más mínimo. Idealmente, el código sería un seudocódigo para ilustrar el concepto, no vinculado a un lenguaje en particular, pero cualquier cosa serviría. No pude encontrar nada sobre el tema en google (dado que soy muy analfabeto en el tema, tal vez simplemente no estoy ingresando la búsqueda correcta).

Si dichos recursos no están disponibles, supongo que algo sobre cómo crear un cliente sería al menos un paso en la dirección correcta.

Xananax
fuente
15
¿Por qué no escribir un compilador en su lugar? O incluso mejor, ¿tu propio sistema operativo? Si realmente quiere escribir su propia base de datos, existen mil y una bases de datos de código abierto: estudie su código fuente y contribuya con algunos parches. Entonces comienza a pensar en construir el tuyo.
Yannis
44
Puede tomar algunos cursos de base de datos de nivel universitario y de posgrado. Hay muchos cursos de código abierto en línea. También puede comprar algunos libros de texto y estudiarlos en el tiempo libre. Esto le dará algunas ideas y puntos de partida. La lectura de la historia y las noticias sobre PostgreSQL también ayudará (en términos de imaginación, aunque no le dará ninguna idea de cómo se implementan realmente esas características)
rwong
99
I studied open-source DBs, but their codebase is too huge: Si algo como redis o flockdb es demasiado grande para que lo leas, no veo cómo harás frente a la escritura o la propia base de datos.
Yannis
10
@YannisRizos Para ser justos, leer el código (imo) es mucho más difícil que escribirlo usted mismo.
AlexWebr
12
@ Xananax: no escuches a las ranas ( crystal-reflections.com/stories/story_73.htm ). Haz lo que disfrutes y no es necesario tener un objetivo para disfrutar el proceso.

Respuestas:

62

(está "orientado a nodos", si es que existe)

Empieza aqui. Cuando se trata de una aplicación compleja como una base de datos (incluso una base de datos simple es una aplicación compleja), debe estar familiarizado con el historial del dominio y la terminología adecuada y tener al menos una idea de alto nivel de la arquitectura. Podrías comenzar desde el artículo de Wikipedia sobre la base de datos . Pasé unos días leyendo todos los artículos sobre los conceptos relacionados y los diferentes tipos de bases de datos.

Y dado que lo que tengo en mente no es ni relacional ni orientado a documentos

Luego, elige Relacional o NoSQl. Si elige NoSQL, debe elegir un tipo de NoSQL. Eso es extremadamente importante, no encontrará ningún documento arquitectónico que discuta todas las diferentes familias de bases de datos. Realmente no importa cuál elijas, solo elige uno y quédate con él.

El idioma no importa en lo más mínimo.

Sí, lo hace (desafortunadamente), porque después de elegir una familia de bases de datos, debe comenzar a explorar el código de las bases de datos de código abierto de esa familia. Hay algunas pautas genéricas sobre qué buscar:

  • Base de código relativamente pequeña,
  • Documentos arquitectónicos o al menos un blog de desarrollo,
  • La base de datos que elija debe estar cerca de lo que se considera genérico en la familia, sería más difícil aprender si es altamente especializado.

Algunos ejemplos que encajan:

Obtenga la fuente, compílela y juegue con ella. No tiene que enviar parches ni nada que le guste, simplemente explore el código y realice pequeñas modificaciones aquí y allá para ver qué sucede. Es un proceso incremental, cuanto más juegues con él, más fácil será comprender lo que hace el código. Si el primer proyecto que eligió parece extremadamente difícil de entender, simplemente pase al siguiente.

Otra gran opción sería concentrarse en construir un motor para MySQL, como sugiere @NB en una respuesta anterior .

Si llega a un punto en el que puede hacer algo útil con la base de código, participe en la comunidad del proyecto, esa es la forma más fácil de encontrar recursos más detallados sobre los conceptos involucrados.

Y luego, finalmente, comience a trabajar en su base de datos. Al principio, podría escribir un clon extremadamente reducido del código que ha estado explorando. No tiene que ser original, bastantes grandes proyectos comenzaron como clones o tenedores.

¿Qué recursos / tutoriales / libros puedo leer para entender?

Hay bastantes libros:

Y algunos cientos más, además de una miríada de trabajos académicos que puede rastrear fácilmente a través de Google. Primero debe definir lo que desea hacer y luego buscar un libro. Involucrarse con una comunidad de autores de bases de datos también lo ayudará a reducir la lista de libros y tal vez a obtener sugerencias mucho mejores que las anteriores.

¡Buena suerte! Espero un comentario con un enlace a su repositorio cuando haya terminado. Y si nunca has terminado, asegúrate de dejar un comentario recordándome que todavía no he terminado el compilador que comencé a escribir en 2001.

Yannis
fuente
55
Esta es una buena publicación
Chani
2
Esto es super! Aún más de ti :) Me gustaría aceptar casi cada una de las respuestas, pero dado que tengo que elegir una, esta tiene que ser. I'm expecting a comment with a link to your repository when you're done: ¡definitivamente! Gracias de nuevo, a usted y a todos los demás, esto fue realmente inspirador.
Xananax
3
Y para cualquiera que venga en busca de las mismas respuestas: creo que flockDB es el mejor candidato para aprender, la base de código es realmente pequeña, el código es muy legible (aunque no hablo scala) y fácil de entender.
Xananax
@ Yannis, por cierto, ¿cuáles de los libros que recomiendas son los que has leído?
Pacerier
@ Xananax Sooo ¿cómo te va? ¿Algún repositorio que podamos ver? :)
Radu Murzea
27

Deberías hacerlo y dejar de pensar demasiado. Disfrutar el proceso de aprendizaje y el entusiasmo son regalos.

Preguntar a otros si es una buena idea ciertamente no es una buena estrategia . Si hubiera escuchado a todas las ranas, todavía estaría trabajando en Ikea hoy empujando el carrito de compras desde el estacionamiento hasta el depósito.

No tienes que justificarte como lo hizo Ayende en esa interesante publicación . La pregunta fue:

Sin embargo, como desarrollador pragmático, me pregunto qué novedades ofrece este proyecto en un mercado saturado donde tiene alternativas bastante maduras como CouchDB, MongoDB, Tokio, Redis y muchas más. Muchos de estos productos también son multiplataforma y se ejecutan a velocidad C con un historial probado, y se utilizan en sitios web muy grandes donde sus capacidades de fragmentación y tolerancia a fallas han sido llevadas lejos.

Si te agrada el proceso, no te preocupes por el objetivo, ya has ganado.


fuente
44
+1, muy reflexivo y con una respuesta didáctica :-) ... muy buena respuesta para alguien que quiere hacer algo
Pankaj Upadhyay
Muy bueno de verdad. Estaba a punto de aceptar esto. No lo hice porque pensé que la respuesta de Yannis era más pertinente, y más probable que ayudara a las personas que tenían la misma pregunta. Pero esto definitivamente fue alentador. Muchas gracias.
Xananax
La respuesta de Yannis es mejor que la mía y merece su elección
6

"(está" orientado a nodos ", si eso incluso existe)". - ¡Esta puede ser la razón por la que no encuentras mucho!

Sumérjase con la versión 0.1 y vea dónde llega. Puede aprender más al tratar de producir lo que quiere y al preguntar qué "debería" hacer. Déle unos días y luego revise dónde lo tiene.

Hace unos 18 años escribí un sistema de base de datos básico (por diversión, imagínense) con índices btree y aprendí muchísimo.

Jaydee
fuente
4

MySQL tiene una estructura de motor de almacenamiento conectable, puede ser una idea comprobar cómo se crean los motores para que funcionen para MySQL.

Mjh
fuente
4

Suena como un gran proyecto. Aparentemente, su objetivo no es crear un software de producción, sino aprender sobre bases de datos y el proceso de creación de un sistema de base de datos.

Realmente no creo que necesites investigar mucho. Parece que el propósito es obtener la experiencia de lo que implica crear un sistema de base de datos basado en nodos.

Así es como comenzaría:

  1. Elija su idioma favorito o un idioma que desee mejorar.
  2. Cree el objeto de nodo (o lo que sea más cercano en su idioma). Descubre cómo vincularlos.
  3. Haga una breve lista de sentencias SQL que implementará primero.
  4. Decide cómo guardar los datos. Una solución obvia es serializar todos los nodos, cargarlos cuando se inicia el programa y guardarlos cuando finalice el programa.

Después de que funcione lo básico, tendrá mucha más información sobre lo que es difícil o problemático. Luego puede investigar un poco al respecto, encontrar algunas mejoras e integrarlas.

B Seven
fuente
1
Estoy siguiendo los pasos que sugirió. 1,2,3 no son problema. Sin embargo, estoy perplejo por el n. ° 4. En el caso de grandes cantidades de datos, ¿cómo cargaría en la memoria solo las partes relevantes? Pensé en almacenar todo como datos binarios y mantener otro archivo de índice, pero ¿qué pasa si el usuario no consulta por índice? Todavía tendría que recorrer todo el archivo ... Creo que es hora de otra pregunta
Xananax
¿Por qué no simplemente almacenar todo en la memoria? Si dedica 1 GB, eso contendría muchos datos. Alternativamente, almacene cada nodo de datos binarios en el disco, y luego tendría 1 GB para el texto. Eso es mucho texto. De todos modos, creo que manejar una base de datos de más de 1 GB no es fundamental para el ejercicio.
B Seven
Además, puede crear muchos métodos para trabajar eficientemente dentro de 1 GB de memoria. Puede mejorar esa parte del sistema más adelante. Una solución es cargar toda la información del nodo en la memoria, pero almacenar los datos de cada nodo en el disco. De esa manera, puede atravesar eficientemente los nodos y solo acceder al disco para recuperar los datos que realmente necesita.
B Seven
3

Escribir su propia base de datos “para entender cómo funciona todo” es la única buena razón para hacerlo (ya que las bases de datos son muy difíciles de corregir y difíciles de probar). Estás loco, pero en el buen sentido!

Para ver cómo se hace, sugiero mirar SQLite. La fuente SQLite solo tiene una compresión de aproximadamente 1.3 MB, y es una base de datos transaccional totalmente compatible con ACID. También es de dominio público y el autor principal es un buen tipo que estoy seguro de que estará encantado de responder a sus preguntas. (Creo que las partes más complicadas vienen en cómo realmente enviar información al disco; persuadir a los sistemas operativos y al hardware para que dejen de mentir y realmente escriban la transacción AHORA es sorprendentemente difícil y por eso estoy tan contento de nunca tener que escribir una base de datos).

Compañeros de Donal
fuente
1
La base de código SQLite se aproxima a 0,2 * 10 ^ 6 loc (5 MB descomprimido), no es que la pequeña.
Yannis
1
@ Yannis: compárelo con MySQL o PostgreSQL o con cualquiera de los otros sistemas de base de datos del servidor ...
Donal Fellows
3

Necesito aprender cómo funcionan las bases de datos.

Aprende álgebra relacional.

Encuentre un pequeño motor de base de datos, aprenda la fuente.

para usarlos de manera más eficiente

No. Necesita aprender a usar eficientemente una base de datos. Puede ser un mejor conductor si comprende cómo funciona su automóvil, pero será un mejor conductor si realmente se concentra en conducir.

Tome las rutas tradicionales: tome un curso, lea un libro, una revisión por pares, haga preguntas, use el índice luke .

Incógnito
fuente
55
Learn relational algebra.Suponiendo op está interesado en las bases de datos relacionales, por supuesto ...
Yannis