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ń
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
  Wstęp
  1. Metody przetwarzania nieregularności w danych
  2. Nieregularne dane w modelach składu
  3. Konstrukcje w języku zapytań obsługujące dane nieregularne
  4. Możliwości zewnętrznych złączeń
  5. Problem z fałszywym wiązaniem
  6. Wartości domyślne
  Podsumowanie
  Zadania
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ń

 

Wstęp

Problem danych nieregularnych, zwanych również półstrukturalnymi (semistructured)  jest nowym sformułowaniem problemu wartości zerowych w bazach danych (NULL values), którego historia liczy już ponad 30 lat. Problem obrósł ogromną literaturą (ponad 500 pozycji) i w swoim czasie był ulubionym tematem licznych prac naukowych w kontekście tzw. "niekompletnej informacji". Szczególnie problem ten zafascynował matematyków działających w dziedzinie informatyki. Powstały liczne prace dotyczące specjalnych algebr z wartościami zerowymi, specjalnych rachunków, trójwartościowych i cztero-wartościowych logik, odpytywania "dysjunktywnej informacji" i zbiorów "możliwych światów" i wiele innych.

Cały ten naukowy pęd zaowocował wyjątkowo mizernymi rezultatami: góra urodziła mysz. Oczywistym powodem tego stanu rzeczy był fakt, że teoretycy informatyki nie byli zainteresowani problemami praktycznymi; problemy były traktowane w warstwie estetycznej, intelektualnej zabawy, matematycznych puzzli. Świat informatyki komercyjno-przemysłowej nie uznał więc tego problemu i tych rozwiązań za dostatecznie istotne i nie pojawiły się nawet próby implementacji czegokolwiek z tej góry poronionych pomysłów.

Problem wartości zerowych znalazł swoje praktyczne odbicie w SQL. Sposób wprowadzenia wartości zerowych do SQL ignoruje zasadę korespondencji i wprowadza dużą liczbę raf semantycznych [Date86]. W SQL wartość zerowa nie ma żadnej "zewnętrznej" semantyki, np. do reprezentowania niekompletnej informacji. Jest to wyłącznie trik techniczny mający na celu dostarczenie projektantom i programistom możliwości uwzględnienia nieregularności w danych. Projektant lub programista może go stosować do dowolnie wybranych celów, i on jest też jedynym autorytetem, który wie, jaka jest zewnętrzna (biznesowa) semantyka wprowadzonych poprzez ten trik wartości zerowych.

W dziedzinie języków programowania istnieje inny fenomen dotyczący nieregularnych danych, zwany "rekordem z wariantami" w rodzinie języków Pascalo-podobnych, i "unią" w rodzinie języków C-podobnych. Będziemy posługiwać się terminem "wariant". Opcja ta umożliwia zbudowanie typu, którego instancje mogą różnić się zestawem atrybutów. Warianty i wartości zerowe są pojęciami dość podobnymi. Jeżeli przyjmiemy, że wartość zerowa oznacza brak odpowiedniej danej (w modelach składu M0-M3 - wraz z jej nazwą), to  fakt, że w  obiektach R typu T z atrybutami A,B,C,... atrybut A może mieć wartość zerową, można zapisać (w pseudokodzie) jako:

      T = wybierz wariant R(A, B, C, ... } lub R( B, C, ...)

Drugi wariant typu T pomija atrybut A. Pojęcia wartości zerowej i wariantu nie są równoważne. Jeżeli obiekty R mogłyby mieć np. 10 atrybutów mogących przyjąć wartości zerowe, wówczas konieczne byłyby 210 = 1024 warianty, co jest oczywiście nierealne. Wariantu nie da się również w ogólnym przypadku zamodelować poprzez nieobecne dane (czyli wartości zerowe). Dopuszczalna jest też sytuacja, kiedy w ramach różnych wariantów obiektów nazwy atrybutów są identyczne, ale typy są różne. Warianty mogą posiadać dyskryminator, tj. wyróżniony atrybut, na podstawie wartości którego system jest w stanie automatycznie rozróżnić, z którym wariantem ma w danej chwili do czynienia. To umożliwia zrealizowanie mocnej kontroli typologicznej w czasie wykonania. W odróżnieniu od Pascala, C/C++ nie wprowadzają takiego dyskryminatora. W wielu językach nie wprowadza się wariantów lub oczekuje się, że są one osiągalne poprzez specjalizacje klas. W niektórych sytuacjach takie podejście grozi kombinatoryczną eksplozją liczby klas.

Ostatnio stosunek do nieregularności w danych nieco się zmienił ze względu na standard XML, który nieregularność formatu przyjął jako zasadę. Stare prace dotyczące wartości zerowych są niestety w tym kontekście również bezwartościowe. Powstało wiele nowych prac, w których nie mówi się już o wartościach zerowych, wariantach lub niekompletnej informacji, lecz o przetwarzaniu danych półstrukturalnych, co przybliża to podejście do klasycznych wariantów, ale ustawia je w nowym kontekście, patrz np. [Abit97d, Bune95, Bune97, Chaw95, Lahi99]. Oczywiście, stare problemy pozostały i nie są widoczne nowe rewolucyjne metody, które mogłyby zmienić jakość rozwiązań. Można więc wątpić, czy ten nowy kierunek zaowocuje tym razem rezultatami dostatecznie istotnymi dla powszechnych praktycznych wdrożeń. Najbardziej prawdopodobne jest to, że świat informatyki komercyjnej, nie oglądając się na świat informatyki akademickiej, dopracuje się własnych rozwiązań na podstawie mniej lub bardziej przemyślanych (lub przypadkowych) decyzji.

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