2009-06-01 23 views
5

Estoy pensando en el diseño de la implementación de & mi propia¿Diseñando SQL alternativo?

  1. un lenguaje algebraico puramente relacional SQL equivalente (DDL + DML) que es ..., y
  2. tiene un elegante Lisp-/Esquema similar sintaxis

Suponiendo un RDBMS como MySQL, ¿dónde necesitaría exactamente comenzar mi trabajo de diseño de idiomas? ¿Encima de la capa del motor de almacenamiento como InnoDB?

No sé qué funciones de RDBMS generalmente se encuentran encima de un Motor de almacenamiento? Mi comprensión intuitiva actual es que la mayor parte del trabajo necesario para crear un RDBMS (como MySQL) ya se habría hecho dentro del motor de almacenamiento (específicamente, en InnoDB), y todo lo que tendría que hacer es crear un lenguaje de envoltura alrededor eso. Pero también sé que si eso fuera realmente cierto, ¿por qué MySQL existiría en primer lugar?

+0

El ecosistema de MySQL y Storage Engine es el siguiente: Storage Engine es la capa que ubica inmediatamente encima de su sistema de archivos de almacenamiento nativo. Las capas superiores están compuestas por el analizador de consultas SQL, optimizador, caché de consultas, etc. La arquitectura del motor de almacenamiento conectable de MySQL se ha diseñado de tal manera que Storage Engine es una capa de separación entre los dispositivos de almacenamiento nativos y su capas superiores, como un cliente MySQL. –

Respuesta

5

Sospecho que la mejor manera de evitar esto sería crear un traductor entre su idioma y SQL, principalmente porque no podrá obtener más funcionalidades de un rdbms que las proporcionadas a través de su dialecto SQL.

La existencia de MySQL no tiene nada que ver con la dificultad del trabajo realizado por los motores de almacenamiento, storage engines in MySQL realmente hace la mayor parte del trabajo, dejando que MySQL analice y optimice SQL y recupere los datos del motor, respetando la semántica correspondiente del motor.

La mayoría de los rdbms no exponen motores de almacenamiento a usuarios/administradores por lo que MySQL es algo único, lo que hace más razonable crear un traductor, de esa manera usted podrá (al cambiar algunas reglas de sintaxis) usar más de un rdbms a través de su aplicación.

Además, probablemente no podrá generar un lenguaje relacional puro sobre la tecnología de base de datos existente, marque The Third Manifesto para obtener más información.

Dicho todo esto, primero vería todas las envolturas SQL existentes, quizás some will suit your taste.

+0

Sí, eso fue útil. Gracias, Vinko! – user10955

1

Muchos productos rdbms tradicionalmente se han creado en paquetes isam: mysql es un ejemplo obvio. Todos operan al nivel de especificar tablas e índices, iterar filas, etc .; con los recursos básicos para manejar lecturas, escrituras, bloqueos, etc.

Además, la mayoría de los productos isam han necesitado agregar capas SQL por razones de competencia. Podría comenzar a buscar en Google ejemplos donde la capa SQL podría estar disponible.

9

No debería tardar mucho si realmente lo escribe en lisp. Escribí un motor de base de datos simple en Lisp en aproximadamente una tarde. Aquí hay un ejemplo de cómo se ve:

(select movies (<= 1990 year 2000) (member director '(terry-gilliam tim-burton))) 

Aquí, 'seleccionar' es una macro. Escanea los predicados que lo siguen para los símbolos que son nombres de campo y los vincula a los campos en la base de datos. Luego escribe una función que vincula esos campos a los valores de un registro pasado a la función, y filtra la tabla usando esa función. La macro se expande a algo como esto:

(flet ((filter (item) 
     (let ((year (movie-year item)) 
       (director (movie-director item))) 
     (and (<= 1990 year 2000) 
       (member director '(terry-gilliam tim-burton)))))) 
(loop for item in movies 
     if (filter item) collect item)) 

Lo bueno de hacerlo de esta manera (en realidad en Lisp, en vez de utilizar una sintaxis Lisp) es que se llega compilación de forma gratuita.En mi sistema, el código anterior no es interpretado por el motor de la base de datos, en realidad es una parte compilada del programa (no se puede hacer eso en C, ¿verdad?). Como resultado, es rápido, a pesar de que el código de la base de datos en sí (el código para 'seleccionar' y las definiciones de tabla) tiene solo unas pocas líneas. La base de datos reside en su totalidad en la memoria, pero no importa ... simplemente podría cambiar la macro para acomodar bases de datos externas e incluso escribirla sí utiliza índices. Era lo suficientemente bueno para el proyecto en el que estaba trabajando, así que no agregué índices ni nada sofisticado.

Mi parte favorita es que si bien mantiene toda la concisión de SQL, el código no es diferente al código que lo rodea porque es todo Lisp. Puede introducir variables en su término de búsqueda sin tener que preocuparse por citarlas.

+0

Wow ... Lisp es genial. +1 – Zifre

1

En Practical Common Lisp, this chapter tiene como objetivo una interfaz de estilo RDBS simple para una base de datos de música. Podría ayudar.