sql - vista - Cómo escribir un motor de base de datos simple
ejemplos de vistas en base de datos (9)
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 obtener información sobre lo siguiente:
- Cómo se almacenan los datos internamente (es decir, cómo se representan las tablas, etc.)
- Cómo el motor encuentra los datos que necesita (por ejemplo, ejecutar una consulta SELECT)
- Cómo se insertan los datos de una manera rápida y eficiente
Y cualquier otro tema que pueda ser relevante para esto. 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.
De acuerdo, encontré un sitio que contiene información sobre SQL y su implementación: es un poco difícil de vincular a la página que enumera todos los tutoriales, por lo que los vincularé uno por uno:
Hay libros sobre el tema. Un buen lugar para comenzar sería Database Systems: The Complete Book de Garcia-Molina, Ullman y Widom.
La respuesta a esta pregunta es enorme. esperar una tesis doctoral para que se responda al 100%;) pero podemos pensar en los problemas uno por uno:
Cómo almacenar los datos internamente: debe tener un archivo de datos que contenga los objetos de la base de datos y un mecanismo de almacenamiento en caché para cargar los datos en foco y algunos datos a su alrededor. Suponga que tiene una tabla; con algunos datos, crearíamos un formato de datos. para convertir esta tabla en un archivo binario, acordando la definición de un delimitador de columna y un delimitador de fila y asegúrese de que dicho patrón de delimitador nunca se utilice en sus datos. es decir, si 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 para tener la longitud de esta columna como "Adam", 1, 11.1, "123 ABC Street POBox 456" puede tenerlo como <& RowHeader, 1> <y Col1, CHR, 4> Adam <y Col2, num, 1,0> 1 <y Col3, Num, 2,1> 111 <y Col4, CHR, 24> 123 ABC Street POBox 456 <& RowTrailer>
Cómo encontrar elementos rápidamente intente utilizar hashing e indexación para apuntar a los datos almacenados y almacenados en caché según diferentes criterios 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í
Cómo acelerar la inserción de datos que sé de Oracle es que insertan datos en un lugar temporal tanto en la RAM como en el disco y hacen el mantenimiento de manera periódica, el motor de la base de datos está ocupado todo el tiempo optimizando su estructura, pero al mismo tiempo no lo hacemos quiere perder datos en caso de falla de energía de algo así. así que trate de mantener los datos en este lugar temporal sin ordenarlos, agregue su almacenamiento original, y más adelante cuando el sistema sea gratuito, utilice sus índices y limpie el área de temperatura cuando termine
buena suerte, gran proyecto.
Se mencionó SQLite 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).
Si MySQL le interesa, también sugeriría esta página wiki , 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 podría considerar buscar una interfaz que no sea SQL para su motor de base de datos. Por favor, eche un vistazo a Apache CouchDB . Es lo que llamarías, un sistema de base de datos orientado a documentos.
¡Buena suerte!
Si eres bueno leyendo código, estudiar SQLite te enseñará toda una carga sobre el diseño de la base de datos. Es pequeño, así que es más fácil abarcar tu cabeza. Pero también está escrito profesionalmente.
Sugeriría centrarse en www.sqlite.org
Es reciente, pequeño (código fuente 1MB), de código abierto (para que pueda descifrarlo) ...
Se han escrito libros sobre cómo se implementa:
http://www.sqlite.org/books.html
Se ejecuta en una variedad de sistemas operativos para computadoras de escritorio y teléfonos móviles, por lo que la experimentación es fácil y conocerla será útil ahora y en el futuro.
Incluso tiene una comunidad decente aquí: https://.com/questions/tagged/sqlite
puede ser que pueda 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.
No estoy seguro de si se ajustaría a sus requisitos, pero había implementado una base de datos simple orientada a archivos 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é.