Разработка альтернативы SQL? - PullRequest
5 голосов
/ 01 июня 2009

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

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

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

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

Ответы [ 4 ]

9 голосов
/ 01 июня 2009

Это не займет у вас много времени, если вы на самом деле напишете это в 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, а не просто используя подобный Lisp синтаксис), это то, что вы получаете компиляцию бесплатно. В моей системе приведенный выше код не интерпретируется ядром базы данных, это фактически скомпилированная часть программы (не можете сделать это в C, теперь вы можете?). В результате это происходит быстро, хотя сам код базы данных (код для выбора и определения таблиц) занимает всего несколько строк. База данных полностью запоминает память, но это не имеет значения ... вы можете просто изменить макрос для размещения внешних баз данных и даже написать его, используя индексы. Это было достаточно для проекта, над которым я работал, поэтому я не добавлял индексы или что-то необычное.

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

5 голосов
/ 01 июня 2009

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

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

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

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

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

1 голос
/ 01 июня 2009

In Practical Common Lisp , Эта глава направлена ​​на простой интерфейс в стиле RDBS для базы данных Music. Могу помочь.

1 голос
/ 01 июня 2009

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

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

...