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