2009-06-27 19 views
120

Estoy interesado en aprender cómo funciona un motor de base de datos (es decir, las partes internas de él). Conozco la mayoría de las estructuras de datos básicas que se enseñan en CS (árboles, tablas hash, listas, etc.), así como una buena comprensión de la teoría del compilador (y he implementado un intérprete muy simple) pero no entiendo cómo hacerlo. acerca de escribir un motor de base de datos. He buscado tutoriales sobre el tema y no pude encontrar ninguno, así que espero que alguien más pueda orientarme en la dirección correcta. Básicamente, me gustaría información sobre lo siguiente: los datosCómo escribir un motor de base de datos simple

  • cómo se almacenan los datos internamente (es decir, cómo se representan tablas, etc.)
  • ¿Cómo se encuentra el motor que necesita (por ejemplo, ejecutar una consulta SELECT)
  • ¿Cómo se inserta datos en una forma que es rápido y eficiente

y cualquier otro tema que pueda ser relevante a este. No tiene que ser una base de datos en disco, incluso una base de datos en memoria está bien (si es más fácil) porque solo quiero aprender los principios detrás de ella.

Muchas gracias por su ayuda.

Respuesta

44

Si usted es bueno en la lectura de códigos, el estudio de SQLite le enseñará todo un bote lleno sobre la base de datos diseño. Es pequeño, así que es más fácil abarcar tu cabeza. Pero también está escrito profesionalmente.

http://sqlite.org/

+2

LOC de la descarga SQLite shell.c => 3135, sqlite3.c => 136332, sqlite3ext.h => 447, sqlite3.h => 7097, Total => 147.011 –

+1

Que es probablemente tan pequeño como usted puede hacer un motor de base de datos completamente funcional usando un lenguaje de llaves. SQLite también está disponible en C#. –

+0

@RobertHarvey ¿Puedes publicar un enlace del código fuente de C#? –

8

Yo sugeriría centrándose en www.sqlite.org

Es reciente, pequeña (código fuente de 1 MB), de código abierto (para que pueda averiguarlo por sí mismo) ...

libros se han escrito sobre cómo se implementa:

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

se ejecuta en un variedad de sistemas operativos para computadoras de escritorio y teléfonos móviles, por lo que experimentar es fácil y aprender sobre esto será útil ahora y en el futuro.

Incluso tiene una comunidad decente aquí: https://stackoverflow.com/questions/tagged/sqlite

+1

El tamaño de bytes para 3.10 es ahora casi de 7.0 mb de código fuente. Solo unos pocos privilegiados podían digerir todo eso de una vez. Sin embargo, [este] (http://www.sqlite.org/quickstart.html) también es un buen lugar para comenzar. –

+1

De hecho. Habiendo pasado un tiempo dentro del código fuente de SQLite para encontrar un error en SQLCipher, es una pesadilla absoluta. La vida era más simple hace 6 años :-) –

6

puede ser que usted puede aprender de HSQLDB. Creo que ofrecen una base de datos pequeña y simple para aprender. puedes mirar los códigos ya que es de código abierto.

23

La respuesta a esta pregunta es enorme. esperar una tesis doctoral que tiene que respondió el 100%;) pero podemos pensar en los problemas uno por uno:

  • Cómo almacenar los datos internamente: usted debe tener un archivo de datos que contiene los objetos de base de datos y un mecanismo de caché para cargar los datos en foco y algunos datos a su alrededor en RAM supongamos que tiene una tabla, con algunos datos, creamos un formato de datos para convertir esta tabla en un archivo binario, acordando la definición de una columna delimitador y un delimitador de fila y asegúrese de que dicho patrón de delimitador nunca se utilice en sus datos. es decirsi ha seleccionado < *> por ejemplo para separar columnas, debe validar los datos que está colocando en esta tabla para no contener este patrón. también podría usar un encabezado de fila y un encabezado de columna especificando el tamaño de la fila y algún número de indexación interno para acelerar su búsqueda, y al comienzo de cada columna tener la longitud de esta columna como "Adam", 1, 11.1 "ABC 123 de la calle POBox 456" que puede tener como < & RowHeader, 1> < & Col1, CHR, 4> Adam < & Col2, num, 1,0> 1 < & Col3, Num, 2,1 > 111 < & Col4, CHR, 24> 123 ABC calle POBox 456 < & RowTrailer>

  • ¿Cómo encontrar artículos q intente usar hashing e indexación para apuntar a los datos almacenados y almacenados en caché según el mismo criterio tomando el mismo ejemplo anterior, puede ordenar el valor de la primera columna y almacenarla en un objeto separado apuntando a la fila id de elementos ordenados alfabéticamente, y así sucesivamente

  • Sé de Oracle que inserta datos en un lugar temporal tanto en la RAM como en el disco y hace el mantenimiento de forma periódica, el motor de la base de datos está ocupado todo el tiempo optimizando su estructura pero al mismo tiempo no queremos perder datos en caso de falla de energía de algo así. así que intenta mantener los datos en este lugar temporal sin clasificación, anexar su almacenamiento original, y más adelante, cuando el sistema es complejo libre de sus índices y despejar el área de temperatura cuando se hace

buena suerte, gran proyecto.

1

No estoy seguro de si se ajustaría a sus requisitos pero había implementado una base de datos orientada a archivos simple con soporte para simple (SELECT, INSERT , UPDATE) usando perl.
Lo que hice fue almacenar cada tabla como un archivo en el disco y las entradas con un patrón bien definido y manipular los datos utilizando en las herramientas de Linux incorporado como awk y sed. para mejorar la eficiencia, los datos a los que se accede frecuentemente se almacenan en caché.

3

Si MySQL le interesa, también le sugiero este wiki page, que tiene cierta información sobre cómo funciona MySQL. Además, es posible que desee echar un vistazo a Understanding MySQL Internals.

También puede considerar buscar en una interfaz que no sea SQL para su motor de base de datos. Por favor, eche un vistazo al Apache CouchDB. Es lo que llamarías, un sistema de base de datos orientado a documentos.

¡Buena suerte!

+0

página wiki abajo ... 404 – Pacerier

+0

Y si desea ver otra db: http://www.sqlserverinternals.com/ sus nbooks en las partes internas del servidor SQl son las mejores. – HLGEM

7

SQLite fue mencionado anteriormente, pero quiero agregar algo.

Personalmente aprendí mucho estudiando SQlite. Lo interesante es que no fui al código fuente (aunque solo tuve una breve mirada). Aprendí mucho leyendo el material técnico y especialmente mirando los comandos internos que genera. Tiene un intérprete propio basado en la pila y se puede leer el código P que genera internamente con el uso de Explain. Por lo tanto, puede ver cómo se traducen varias construcciones al motor de bajo nivel (que es sorprendentemente simple, pero ese también es el secreto de su estabilidad y eficiencia).

6

Vale, he encontrado un sitio que tiene alguna información sobre SQL y la ejecución - que es un poco difícil de acceder a la página que enumera todos los tutoriales, así que les voy a enlazar uno por uno:

Cuestiones relacionadas