Strumieniowe bazy danych – definicje


Ostatnimi czasy sporo czasu poświęciłam zagadnieniom strumieniowych języków i baz danych. Związane było to z tworzeniem własnego języka strumieniowego. W dzisiejszych czasach istnieje wiele systemów, w których wymagane jest przetwarzanie bardzo dużych ilości danych, napływających z wielu źródeł w trybie on-line. Z punktu widzenia zarówno użytkownika bardzo ważne jest, aby analiza i prezentacja wyników była ciągła i dynamiczna. Przykładami takich systemów mogą być systemy monitorujące ruch drogowy lub systemy giełdowe. W obu przypadkach niezbędna jest minimalizacja opóźnień przetwarzania danych. Konsekwencją może być zwrócenie nieaktualnych danych. Klasyczne systemy bazodanowe mogą okazać się nieefektywne, ponieważ przed przetworzeniem danych następuje ich zapis (znacząco spowalnia to pracę przy dużych zbiorach). Innym przykładem może być system monitorujący bezpieczeństwo. Kładzie się tu nacisk na inne funkcjonalności niż we wcześniejszych przypadkach. Opóźnienia nie są tak ważne, jak pewność zwrócenia wszystkich danych, bez pominięcia żadnych wartości. Różnorodność ta sprawia, że budowa systemu ogólnego zastosowania wiąże się ze stworzeniem nowych rozwiązań. Jednym z nich może być właśnie system przetwarzania strumieniowego.

Strumieniowa baza danych jest bazą operującą na strumieniach danych. Implementowane są w niej języki ciągłych zapytań oparte na języku SQL. Czasami stosowane są rozwiązania graficzne. Ciągłe zapytanie jest zapytaniem, które przetwarza strumienie bez przerwy, aż do momentu wycofania zapytania z systemu. Strumieniowy model bazy danych zakłada, że dane napływające do systemu nie są jeszcze znane w momencie tworzenia zapytania. Czas, w którym można je zarejestrować jest skończony. Dane takie napływają na bieżąco i zapisywane są w strumieniu. Nie można również założyć ile elementów będzie posiadał dany strumień danych. Każdy jego element jest przetwarzany, a  następnie niszczony lub archiwizowany. Strumienie nie są przechowywane w całości w  pamięci operacyjnej, dlatego najłatwiejszy dostęp możliwy jest do najświeższych danych (najpóźniej zarejestrowanych).

Krotka jest strukturą danych, która odzwierciedla uporządkowany ciąg wartości. Krotki przechowują stałe wartości o różnych typach danych. Odczyt elementów polega na podaniu indeksu liczbowego wybranego elementu. Krotka może być wykorzystywana przez wiele zapytań jednocześnie, dlatego nie istnieje możliwość modyfikacji jej elementów.

Operator strumieniowy to komponent, który zajmuje się przetwarzaniem dostarczonej mu krotki lub grupy krotek. Operatory w strumieniowych systemach podobne są do tych funkcjonujących w relacyjnych bazach danych. Różnica jest taka, że w relacyjnych systemach zarządzania bazami danych operatory przetwarzają skończony zbiór danych. Gdyby  strumieniowe systemy opierały się na takich  samych operatorach, następowałaby blokada, ponieważ oczekiwałyby one na zamknięcie strumienia. Ponadto część operatorów w relacyjnych bazach danych wymaga przechowywania wszystkich otrzymanych wcześniej krotek, co doprowadziłoby do przerwania pracy z powodu braku wolnych zasobów. Dlatego w przetwarzaniu strumieniowym nie występuje przykładowo operator sortowania. Ze względu na wymagania pamięciowe operatory można podzielić na bezstanowe (np. selekcja, projekcja, okna czasowe) oraz stanowe (np. złączenia i agregacje).

Okno czasowe to operator, którego głównym zadaniem jest ograniczenie okresu aktywności krotek w systemie. Operatory tego typu są niezbędne, ponieważ strumienie są nieograniczone czasowo. Oznacza to, że ich zapis skutkowałby potrzebą przechowywania nieskończonej liczby krotek, co jest fizycznie niemożliwe. Operatory okien można podzielić na czasowe i fizyczne. Pierwsze z nich operują na wartościach znaczników czasu. Wśród nich można wyróżnić okna przesuwno-czasowe oraz stało-czasowe.  Wykorzystywane są one między innymi przy operacjach agregujących (np. obliczanie średniej wartości z ostatniej godziny – okno przesuwno-czasowe o rozmiarze 1h). Fizyczne okna zwane są liczebnościowymi i operują na wartościach liczbowych. Dla przykładu, jeżeli okno fizyczne ustawione jest na 10 krotek, to przy odczycie jedenastej, najstarsza krotka będzie usunięta z tego okna i zastąpiona nową.

Strumieniowe języki zapytań są językami operującymi na strumieniach danych. Podzielić je można ze względu na zapis. Pierwsze z nich to języki deklaratywne, które bazują na zmodyfikowanej składni języka SQL. Kolejnym typem są języki proceduralne, w których plan realizacji zapytania tworzony jest bezpośrednio przez użytkownika. Istnieje jeszcze podejście obiektowe, w założeniu którego wszystko przedstawiane jest jako obiekt. Dzięki językom zapytań istnieje możliwość pobrania ze strumieni interesujących wartości (niekoniecznie znanych w chwili formułowania zapytania), a następnie przedstawienia ich w postaci raportu.