2009-06-01 3 views
5

Я имею в виду разработки & реализации мой собственный SQL-эквивалент (DDL + DML), который ...Проектирование альтернативы SQL?

  1. чисто реляционные алгебраического языка, и
  2. имеет элегантный Lisp-/Схема типа синтаксис

Предполагая СУРБД, такую ​​как MySQL, где именно мне нужно было бы начать работу по разработке языка? В верхней части слоя двигателя хранения, такого как InnoDB?

Я не знаю, что все функциональные возможности RDBMS обычно находятся на платформе хранения? Мое настоящее интуитивное понимание заключается в том, что основная часть работы, необходимой для создания СУБД (например, MySQL), уже была бы выполнена в рамках механизма хранения (в частности, в InnoDB), и все, что вам нужно будет сделать, это создать язык обертки вокруг Это. Но я также знаю, что если бы это было действительно так, зачем MySQL существовал в первую очередь!

+0

Эту систему MySQL и Storage Engine это: Storage Engine - это слой, который расположен непосредственно над вашей собственной файловой системой хранилища. Более высокие уровни состоят из синтаксического анализатора запросов SQL, оптимизатора, кеша запросов и т. Д. Архитектура MySQL с подключаемым хранилищем MySQL была разработана таким образом, что Storage Engine является разделяющим уровнем между собственным запоминающим устройством (ов) и вашим более высокие уровни, такие как клиент MySQL. – 2009-06-01 11:29:04

ответ

5

Я подозреваю, что наилучшим способом обойти это было бы создание переводчика между вашим языком и SQL, главным образом потому, что вы не сможете получить больше возможностей из rdbms, чем то, что предоставляется через его диалект SQL.

Существование MySQL не имеет ничего общего с трудностями работы, выполняемыми системами хранения данных. storage engines in MySQL действительно выполняет большую часть работы по ворчанию, оставляя MySQL анализировать и оптимизировать SQL и извлекать данные из движка, учитывая соответствующую семантику двигателя.

Большинство rdbms не предоставляют механизмы хранения для пользователей/администраторов, поэтому в этом отношении MySQL несколько уникален, что делает разумным создание переводчика, таким образом вы сможете (путем изменения нескольких правил синтаксиса) использовать более одного rdbms через ваше приложение.

Кроме того, вы, вероятно, не сможете создать чистый реляционный язык по существующей технологии баз данных, уточните The Third Manifesto для получения дополнительной информации.

Все, что сказал, я действительно посмотрел бы на все существующие SQL-обертки, может быть some will suit your taste.

+0

Да, это было полезно. Спасибо, Винко! – user10955

1

Многие продукты rdbms традиционно были построены на пакетах isam - наглядный пример - mysql. Все они работают на уровне указания таблиц и индексов, повторных строк и т. Д .; с базовыми средствами для обработки чтений, записей, блокировок и т. д.

Кроме того, большинство продуктов из имама должны были добавить слои SQL сверху по конкурентным причинам. Вы можете начать поиск через эти примеры, где может быть доступен уровень SQL.

9

Это не займет у вас много времени, если вы на самом деле напишите его в lisp. Я написал простой движок базы данных в Лиспе примерно днем. Вот пример того, как он выглядит:

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

Здесь 'select' - макрос. Он сканирует предикаты, которые следуют за символами, которые являются именами полей, и связывает их с полями в базе данных. Затем он записывает функцию, которая связывает эти поля со значениями записи, переданной функции, и фильтрует таблицу с использованием этой функции. Макрос подставляет что-то вроде этого:

(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)) 

крутая вещь о делать это таким образом (на самом деле в Лиспе, а не только с помощью Lisp-подобный синтаксис) является то, что вы получите сборник бесплатно.В моей системе приведенный выше код не интерпретируется механизмом базы данных, это фактически скомпилированная часть программы (не можете сделать это на C, теперь вы можете?). В результате это происходит быстро, даже если сам код базы данных (код для «select» и определения таблиц) составляет всего несколько строк. База данных полностью резидентная, но это не имеет значения ... вы могли бы просто изменить макрос для размещения внешних баз данных и даже записать его, используя индексы. Это было достаточно хорошо для проекта, над которым я работал, поэтому я не добавлял индексов или чего-то необычного.

Моя любимая часть об этом заключается в том, что, сохраняя при этом всю краткость SQL, код не отличается от кода вокруг него, потому что это все Lisp. Вы можете ввести переменные в свой поисковый запрос, не беспокоясь о их цитировании.

+0

Ничего себе ... Лисп классный. +1 – Zifre

1

В Практические общие Lisp, this chapter направляет простой интерфейс стиля RDBS в базу данных музыки. Может помочь.

Смежные вопросы