2007-02-10

Operacje na bitach w bazie Firebird

Filed under: , FireBird — jerzy.holda @ 3:22

W przypadku gromadzenia dużych ilości danych istotne staje się odpowiednie dobranie typów danych ,tak aby każdy rekord zajmował minimalny potrzebny rozmiar. Najczęściej nie ma problemu z odpowiednim dobranie rozmiaru pól tekstowych oraz liczbowych, ale co gdy chcemy zapisać informację logiczną (flagę), której reprezentacja wymaga tylko jednego bitu? Jeszcze większy problem jest w przypadku gdy chcemy zachować kilka takich flag. Najnowszy standard SQL nie przewiduje typu danych “bit” a jeżeli danych jest dużo, to przechowywanie każdej flagi w osobnym polu jest zwykłym marnotrawstwem. Oczywiście każdy programista powie, żeby użyć do tego jednego bajta i flagi sprawdzać/ustawiać za pomocą odpowiedniej maski. Niestety podejście takie nie zda egzaminu w bazie Firebird, która nie posiada operatorów działających na bitach. Rozwiązań tego problemu może być kilka. Pierwsze to napisać UDF’a, który będzie realizował taką funkcjonalność - mamy jednak od razu problem z przeniesieniem naszej bazy na inny serwer, zwłaszcza, gdy zmiana dotyczy również zmiany systemu operacyjnego. Drugie rozwiązanie to napisać zwykłą procedurę składową, która w mniej lub bardziej skomplikowany sposób wyliczy wartość bitu z odpowiedniej pozycji. Nie jest to rozwiązanie najlepsze, ponieważ nie zawsze można wywołać taką procedurę, zwłaszcza jeżeli chcemy obliczyć wartość bitu jako jedno z pól zapytania select. Z pomocą przychodzi nam jednak bardzo elastyczna składnie FB, dzięki czemu definicja pola może mieć postać:

  SELECT
    POLEA,
    CASE WHEN FLAGI IN (1, 3, 5, 7, ...) THEN 1 ELSE 0 END,
    POLEX
  FROM
    ...

przy czym pole FLAGI jest liczbą przechowującą informację o stanie kilku bitów a w sekcji IN(…) wpisujemy wszystkie wartości flag, które w miejscu interesującego nas bitu mają ustawioną jedynkę - chodzi oczywiście o reprezentację dziesiętną.

No Comments »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment

You must be logged in to post a comment.