Grundsatzfragen zur Erstellung einer Datenbank (SQlite)

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Holly146
Beiträge: 5
Registriert: Sa 28. Nov 2020, 15:07

Grundsatzfragen zur Erstellung einer Datenbank (SQlite)

Beitrag von Holly146 »

Hallo,

ich beschäftige mich zum ersten Mal mit SQL und habe dazu ein paar grundsätzliche Fragen.

Ich habe zuhause einige Temperatursensoren und über die letzten Jahre davon ausgelesene Werte in unzähligen Dateien gespeichert. Ich möchte nun ein Programm schreiben um diese zusammenzufassen und die Wert dann aufbereitet ausgeben. Ich dachte SQL wäre dazu gut geeignet und habe mit SQLite auch schon etwas experimientiert. Ich habe erfolgreich eine Datenbank und auch Tabellen mit Werten anlagen können.

Ich frage mich aber, nach welchen System oder welcher Struktur ich die Daten in die Datenbank schreiben soll. Mein Gedanke war, dies ähnlich wie ich es auf der Festplatte machen würde also etwa so

Code: Alles auswählen

Daten
    2020
         2020.01.01
            Aussen
            Innen
         2020.01.02
           Aussen
           Innen
    2019
        2019.12.30
            Aussen
            Innen
        2019.12.31
           Aussen
           Innen
Mir create table kann ich doch aber immer nur auf oberster Ebene eine Tabelle erstellen und diese nicht verschachteln oder ?
Oder ist mein Gedanke komplett falsch und man schreibt jeden einzelnen Tag mit create table auf oberste Ebene und füllt diesen dann mit seinen Werten. Das erscheint mir so unübersichtlich, dann mehrere Tausend Einträge dort zu haben.

Wie würdet ihr das angehen ? Ich habe leider kein Tutorial gefunden, wo derartige Grundlagen beschrieben werden.

Gruss

Holly

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Grundsatzfragen zur Erstellung einer Datenbank (SQlite)

Beitrag von theo »

Ich verstehe nicht ganz.
Was willst du da verschachteln?
Du hast eine Tabelle mit
Datum | Temp Innen | Temp Aussen
Das reicht und da muss man auch nicht komplizierter denken.
"übersichtlich" kannst du es bei der Abfrage machen.

Holly146
Beiträge: 5
Registriert: Sa 28. Nov 2020, 15:07

Re: Grundsatzfragen zur Erstellung einer Datenbank (SQlite)

Beitrag von Holly146 »

Mein Gedanke war: Ich erstelle eine Tabelle Daten, darin dann wiederum je eine Tabelle mit der Jahreszahl und in dieser erstelle ich Spalten mit den Tagen des Jahres wofür ich Werte habe, und schreibe die Werte dann in die jeweilige Spalte. Also wie eine Verzeichnisstruktur auf der Festplatte. Dort habe ich das Verzeichis Temperaturdaten, darin Unterverzeichnisse 2020,2019,2018 usw. und in denen dann die Dateien mit den eigentlichen Werten. Das ist wahrscheinlich der falsche Weg oder ?

Du meinst ich sollte einfach für jeden Tag mit Create Table eine Tabelle erstellen, und darin dann Spalten für Datum/Aussen/Innen, also so ?

Code: Alles auswählen

Tabellen	Spalten
		Werte
2020.01.01  --> Datum		Aussen	Innen
		01.01.2020	10	22
2020.01.02  --> Datum		Aussen	Innen
		02.01.2020	7	21
2019.12.30  --> Datum		Aussen	Innen
		30.12.2020	8	22
.
.
.
.
2018.06.28  --> Datum		Aussen	Innen
		28.06.2018	21	22
.
.
.
.
Dies erschien mir unübersichtlich wenn ich mir z.B. mir DB Browser for SQlite die Datenbank anschauen würde, weil ich dort ja mehrere Tausend Einträge (365/Jahr) unsortiert vorfinden würde. Auch das Auswerten hatte ich mir einfacher vorgestellt, wenn die Daten so zu sagen vorsortiert nach Jahren wären. Wahrscheinlich denke ich viel zu kompliziert, weil ich noch nie etwas mit Datenbanken gemacht habe.

Ich hoffe ich habe es nun verständlich erklärt.

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: Grundsatzfragen zur Erstellung einer Datenbank (SQlite)

Beitrag von Sieben »

Viel zu kompliziert. Du erstellst, wie Theo schon schrob, eine einzige Tabelle mit

Datum | Temp Innen | Temp Aussen

und da kommen alle Daten rein. Alles weitere erledigst du mit SQL-Abfragen der Datenbank. So kannst du dir problemlos zB die Temperaturwerte eines Jahres, Monats, einer Woche, etc in beliebigen Sortierungen anzeigen lassen. Oder zB alle Temperaturen aller 13. eines Monats über den gesamten Zeitraum. Ebenso die Mittelwerte für beliebige Zeiträume. Du kannst dir von der Datenbank sogar zB Mittelwerte der Innen- und Aussentemperaturen geben lassen, wenn du das möchtest. Oder die Summe aller Temperaturen eines bestimmten Zeitraums. Das ist zwar wenig sinnvoll, zeigt aber, was so alles möglich ist. Wohlgemerkt alles nur mit SQL und der Datenbank, ohne weiteren eigenen Code. Datenbanken sind wesentlich flexibler als eine starre Verzeichnisstruktur.

