2009-06-01 15 views
5

myślę o projektowaniu & wykonawczych moje własne SQL-odpowiednik (DDL + DML), który jest ...Projektowanie alternatywy SQL?

  1. czystego języka relacyjnych algebraiczne i
  2. ma elegancki Lisp-/Schemat podobny Składnia:

Zakładając RDBMS, taki jak MySQL, gdzie dokładnie powinienem rozpocząć pracę nad projektowaniem języka? Na szczycie warstwy pamięci masowej, takiej jak InnoDB?

Nie wiem, jakie funkcje RDBMS zasadniczo znajdują się na silniku pamięci masowej? Moje bieżące intuicyjne zrozumienie jest takie, że większość pracy potrzebnej do stworzenia RDBMS (takiego jak MySQL) byłaby już wykonana w silniku pamięci masowej (konkretnie w InnoDB), a wszystko, co musisz zrobić, to stworzyć język otoki wokół to. Ale wiem też, że gdyby to była prawda, dlaczego MySQL miałby istnieć!

+0

Ekosystem systemu MySQL i Storage Engine jest następujący: Storage Engine to warstwa, która znajduje się bezpośrednio nad macierzystym systemem plików. Wyższe warstwy składają się z parsera zapytań SQL, optymalizatora, pamięci podręcznej zapytań itd. Wbudowana architektura silnika pamięci masowej MySQL została zaprojektowana w taki sposób, że mechanizm przechowywania danych jest warstwą separującą między rodzimym urządzeniem (-ami) pamięciowym a twoim wyższe warstwy, takie jak klient MySQL. –

Odpowiedz

5

Podejrzewam, że najlepszym sposobem obejścia tego problemu byłoby stworzenie tłumacza między językiem a językiem SQL, głównie dlatego, że nie można uzyskać większej funkcjonalności od rdbms niż to, co jest zapewniane przez jego dialekt SQL.

Istnienie MySQL nie ma nic wspólnego z trudnością pracy wykonywanej przez silniki pamięci, storage engines in MySQL naprawdę wykonuje większość pracy, pozostawiając MySQL do parsowania i optymalizacji SQL oraz pobierania danych z silnika, z poszanowaniem odpowiedniej semantyki silnika.

Większość rdbms nie udostępnia maszyn pamięci masowej użytkownikom/administratorom, więc pod tym względem MySQL jest nieco unikalny, co sprawia, że ​​rozsądniej jest stworzyć tłumacza, dzięki czemu będziesz mógł (zmieniając kilka reguł składni) użyć więcej niż jeden rdbms za pośrednictwem Twojej aplikacji.

Ponadto prawdopodobnie nie będzie można wygenerować czystego języka relacyjnego w porównaniu z istniejącą technologią bazy danych, sprawdź numer The Third Manifesto, aby uzyskać więcej informacji.

Powiedziałem, że najpierw obejrzę wszystkie istniejące opakowania SQL, być może some will suit your taste.

+0

Tak, to było pomocne. Dzięki, Vinko! – user10955

1

Wiele produktów rdbms tradycyjnie zostało zbudowanych na pakietach isam - mysql jest oczywistym przykładem. Wszystkie działają na poziomie określania tabel i indeksów, powtarzania wierszy itp .; z podstawowymi urządzeniami do obsługi odczytów, zapisów, blokad itp.

Co więcej, większość produktów isam wymaga dodania warstw SQL na wierzchu ze względów konkurencyjnych. Możesz rozpocząć przeglądanie tych w przykładach, w których warstwa SQL może być dostępna.

9

Nie powinno ci to zająć dużo czasu, jeśli faktycznie napiszesz to w seplenie. Napisałem prosty mechanizm bazy danych w Lisp około popołudnia. Oto przykład jak to wygląda:

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

tutaj „wybierz” jest makro. Skanuje predykaty, które za nim podążają, dla symboli, które są nazwami pól i łączy je z polami w bazie danych. Następnie zapisuje funkcję, która wiąże te pola z wartościami rekordu przekazanego do funkcji i filtruje tabelę za pomocą tej funkcji. Makro rozwija się do czegoś takiego:

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

Fajną rzeczą robią to w ten sposób (w rzeczywistości w Lisp, a nie tylko przy użyciu składni Lisp-podobnego) jest to, że można dostać kompilację za darmo.W moim systemie powyższy kod nie jest interpretowany przez silnik bazy danych, w rzeczywistości jest to skompilowana część programu (nie można tego zrobić w C, teraz możesz?). W rezultacie jest szybki, mimo że sam kod bazy danych (kod dla "wybierz" i definicje tabel) ma tylko kilka wierszy. Baza danych jest całkowicie rezydentna, ale nie ma znaczenia ... można po prostu zmienić makro, aby pomieścić zewnętrzne bazy danych, a nawet napisać, że używają indeksów. To było wystarczająco dobre dla projektu, nad którym pracowałem, więc nie dodałem indeksów ani niczego nadzwyczajnego.

Moją ulubioną częścią jest to, że choć zachowuje całą zwięzłość SQL, kod nie różni się od kodu wokół niego, ponieważ to wszystko jest Lisp. Możesz wprowadzić zmienne do wyszukiwanego hasła bez obawy o ich cytowanie.

+0

Wow ... Lisp jest fajny. +1 – Zifre

1

W Praktyczne Common Lisp, this chapter ma prosty interfejs w stylu RDBS do muzycznej bazy danych. Może pomóc.