Zaprojektowałem wstępnie bazę danych, w której będą przechowywane odczytane dane ze stacji meteo. Na początku myślałem o dwóch tabelach (jedna do przechowywania nazw i opisów czujników, a druga do przechowywania danych z czujników) jednak po przemyśleniu struktury biorąc pod uwagę elastyczność i przyszłość rozbudowy postanowiłem stworzyć 4 tabele do przechowywania danych. Pozwoli to zachować elastyczność bazy oraz łatwość rozbudowy w przyszłości. Baza danych (silnik) jaki będzie tutaj używany to PostgreSQL (więcej info w wikipedi: https://pl.wikipedia.org/wiki/PostgreSQL). Jest to darmowa baza danych, którą może każdy wykorzystywać nawet w zamkniętych projektach komercyjnych. Poniżej opis, diagram, struktura bazy, którą zaprojektowałem na potrzeby stacji meteo.
Diagram poniżej przedstawia strukturę bazy oraz relacje pomiędzy tabelami. Baza ma 4 tabele: ws_sensors, ws_temperature, ws_humidity, ws_pressure.
Tabela ws_sensors jest tabelą do przechowywania nazw i opisów czujników. Pozwoli to określić czy np. pobrana temperatura jest temperaturą z czujnika umieszczonego wewnątrz czy na zewnątrz .
Pola tabeli ws_sensors:
id – identyfikator rekordu w tabeli
date_insert – data utworzenia rekordu
date_modify – data modyfikacji rekordu
sensor_name – nazwa czujnika
sensor_description – szczegółowy opis czujnika
Tabela ws_temperature jest do przechowywania odczytywanych temperatur z czujników.
Pola tabeli ws_temperature:
id – identyfikator rekordu w tabeli
date_insert – data dodania rekordu
sensor_id – ID czujnika z tabeli ws_sensors
temperature – zmierzona temperatura
Tabela ws_humidity jest do przechowywania odczytanej wilgotności powietrza, temperatury, obliczonego współczynnika heat_index (temperatura odczuwalna) oraz obliczonego punktu rosy. Do wyliczenia heat_index i dew_point jest potrzebna temperatura (która jest mierzona przez ten sam czujnik) i wilgotność dlatego w tej samej tabeli przechowywana jest wilgotność oraz temperatura.
Pola tabeli ws_humidity:
id – identyfikator rekordu w tabeli
date_insert – data dodania rekordu
sensor_id – ID czujnika z tabeli ws_sensors
humidity – zmierzona wilgotność powietrza
temperature -zmierzona temperatura przy danej wilgotności
heat_index – obliczona temperatura odczuwalna
dew_point – obliczony punkt rosy
Tabela ws_pressure jest do przechowywania zmierzonego ciśnienia (przy okazji także zapisywana jest wysokość n.p.m. wyliczona na podstawie ciśnienia oraz rzeczywista wysokość n.p.m. na której znajduje się czujnik).
Pola tabeli ws_pressure:
id – identyfikator rekordu w tabeli
date_insert – data dodania rekordu
sensor_id – ID czujnika z tabeli ws_sensors
pressure – zmierzone ciśnienie
altitude – obliczona wysokość n.p.m. na podstawie ciśnienia (zgodnie z domyślnymi danymi czujnika)
sea_level – rzeczywista wysokość n.p.m. na której jest zamontowany czujnika
Zdaje się mi, że baza danych w takiej formie jest odpowiednia gdyby nawet zaszła w przyszłości potrzeba rozbudowy bazy o dodatkowe tabele. W przyszłości może dojść tabela ws_wind do zapisywania danych z anemometru, ale najpierw trzeba zbudować i wysterować anemometr (lub zdobyć jakiegoś gotowca, który będzie się nadawał do projektu) oraz może tabela ws_rainfall, która będzie służyła do przechowywania pomiarów opadu deszczu. Opisane powyżej tabele póki co wystarczą w mojej stacji meteo. Brakuje mi anemometru i po uruchomieniu stacji będę się starał jakoś temu zaradzić.
Dla zainteresowanych poniżej eksport struktury bazy. Owner to jak widać weather więc takiego użytkownika należy utworzyć albo zmienić na własnego:
-- -- PostgreSQL database dump -- SET statement_timeout = 0; SET client_encoding = 'UTF8'; SET standard_conforming_strings = on; SET check_function_bodies = false; SET client_min_messages = warning; SET search_path = public, pg_catalog; -- -- Name: ws_humidity_id_seq; Type: SEQUENCE; Schema: public; Owner: weather -- CREATE SEQUENCE ws_humidity_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; ALTER TABLE public.ws_humidity_id_seq OWNER TO weather; SET default_tablespace = ''; SET default_with_oids = false; -- -- Name: ws_humidity; Type: TABLE; Schema: public; Owner: weather; Tablespace: -- CREATE TABLE ws_humidity ( id bigint DEFAULT nextval('ws_humidity_id_seq'::regclass) NOT NULL, date_insert timestamp without time zone NOT NULL, sensor_id bigint NOT NULL, humidity numeric(3,2) NOT NULL, temperature numeric(3,2) NOT NULL, heat_index numeric(3,2) NOT NULL, dew_point numeric(3,2) NOT NULL ); ALTER TABLE public.ws_humidity OWNER TO weather; -- -- Name: ws_pressure_id_seq; Type: SEQUENCE; Schema: public; Owner: weather -- CREATE SEQUENCE ws_pressure_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; ALTER TABLE public.ws_pressure_id_seq OWNER TO weather; -- -- Name: ws_pressure; Type: TABLE; Schema: public; Owner: weather; Tablespace: -- CREATE TABLE ws_pressure ( id bigint DEFAULT nextval('ws_pressure_id_seq'::regclass) NOT NULL, date_insert timestamp without time zone NOT NULL, sensor_id bigint NOT NULL, pressure numeric(4,2) NOT NULL, altitude numeric(4,2) NOT NULL, sea_level numeric(4,2) NOT NULL ); ALTER TABLE public.ws_pressure OWNER TO weather; -- -- Name: ws_readings_id_seq; Type: SEQUENCE; Schema: public; Owner: weather -- CREATE SEQUENCE ws_readings_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; ALTER TABLE public.ws_readings_id_seq OWNER TO weather; -- -- Name: ws_sensors_id_seq; Type: SEQUENCE; Schema: public; Owner: weather -- CREATE SEQUENCE ws_sensors_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; ALTER TABLE public.ws_sensors_id_seq OWNER TO weather; -- -- Name: ws_sensors; Type: TABLE; Schema: public; Owner: weather; Tablespace: -- CREATE TABLE ws_sensors ( id bigint DEFAULT nextval('ws_sensors_id_seq'::regclass) NOT NULL, date_insert timestamp without time zone DEFAULT now() NOT NULL, date_modify timestamp without time zone, sensor_name text NOT NULL, sensor_description text ); ALTER TABLE public.ws_sensors OWNER TO weather; -- -- Name: TABLE ws_sensors; Type: COMMENT; Schema: public; Owner: weather -- COMMENT ON TABLE ws_sensors IS 'table for sensor names'; -- -- Name: ws_temperature_id_seq; Type: SEQUENCE; Schema: public; Owner: weather -- CREATE SEQUENCE ws_temperature_id_seq START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; ALTER TABLE public.ws_temperature_id_seq OWNER TO weather; -- -- Name: ws_temperature; Type: TABLE; Schema: public; Owner: weather; Tablespace: -- CREATE TABLE ws_temperature ( id bigint DEFAULT nextval('ws_temperature_id_seq'::regclass) NOT NULL, date_insert timestamp without time zone NOT NULL, sensor_id bigint NOT NULL, temperature numeric(3,2) NOT NULL ); ALTER TABLE public.ws_temperature OWNER TO weather; -- -- Name: ws_humidity_pkey; Type: CONSTRAINT; Schema: public; Owner: weather; Tablespace: -- ALTER TABLE ONLY ws_humidity ADD CONSTRAINT ws_humidity_pkey PRIMARY KEY (id); -- -- Name: ws_pressure_pkey; Type: CONSTRAINT; Schema: public; Owner: weather; Tablespace: -- ALTER TABLE ONLY ws_pressure ADD CONSTRAINT ws_pressure_pkey PRIMARY KEY (id); -- -- Name: ws_sensors_pkey; Type: CONSTRAINT; Schema: public; Owner: weather; Tablespace: -- ALTER TABLE ONLY ws_sensors ADD CONSTRAINT ws_sensors_pkey PRIMARY KEY (id); -- -- Name: ws_temperature_pkey; Type: CONSTRAINT; Schema: public; Owner: weather; Tablespace: -- ALTER TABLE ONLY ws_temperature ADD CONSTRAINT ws_temperature_pkey PRIMARY KEY (id); -- -- Name: ws_humidity_sensor_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: weather -- ALTER TABLE ONLY ws_humidity ADD CONSTRAINT ws_humidity_sensor_id_fkey FOREIGN KEY (sensor_id) REFERENCES ws_sensors(id); -- -- Name: ws_pressure_sensor_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: weather -- ALTER TABLE ONLY ws_pressure ADD CONSTRAINT ws_pressure_sensor_id_fkey FOREIGN KEY (sensor_id) REFERENCES ws_sensors(id); -- -- Name: ws_temperature_sensor_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: weather -- ALTER TABLE ONLY ws_temperature ADD CONSTRAINT ws_temperature_sensor_id_fkey FOREIGN KEY (sensor_id) REFERENCES ws_sensors(id); -- -- Name: public; Type: ACL; Schema: -; Owner: postgres -- REVOKE ALL ON SCHEMA public FROM PUBLIC; REVOKE ALL ON SCHEMA public FROM postgres; GRANT ALL ON SCHEMA public TO postgres; GRANT ALL ON SCHEMA public TO PUBLIC; -- -- PostgreSQL database dump complete --
wilk 27 listopada, 2015
Posted In: Meteo station v2.0
Tagi: arduino, baza, danych, database, meteo, pogody, postgresql, stacja, station