I.
Wprowadzenie do  języków zapytań (1)
II.
Wprowadzenie do  języków zapytań (2)
III.
Pojęcia obiektowości w bazach danych (1)
IV.
Pojęcia obiektowości w bazach danych (2)
V.
Podstawy semantyczne języków zapytań
  Wstęp
  1. Składnia, semantyka i pragmatyka języka formalnego
  2. Składnia abstrakcyjna i semantyka kierowana składnią
  3. Semantyka języka zapytań z lotu ptaka
  4. Optymalizacja zapytań
  5. Zasady języków zapytań
  6. Zapytania eliptyczne
  7. Typowe wady teorii języków zapytań
  8. Czym jest (lub powinna być) teoria języków zapytań?
  9. Założenia semantyczne podejścia stosowego
  10. Nazwy, zakresy i wiązanie
  11. Operacyjna semantyka zapytań i programów
  Podsumowanie
  Zadania
VI.
Modele składu obiektów
VII.
Stos środowisk, rezultaty zapytań, funkcja nested
VIII.
Język SBQL (Stack-Based Query Language) (1)
IX.
X.
Dalsze własności SBQL
XI.
Operatory order by i group by
XII.
Przetwarzanie struktur nieregularnych
XIII.
Rozszerzenie języków zapytań o konstrukcje imperatywne
XIV.
Procedury, procedury funkcyjne, metody, reguły zakresu
XV.
Parametry procedur i metod, procedury rekurencyjne, optymalizacja poprzez modyfikację zapytań

 

5. Zasady języków zapytań

Jakkolwiek w ostatnich czasach wiele zasad w informatyce ulega zakwestionowaniu (ze względu na ich stosunkową młodość, niestabilność i nadmierną pochopność środowisk akademickich w ich kreowaniu), nie ma też wątpliwości, że każda dziedzina musi wcześniej czy później dopracować się pewnych zasad, aby stały się możliwe obiektywne kryteria oceny koncepcji i produktów informatycznych. Zbyt często niestety mamy wrażenie, że wiele z tych produktów powstało w wyniku przypadkowych decyzji i nawarstwiania coraz to nowych cech na początkowy, dość ograniczony produkt. W tej sytuacji warto poświęcić nieco miejsca w tym wykładzie na próbę ustalenia zasad, którym powinny podlegać konstrukcje języków zapytań dla obiektowych baz danych, nawet wtedy, jeżeli będą one nieco idealistyczne. Wśród nich wymienimy następujące:

  • Naturalność: zgodność z naturalnym myśleniem potencjalnych użytkowników. Niekoniecznie oznacza ona wyrażanie zapytań w języku naturalnym (ponieważ jest on zbyt mało precyzyjny) i niekoniecznie oznacza umieszczanie w języku dużej liczby słów kluczowych sugerujących cel danej konstrukcji językowej.

  • Prostota: klarowność konstrukcji syntaktycznych, oczywistość semantyki, łatwość uczenia się i nauczania, łatwość dokumentowania, implementacji, pielęgnowania i użycia.

  • Ortogonalność: każda kombinacja cech języka, która ma sens, powinna być dozwolona. Ortogonalność pozwala na zredukowanie do minimum definicji języka oraz znaczne podwyższenie jego mocy. Ma ogromne znaczenie w przypadku, gdy wyrażenia języka nie są pisane przez ludzi, a są automatycznie generowane z innych interfejsów.

  • Kompozycyjność: unikanie dużych zlepków syntaktycznych i zależności semantycznych pomiędzy odległymi kontekstowo fragmentami wyrażeń języka.

  • Relatywizm: identyczna składnia i semantyka wyrażeń języka odnoszących się do dowolnego poziomu zagnieżdżenia struktur danych. Np. zapytania odnoszące się do całej bazy danych i odnoszące się do wnętrza pojedynczego obiektu (które może zawierać podobiekty) powinny być konstruowane na tych samych zasadach.

  • Minimalność (brzytwa Occama): unikanie cech redundantnych. Dotyczy to zarówno redundantnej składni, jak i wprowadzania takich konstrukcji językowych, które można łatwo zastąpić przez inne konstrukcje.

  • Brak anomalii: unikanie specjalnych przypadków, cech wyjątkowych, nieregularnego traktowania itd. Wszystkie takie cechy stają się przyczyną błędów oraz zwiększają objętość dokumentacji języka. Szczególnie groźne są tzw. semantyczne rafy, które powodują błędny (nieoczekiwany) wynik wyrażenia bez ostrzeżeń.

  • Uniwersalność: język powinien w maksymalnym stopniu przykrywać dziedzinę, do której został przeznaczony. Uniwersalność nie oznacza mocy maszyny Turinga, ponieważ to pojęcie jest nieodpowiednie do tej klasy języków. Mamy na myśli uniwersalność pragmatyczną, czyli spełnienie wszystkich aktualnych i rozsądnych oczekiwań użytkowników na dzisiaj
    i na przewidywaną przyszłość.

  • Modularność (hermetyzacja): umożliwienie użytkownikowi posługiwania się fragmentami języka tak jak zamkniętymi bryłami, bez potrzeby wnikania w ich wewnętrzną budowę. Zmiana kontekstu użycia takich brył nie powinna prowadzić do zmiany ich znaczenia.

  • Bezpieczeństwo: wzbogacenie języka o specjalne środki (takie jak deklarowanie typów, asercje, więzy integralności, transakcje) przeciwdziałające niepoprawnemu użyciu konstrukcji języka, prowadzących do naruszenia integralności bazy danych lub integralności przetwarzania.

  • Specjalna troska o przypadki skrajne: puste zbiory, puste stringi, wartości zerowe, niezainicjowane zmienne itd. są bardzo często nie objęte definicją semantyki języka, co powoduje rezultaty nie oczekiwane przez użytkowników.

  • Koncepcyjna kontynuacja: mała zmiana celu, dla którego budowane jest wyrażenie języka, nie powinno wywoływać dramatycznej zmiany w myśleniu użytkownika i w formie tego wyrażenia.
Copyrights © 2006 PJWSTK
Materiały zostały opracowane w PJWSTK w projekcie współfinansowanym ze środków EFS.