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ń

 

3. Semantyka języka zapytań z lotu ptaka

Podstawą naszej koncepcji będzie założenie, że semantyka dowolnego zapytania jest funkcją odwzorowującą zbiór wszystkich stanów (przede wszystkim stanów bazy danych, ale nie tylko) w element zbioru rezultatów zapytań. Bardziej formalnie, przyjmijmy, że Q jest zbiorem napisów składających się na język zapytań (wyznaczonych przez jego składnię), Stan jest zbiorem wszystkich stanów, zaś Rezultat jest zbiorem wszystkich możliwych rezultatów. Dla dowolnego napisu q Î Q semantyka jest pewną funkcją (oznaczmy ją przez |q|) odwzorowującą stan w rezultat:

|q|: Stan -> Rezultat

Tego rodzaju semantyka dotyczy zapytań bez efektów ubocznych. Jeżeli zapytanie q ma efekty uboczne, np. wywołuje metodę, która powoduje zmiany w bazie danych, wówczas semantyka takiego zapytania wyraża się poprzez funkcję

|q|: Stan -> (Rezultat Stan)

czyli zapytanie działające na pewnym stanie zwraca swój rezultat oraz nowy stan. Dla zapytań aktualizujących (imperatywnych konstrukcji programistycznych bazujących na zapytaniach, takich jak update, insert, delete w SQL) semantyka wyraża się funkcją

|q|: Stan -> Stan

Jakkolwiek zbiory StanRezultat mogą być zdefiniowane za pomocą tych samych prymitywów (np. wartości danych), generalnie relacja pomiędzy tymi zbiorami może być dość dowolna. W szczególności, nie ma obowiązku, aby rezultat r Î Rezultat był elementem stanu, tj. aby istniał taki stan s Î Stan, że r Î s. Tego rodzaju wymóg wynikałby z własności domkniętości; w naszym podejściu własność tę odrzucamy jako nielogiczną i niepotrzebną.

W ten sposób ustaliliśmy elementy, które należy zdefiniować dla potrzeb semantyki języka zapytań. Są nimi:

  • Dziedzina syntaktyczna zapytań, oznaczona wcześniej jako Q. Będziemy starali się zdefiniować ją w postaci składni abstrakcyjnej, która unika nadmiarowego syntaktycznego lukru.

  • Zbiór wszystkich stanów, oznaczony wcześniej jako Stan.

  • Zbiór wszystkich rezultatów zapytań, oznaczony wcześniej jako Rezultat.

  • Odwzorowanie napisu będącego zapytaniem (elementu dziedziny syntaktycznej Q) w znaczenie tego napisu. Dla każdego takiego napisu musimy ustalić funkcję, która odwzorowuje dowolny stan w rezultat lub odwzorowuje stan w rezultat i/lub nowy stan..


Podane wyżej elementy są podstawą większości znanych podejść do semantyki języków programowania (włączając semantykę denotacyjną, operacyjną i inne). Postaramy się pokazać, że powyższe założenia są efektywną teorią, czyli można je przełożyć na konkretne zasady konstruowania języków zapytań oraz konkretne języki o praktycznym znaczeniu. Pokażemy również, że dzięki przyjęciu podanych wyżej założeń możemy uniknąć dylematów będących konsekwencją odrzuconej przez nas własności domkniętości (closure property), czy zapytanie ma "zachowywać obiekty", czy też "generować obiekty".

Nieco uwagi musimy poświęcić kwestii odwzorowania formy składniowej zapytań na ich znaczenie. Niech pewne zapytanie ma składnię q1 q q2 , gdzie q1 i q2 są podzapytaniami, zaś q jest oznaczeniem pewnego operatora języka (np. operatora where lub operatora sumy zbiorów). Będziemy w takich przypadkach przyjmować zasadę modularności lub kompozycyjności, powszechnie przyjętą przy opisach semantyki języków programowania.

Zasada kompozycyjności głosi, że znaczenie zapytania q1 q q2 (oznaczone jako |q1 q q2| ) wyraża się poprzez znaczenie jego składowych, czyli poprzez |q1|, |q2| i |q|, gdzie |q| jest pewnym bytem matematycznym lub zaimplementowanym operatorem będącym znaczeniem symbolu językowego q.

Zasadę kompozycyjności będziemy stosować do wszystkich form składniowych języka zapytań. Dzięki przyjęciu tej zasady możemy stosować definicje rekurencyjne. Po określeniu znaczenia zapytań, które uznamy za elementarne, możemy budować semantykę coraz bardziej złożonych zapytań, przyjmując, że semantyka ich podzapytań jest znana.

Kilka następnych uwag dotyczy pojęcia stanu (zbioru Stan). Zazwyczaj twórcy języków zapytań przyjmują, że zapytania działają wyłącznie na bazie danych. Kwestia stanu nie jest jednak taka prosta, jeżeli przyjmiemy, że nasze zapytania mogą nie tylko odwoływać się do bazy danych, ale mogą również zawierać nazwy zmiennych programistycznych (jak w zanurzonym SQL), nazwy metod i procedur, nazwy ich parametrów, zmienne klasowe, zmienne środowiskowe itd. Wszystkie te elementy składają się na pojęcie stanu. Konieczna staje się pewna dyscyplina, która pozwoli jasno określić, w jaki sposób ewaluacja naszego zapytania będzie odwoływać się do poszczególnych składowych stanu. Tę dyscyplinę zapewnia stos środowisk, który jest podstawowym mechanizmem w naszym podejściu. Stos ten staje się dodatkowym elementem, który należy uwzględnić przy definiowaniu pojęcia stanu.

Określenie porządku w różnorodnych środowiskach czasu wykonania składających się na nasz stan nie jest jedyną funkcją stosu środowisk. Jak się przekonamy, będzie on miał również zasadnicze znaczenie w semantyce pomocniczych nazw występujących w zapytaniach (zwanych "zmiennymi krotkowymi", "synonimami", "zmiennymi dziedzinowymi" itd., przy czym semantyczna precyzja tych określeń pozostawia bardzo wiele do życzenia). Oprócz tej funkcji, stos ten będzie pełnił ważną rolę w ewaluacji zapytań zawierających operatory, które nazwaliśmy "niealgebraiczne", takie jak operator selekcji (where), operator kropki (projekcji lub nawigacji), operator zależnego złączenia, kwantyfikatory i inne.

Copyrights © 2006 PJWSTK
Materiały zostały opracowane w PJWSTK w projekcie współfinansowanym ze środków EFS.