Bitte um Unterstützung bei Datenbankdesign und Datenverarbeitung

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Judas
Beiträge: 15
Registriert: Mo 26. Mär 2012, 14:36

Bitte um Unterstützung bei Datenbankdesign und Datenverarbeitung

Beitrag von Judas »

Moin, Freunde des strukturierten Programmcodes.

Ich bräuchte einmal etwas Unterstützung für die folgende
Aufgabenstellung:

Gegeben seien mehrere Sensoren, die an verschiedenen geografischen
Standorten aufgestellt sind. Diese Sensoren zeichnen einmal pro
Stunde einen Messdatensatz auf - also 24 Datensätze pro Tag.
Jeder Messdatensatz enthält die folgenden Informationen:

Code: Alles auswählen

Messort                (25 Zeichen),
Datum                  (im Format yyyy-mm-dd hh:mm),
Temperatur             (nn),
Windgeschwindigkeit    (nnn),
rel. Luftfeuchtigkeit  (nnn) 
Wettersituation        (30 Zeichen),
Zusatzinformation      (0-250 Zeichen) .
Die Daten einer Stundenmessung werden in Form einer CSV-Datei
im Sensor selbst gespeichert und einmal in der Woche ausgelesen.

Die ausgelesenen Daten sollen von einem Lazarus-Programm weiter-
verabeitet werden. Dazu werden diese in eine Tabelle 'Messdaten'
mit der oben beschriebenen Struktur überführt.

Bis dahin funktioniert das Ganze auch bereits.

Allerdings habe ich in der Tabelle auch eine große Menge Redundanzen
vorliegen:

1. Beim Messort: Der steht bisher im Volltext in der Tabelle
2. Ebenso die Wettersituation. Diese Umfasst einen Kanon von
um die 30 verschiedenen Textinformationen - also z.B.
Tag - Regen, Tag - bedeckt, Nacht - Schnee, usw.

Gemäß dem relationalen Modell möchte ich diese Informationen in
zwei separate Tabellen auslagern. Also in dieser Form:

Code: Alles auswählen

Tabelle 'Messorte':

ID, Name

Tabelle 'Wetter'

ID, Wettersituation
Für mich stellt sich nun die Frage, auf welche Weise ich nun
den Einlesevorgang und das anschließende Abspeichern am elegantesten
konzipiere:

1. Möglichkeit: ich lese die Daten aus 'Messorte' und 'Wetter' vor
dem eigentlichen Einlesevorgang in eine geeignete Listenstruktur ein,
aus der ich dann anschließend die jeweils entsprechende ID für
den Eintrag in 'Messdaten' erhalte.

2. Ich halte die beiden Tabellen 'Messorte' und 'Wetter' während
des Einlesevorgangs geöffnet und erhalte die ID jedesmal mit mit
der passenden SQLquery.

Ich würde mich über eine Empfehlung dazu aus euren Reihen freuen.
Wohlgemerkt: ich erwarte hier nicht den fertigen Code. Lediglich
ein paar zielführende Sätze, die mich weiterbringen.

Vielen Dank an alle, die bis hierher gelesen haben.
Und viele Grüße.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2641
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Bitte um Unterstützung bei Datenbankdesign und Datenverarbeitung

Beitrag von m.fuchs »

1 und 2.

Die Wetterinfos liest du einmal bei der Verarbeitung ein und hältst sie in einer Liste. Den Ort suchst du jedes Mal neu aus der DB, wenn du eine neue Datei einliest.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Bitte um Unterstützung bei Datenbankdesign und Datenverarbeitung

Beitrag von Sieben »

Du kannst in einem Insert-Statement auch durchaus einen Select verwenden:

Code: Alles auswählen

INSERT INTO Messdaten (OrtID) SELECT ID FROM Messorte WHERE Name = :Name

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6215
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Bitte um Unterstützung bei Datenbankdesign und Datenverarbeitung

Beitrag von af0815 »

Wennst du die ID gleich als IDWetter und IDMessorte bezeichnest wird es später für joins etc viel klarer was da gemeint ist und man macht weniger Fehler.

Die Datenmengen die du einliest sind ja sehr überschaubar. Da kann man es sich leisten die Daten für den Messort und Wettersituation vorweg aus der DB einzulesen und diese Informationen beim Parsen der Importdaten im Code gleich zu ersetzen. Warum bevorzuge ich das so, weil damit beim Parsen mehr Möglichkeit habe Fehler zu erkennen und darauf zu reagieren. Wenn Texte in IDs umgesetzt werden, kann es ja vorkommen, das zum Beispiel die Zeichensätze (warum auch immer) nicht zusammenstimmen und es vielleicht lokalsprachige Änderungen gibt auf die man reagieren/erkennen muss/kann.
So nebenbei, auch Zahlen können mit dem bekannten Punkt oder Komma Problem recht lustig werden und eine Herausforderung darstellen, wenn man nicht damit rechnet.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 845
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Bitte um Unterstützung bei Datenbankdesign und Datenverarbeitung

Beitrag von charlytango »

ich hätte in diesem Fall 4 Tabellen

TMessorte
IDMessorte
Name

TWetter
IDWetter
Wettersituation

TMesswerte
IDMesswert
IDMessorte
IDWetter

TImport
IDImport
IDMessorte
IDWetter
Messort (25 Zeichen),
Datum (im Format yyyy-mm-dd hh:mm),
Temperatur (nn),
Windgeschwindigkeit (nnn),
rel. Luftfeuchtigkeit (nnn)
Wettersituation (30 Zeichen),
Zusatzinformation (0-250 Zeichen)

  • Jeden Messdatensatz (also die 24 Records) würde ich einzeln in TImport einlesen. (24 sind leicht zu überblicken beim Debuggen). geht auch per SQL
  • Danach nach der Empfehlung von @af0815 die importierten Daten (per Lazarus) validieren und ggfs korrigieren.
  • Anschließend neu herein geholte Domaindaten (Messorte, Wetter) in TWetter, TMessorte aktualisieren und anschließend die neu generierten IDs in TImport eintragen,
  • Danach die Timport Datensätze in TMesswerte INSERTen und in TImport die Records löschen.
Reihenfolge je nach Strategie halt unterschiedlich.
Das rumkopieren kannst du mit Lazarus-Code machen oder SQL verwenden. Für das aktuell halten der Domaindaten TMessorte und TWetter gibt es zb bei MariaDB/MySQL INSERT ON DUPLICATE KEY UPDATE das sich um bereits bestehende Daten kümmert.

Antworten