Języki i Środowiska Programowania Baz Danych | |
|
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: Jakkolwiek zbiory Stan i Rezultat 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:
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. |