Projekt tabel do przechowywania odczytów temperatur

0

Witam,

chciałbym uzyskać pomoc w projekcie bazy danych, sytuacja wygląda następująco: jest system pomiarowy składający się z 20 czujników temperatury, odczyty wykonywane są co minutę, czyli wychodzi 1440 odczytów na dobę dla każdego czujnika. Baza ma przechowywać dane z co najmniej kilku lat w celach porównawczych. Dane będą wykorzystywane do generowania wykresów. Skrypt generujący wykres przyjmuje dane w postaci {data1, seria1, seria2, seria3 ...seriaX},{data2, seria1, seria2, seria3 ...seriaX}. Jak optymalnie zaprojektować tabele, pod względem wydajności przy pobieraniu ciągłych zakresów czasowych (np. doba, tydzień, miesiąc)?
Postgresql, typy danych timestamp i smallint(minimalizacja rozmiarów bazy).

Wariant A. (ok. 500 tys. rekordów na rok)

data, t1, t2,t3 ... t20

24-04-2012 17:00, 10,11,12 ... 10
24-04-2012 17:01, 11,10,12 ... 10

Wariant B. (ok. 10 mln. rekordów na rok)

data, czujnik, temp

24-04-2012 17:00, 1, 10
24-04-2012 17:00, 2, 11
24-04-2012 17:00, 3, 12
...
24-04-2012 17:00, 20, 10
24-04-2012 17:01, 1, 11
24-04-2012 17:01, 2, 10
24-04-2012 17:01, 3, 12
...
24-04-2012 17:01, 20, 10

Wydaje mi się, że wariant A będzie szybszy przy zapytaniu o temp. z kilku czujników, w podanym zakresie czasu (mniej rekordów do przeszukania).
Ponadto w następnej tabeli będą przechowywane dane statystyczne za okresy np. 10min (minimum,maximum,średnia,mediana). Będą wykorzystywane do generowania wykresów za dłuższe okresy czasowe (3, 6 miesięcy).

Wariant A. (sporo kolumn, 50 tys. rekordów na rok)
data, min1,max1,sre1,med1,min2,max2,sre2,med2, ... min20,max20,sre20,med20

24-04-2012 17:00, ...
24-04-2012 17:10, ...
24-04-2012 17:20, ...
24-04-2012 17:30, ...

Wariant B. (1 mln rekordów na rok)

data, czujnik, min, max, sre, med
24-04-2012 17:00, 1, ...
24-04-2012 17:00, 2, ...
...
24-04-2012 17:10, 1, ...
24-04-2012 17:10, 2, ...

Wariant C. osobne tabele dla każdego czujnika po 50 tys. rek.
t1
data, min, max, sre, med

t2
data, min, max, sre, med

Ponownie wariant A wydaje mi się najodpowiedniejszy (mimo dużej ilości kolumn), łatwiej będzie wyszukać i pobrać dane do generowania wykresu.

Proszę o radę czy słusznie typuje na warianty A. czy może jednak inny układ jest optymalniejszy.

1

W postgresql można użyć w tabeli pola typu array.

http://www.postgresql.org/docs/9.1/static/arrays.html

0

Czy taka tabela z kolumną typu array, będzie wydajniejsza ?

0

To zależy co masz na myśli, a właściwie co chcesz z tymi danymi zrobić. Jeżeli w polu typu array chcesz trzymać odczyty temperatur i je wszystkie na raz, jednocześnie zapisywać i odczytywać, to pole typu array jest wydajniejsze niż wiele kolumn. Z kolei jeżeli będziesz potrzebował odczytywania pojedynczej temperatury, albo będziesz chciał zmienić pojedynczą temperaturę to wydajniejsze będzie trzymanie temperatur w pojedynczej kolumnie i rekordzie.

Zastanów się jakie operacje będą przeważać w systemie, który projektujesz. Ja z tego co pisałeś zrozumiałem, że na tej tabeli będą tylko INSERTY (co minutę) i SELECTY (w chwili generowania wykresu), a dane nie będą poprawiane, nie będzie również konieczności odczytu pojedynczej temperatury. Z tego powodu zasugerowałem pole typu array, które idealnie pasuje do takiego scenariusza.

0

Dziękuję za wyjaśnienia, tak jak napisałeś update'ów nie będzie, natomiast select'y będą dotyczyły wybiórczych temperatur, wyczytałem że jest możliwość odczytania poszczególnych pól z pola typu array, czyli praktycznie jak select z kolumn tabeli.
Pytając o wydajność miałem na myśli odczyt danych, przy dość szerokim zakresie dat, będzie sporo tych danych. Czy ilość kolumn ma wpływ na szybkość przeszukiwania i odczytu wybranych kolumn np. czy odczyt 4 kolumn z 10, będzie szybszy od odczytu 4 z 100 ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1