Języki i Środowiska Programowania Baz Danych | |||||||
|
1. Co to są języki zapytań? Jak zwykle w tak burzliwie rozwijającej się dziedzinie technologicznej, nie istnieje jednoznaczna definicja, co to znaczy „język zapytań”. Zdarzają się autorzy, którzy używają fraz takich jak „zapytanie w C++” (podając następnie pół-stronicowy kod przypominający szyfr), co jest nieporozumieniem co do charakteru i roli języka zapytań. Początkowa idea języków zapytań polegała na stworzeniu prostego języka dla powszechnego użytkownika, umożliwiającego wyszukiwanie i inne proste operacje w bazie danych. Jednakże w trakcie rozwoju tej klasy języków okazało się, że kwestia „prostego języka” nie jest łatwa. Trudno np. twierdzić, że SQL-92 zaimplementowany (zazwyczaj częściowo) w systemach relacyjnych jest „prosty”, jeżeli weźmiemy pod uwagę setki stron jego dokumentacji. Książka Meltona i Simona na temat SQL [Melt93], która wyjaśnia wszystkie jego aspekty, liczy 536 stron. Tym bardziej trudno jest twierdzić, że SQL-99 [Melt99, Melt01] jest „prostym językiem”, ponieważ - o ile jakakolwiek firma zaimplementuje go w całości (co jest bardzo wątpliwe) - jego dokumentacja będzie miała kilka tysięcy stron i będzie to prawdopodobnie jeden z najbardziej skomplikowanych języków, jakie stworzyła ludzkość. Książka [Melto01] na jego temat liczy 928 stron. Kurs nauki tego języka bez najmniejszych wątpliwości musiałby trwać miesiące, jeżeli nie lata. W literaturze na temat języków zapytań można znaleźć następujące punkty widzenia na ich istotę:
Zapytania koncepcyjnie „hermetyzują” pętle iteracyjne w języku programowania za pomocą operatorów, takich jak selekcja, projekcja, złączenie, unia, przecięcie, kwantyfikatory, grupowanie, sortowanie itp.
Słowo „koncepcyjnie” jest tu istotne, gdyż chodzi o taką hermetyzację, która jest naturalna, zrozumiała i czytelna dla programisty; wspomagająca procesy modelowania pojęciowego przy tworzeniu aplikacji. Przykładowo, zapytanie w SBQL:
w klasycznym języku programowania musiałoby być zrealizowane za pomocą pętli while, for lub innej, gdzie w każdej iteracji sprawdzany byłby warunek Wiek > 30, patrz np. następujący pseudo-kod:
W tej koncepcji języki zapytań są tworami całkowicie ortogonalnymi w stosunku do cechy trwałości danych (czyli bazy danych). Język zapytań nie musi być dedykowany do obsługi bazy danych: zapytania mogą łączyć odwołania do bazy danych i odwołania do tymczasowych danych/obiektów powołanych przez programistę dla potrzeb danej aplikacji. Tę własność miał również zanurzony SQL, którego zapytania mogły zawierać odwołania do zmiennych programistycznych (np. w C) poprzez specjalną składnię (poprzedzający dwukropek). Powstałe w ten sposób języki zapytań znoszą granicę pomiędzy trwałymi i nietrwałymi danymi oraz kolekcjami i indywidualnymi danymi. Chyba pierwszym powszechnie znanym tego rodzaju językiem był DBPL stworzony na Uniwersytecie w Hamburgu (bazujący na koncepcji języka Modula-2) [Matt92, Schm94]. DBPL pozostawia jednak wyrażenia i zapytania jako różne pojęcia. Mniej znany, ale nieco wcześniejszy Loqis [Subi90, Subi91] jest zbudowany na podobnej zasadzie, ale całkowicie znosi różnicę pomiędzy wyrażeniami a zapytaniami. SQL-99 również mieści się w tej kategorii języków (jakkolwiek wątpliwości dotyczą jego inżynierskiej sensowności). Spełnienie tej zasady oznacza zniesienie granicy pomiędzy tym, co w klasycznych językach zapytań określano jako „wyrażenie” i zapytaniem. Przykładowo, typowe wyrażenia, takie jak 2+2, (x*y - z)/32 stają się w ten sposób szczególnymi przypadkami zapytań i mogą być składnikami zapytań, takich jak np.
gdzie Pracownik, Zarobek, Wiek są nazwami odnoszącymi się do bazy danych, zaś x, y, z są zmiennymi języka programowania. Świadomość odnośnie do tego, że tak naprawdę zapytania są uogólnieniem wyrażeń języka programowania, z trudem przebija się w świecie przemysłowym. Np. w Oracle PL/SQL oraz językach 4GL istnieje jeszcze ten tradycyjny podział. Niekiedy jest on motywowany optymalizacją zapytań, ale wydaje się, że ta motywacja nie powinna hamować koncepcji. Jeżeli zaakceptowana będzie koncepcja, wówczas znajdą się pieniądze na to, aby ktoś opracował metody optymalizacyjne dla tej nowej sytuacji. Jedynym problemem nakreślonego wyżej podejścia jest konieczność opracowania, zaimplementowania i wylansowania nowego języka programowania. Popularny stereotyp mówi, że w obecnych czasach (gdzie funkcjonują setki języków programowania) jest to trudne i związane z dużymi nakładami na implementację, wdrożenie i promocję. Praktyka pokazuje inny obraz: każdy pojawiający się nowy system jest wyposażany we własny język programowania, zaś różnych języków nazwanych SQL jest tyle, ile działających systemów. Według naszej wiedzy, żaden zaimplementowany SQL nie trzyma się sztywno standardów SQL, które zresztą posiadają liczne luki specyfikacyjne. W tej sytuacji uleganie pewnej marketingowej histerii odnośnie do niemożliwości wylansowania nowego języka, a już szczególnie nabożne trzymanie się SQL-owskiego lukru „select...from...where...”, jest nierozsądne, wręcz niemądre, szczególnie jeżeli dotyczy to prototypów i działalności badawczej. W podejściu stosowym (jak również w tym wykładzie) przyjmujemy ostatni z wymienionych punktów widzenia. Jakkolwiek rola języka zapytań jako środka dla nieprofesjonalistów jest istotna, może być zrealizowana poprzez ograniczenie możliwości języka oraz obudowanie go bardziej przyjacielską składnią lub wizyjnym interfejsem. Dla nas istotny jest jednak język zapytań o pełnych możliwościach, który może być podstawą profesjonalnych technologii programistycznych. Nie zważając na obecne tendencje przemysłowe przyjmiemy punkt widzenia, w którym zapytania są uogólnionymi wyrażeniami programistycznymi znoszącymi podział na dane trwałe (zapisane w bazie danych) i dane ulotne (będące własnością danej aplikacji) oraz podział na dane masowe (kolekcje) i dane indywidualne (pojedyncze zmienne). |
||||||
Copyrights © 2006 PJWSTK Materiały zostały opracowane w PJWSTK w projekcie współfinansowanym ze środków EFS. |