Wpis z mikrobloga

Projektuję właśnie bazę danych (wykorzystywać będę PostgreSQL) do budowanej przeze mnie stacji meteo i potrzebuję potwierdzenia czy dobrze myślę. Może jakieś cenne porady/uwagi uzyskam? Na początku myślałem nad dwoma tabelami, ale biorąc pod uwagę elastyczność i rozbudowę postanowiłem zrobić 4 tabele. Teraz zaczynam się zastanawiać nad jeszcze jedną tabelą do przechowywania kluczy odczytów aby nie ładować tego do każdego pomiaru, a jedynie wstawiać ID klucza odczytu w danym rekordzie i robić relacje tej tabeli z kluczami odczytów.

Aktualna struktura jaką wymyśliłem:

Tabele:
wssensors - tabela z nazwami i opisami czujników
ws
temperature - tabela dla danych z czujników temperatury
wshumidity - tabela dla danych z czujników wilgotności
ws
pressure - tabela dla danych z czujników ciśnienia

Struktura tabel:

**ws_sensors**
id, dateinsert, datemodify, sensorname, sensordescription

**ws_temperature**
id, dateinsert, sensorid, temperature, read_key

**ws_humidity**
id, dateinsert, sensorid, humidity, temperature, heatindex, dewpoint, read_key

**ws_pressure**
id, dateinsert, sensorid, pressure, altitude, sealevel, readkey

Kolumna **read_key** ma być indywidualnym unikalnym kluczem (np. guid, guid+timestamp albo coś) odczytu w którym pobrano dane z czujnika. Klucz ma być generowany przy każdym odczycie danych z czujnika. Pozwoli to na ustalenie jakie dane zostały uzyskane ze stacji meteo w danym odczycie oraz na pobranie odczytanych danych dla wybranego klucza ze wszystkich tabel czyli ich powiązania, że w danym odczycie zostały pobrane właśnie takie dane. Czyli pobieram z czujnika dane i generuje klucz odczytu np. [klucz-12345-czulk], dodaję do bazy danych pobrane dane i wpisuję przy każdym wpisie w kolumnie readkey klucz [klucz-12345-czulk]. Robię takich odczytów np. 100 i każdy z nich dostaje innych klucz readkey i teraz gdy potrzebuję sprawdzić jaki był np. pierwszy odczyt temperatury danego dnia to wyszukuje w bazie w tabeli temperatur dany dzień i pobieram wszystkie dane powiązane relacyjnie dla klucza [klucz-12345-czulk].

Jednakże coś mi tutaj nie pasuje (optymalizacja, wyszukiwanie, przechowywania itp.) i myślę nad tym, że powinienem dodać 5 tabele np. **ws_readings**, w której bym przechowywał datę odczytu i klucz odczytu i wg. tej tabeli wyszukiwał i tworzył relacje pomiędzy pozostałymi tabelami z danymi, w których readkey to by było jedynie ID rekordu wpisu w tabeli wsreadings.

Struktura **ws_readings**
id, dateinsert, readkey

W takiej strukturze kolumna read_key w pozostałych tabelach nie będzie zawierała klucza [klucz-12345-czulk] tylko ID wpisu z kluczem w tabeli ws-readings czyli jakiś numer wpisu np. 233, który zawiera dany klucz read-key. Czyli przykładowo relacja będzie tutaj ws-readings [ID] <--> read-key-id (tym samym nazewnictwo kolumny w pozostałych tabelach zmienione zostanie na read-key-id ;) ).
Na pierwszy rzut oka zminimalizuje to nieco wielkość tabel/bazy jak się zdaje (bo nie będę przechowywać pełnego klucza w każdym rekordzie) oraz pozwoli łatwiej wyszukiwać dane (**ws_readings**zawiera datę odczytu oraz klucz danych z którym należy powiązać dane z pozostałych tabel co da nam pełne dane odczytane w danym momencie ze stacji).
Generowanie klucza read_key jak już wspomniałem to może być guid+timestamp (timestamp może być np. kodowany przez base64) aby wyeliminować możliwość zduplikowania klucza albo może będę wrzucą tylko timestamp lub go kodować przez base64. Timestamp nie powinien się raczej nigdy powtórzyć, bo samo pobranie danych z czujnika zajmie co najmniej 2 sekundy, a odczyty mają być robione co 5 min. Obecnie to jest najmniejszy problem jak będzie wyglądać klucz.

Przy stacji meteo będzie dość dużo wpisów jak wiadomo. Obecny prototyp stacji meteo, który posiadam (odczyt tylko temperatur z czujników) zapisuje dane do bazy SQLite (plik bazy obecnie waży 23,2MB i posiada 423969 rekordów). Dane odczytywane są i będą co 5 minut czyli tak jak to jest w przypadku obecnego prototypu.
Z tabel **wstemperature, wshumidity, ws_pressure** mogę usunąć kolumnę date_insert na dobrą sprawę, bo data odczytu będzie w takim przypadku przechowywana w tabeli **ws_readings**. Jednakże bez tabeli wsreadings nigdy nie będzie wiadomo kiedy dany odczyt został wykonany. Tym samym wsreadings staje się mega ważną tabelą.

Zdaje się mi, że takie rozwiązanie z wykorzystaniem 5 tabel (**wssensors, wstemperature, wshumidity, wspressure, ws_readings**) będzie dobre?

#sql #programowanie #projektowanie #postgresql #pogoda
  • 2
  • Odpowiedz
guid, guid+timestamp albo coś


@mwwilk: guid jest wystarczająco unikalny :>

Pozwoli to na ustalenie jakie dane zostały uzyskane ze stacji meteo w danym odczycie oraz na pobranie odczytanych danych dla wybranego klucza ze wszystkich tabel czyli ich powiązania, że w danym odczycie zostały pobrane właśnie takie dane. Czyli pobieram z czujnika dane i generuje klucz odczytu np. [klucz-12345-czulk], dodaję do bazy danych pobrane dane i wpisuję przy każdym wpisie w kolumnie
  • Odpowiedz