Holly146
Beiträge: 5
Registriert: Sa 28. Nov 2020, 15:07

Re: Grundsatzfragen zur Erstellung einer Datenbank (SQlite)

Beitrag von Holly146 »

ok also so:

Code: Alles auswählen

Tabelle
		Spalten
		Werte


Daten
		Datum		Aussen	Innen
		01.01.2020	10	22
		02.01.2020	7	21
		30.12.2020	8	22
.
.
.
.
		28.06.2018	21	22
.
.
.
.
und ich muss dann mit select experimentieren und darüber dann alle Werte eines Monats auslesen um diese dann z.B. in einem Balkendiagramm anzeigen zu können ?

Holly146
Beiträge: 5
Registriert: Sa 28. Nov 2020, 15:07

Re: Grundsatzfragen zur Erstellung einer Datenbank (SQlite)

Beitrag von Holly146 »

@Sieben
Das klingt gut. Kennst du ein Tutorial o.ä., Anfängerfreundlich, wo ich ein paar Beispiele zu dem was du schreibst finde.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Grundsatzfragen zur Erstellung einer Datenbank (SQlite)

Beitrag von theo »

Holly146 hat geschrieben:
Sa 28. Nov 2020, 16:59
und ich muss dann mit select experimentieren und darüber dann alle Werte eines Monats auslesen um diese dann z.B. in einem Balkendiagramm anzeigen zu können ?
Ja, so ist das gedacht. Ob du dafür "experimentieren" musst, überlasse ich dir. :wink:

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: Grundsatzfragen zur Erstellung einer Datenbank (SQlite)

Beitrag von Sieben »

Ich finde die Einführung von af0815 recht gelungen, er hat sie in seiner Signatur verlinkt oder auch:

https://sourceforge.net/projects/lazsni ... fos%20SVN/

und dort die pdf-Datei holen. Unter 3) findest du eine kompakte Einführung.

Holly146
Beiträge: 5
Registriert: Sa 28. Nov 2020, 15:07

Re: Grundsatzfragen zur Erstellung einer Datenbank (SQlite)

Beitrag von Holly146 »

Vielen Dank euch beiden, das hilft mir schon deutlich weiter. :D

@theo
experimentieren muss ich sicherlich, da ich das zum ersten Mal mache. :lol:

@Sieben
Danke für den Link, habs gefunden und werde darin stöbern. :)

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: Grundsatzfragen zur Erstellung einer Datenbank (SQlite)

Beitrag von af0815 »

Ich würde es noch radikaler machen.

Datum, Lokation als Zahl, Temperatur.

Lokation 1=aussen 2=innen. Wenn dann Sensoren dazukommen ist für die Tabelle egal. Die Tabelle ist eine sogenannte Buchungstabelle. Die Lokation kann man in einer Stammtabelle definieren. Dort hat man dann für jeden Zahlenwert eine Beschreibung für den Ort und vielleicht mehr.
Für Fortgeschrittene, die beiden Tabellen kann man per Join in einer Sicht oder Select zusammenfügen. Wenn man Auswertet immer zuerst die Auswertung, dann die joins um das Ergebnis lesbarer zu machen. Sonst gibt es AHA Effekte, wenn die Daten mehr werden. Bei zig 100.000 Einträgen kann man das spüren.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

BerlinerBaer
Beiträge: 16
Registriert: Sa 9. Jan 2021, 15:07
OS, Lazarus, FPC: Windows (L 2.0.10 FPC 3.2.0)
CPU-Target: 32/64Bit

Re: Grundsatzfragen zur Erstellung einer Datenbank (SQlite)

Beitrag von BerlinerBaer »

Code: Alles auswählen

CREATE TABLE "wetterdaten" (
	"id"	INTEGER NOT NULL,
	"Datum"	NUMERIC,
	"temp_aussen"	REAL,
	"temp_innen"	REAL,
	PRIMARY KEY("id" AUTOINCREMENT)
);
So könnte deine Datenbank aussehen.

Um das Datum im Format "2021-01-12 17:52:00.000" korrekt abzuspeichern, sollte es als NUMERIC deklariert sein. REAL sind FLOAT, also Fließkommazahlen. Und der Index sollte, da es kein zusammengesetzter Index ist, ein Integer sein.

Mit welcher Programmiersprache arbeitest du noch?
Die deutsche Rechtschreibung ist Freeware. Man darf sie kostenlos nutzen. Allerdings ist sie nicht Open Source. Das heißt, sie darf weder verändert, noch in veränderter Form veröffentlicht werden.

Antworten