Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Datenbankdesign: wiederkehrende [Ereignisse] Aktionen (https://www.delphipraxis.net/178423-datenbankdesign-wiederkehrende-%5Bereignisse%5D-aktionen.html)

Klaus01 7. Jan 2014 16:28

Datenbank: PostgreSQL • Version: 8.0 • Zugriff über: UniDac

Datenbankdesign: wiederkehrende [Ereignisse] Aktionen
 
Hallo,

in einer Tabelle habe ich mehrere Geräte eingetragen.

Diese Geräte sollen Wochentags (Mo - Fr) zu einem bestimmten Zeitpunkt (5 Minuten Raster) ein- und ausgeschaltet werden.

z.B. Mo-Fr: Einschalten: 08:00 Ausschalten: 17:30

Während des Wochenendes sollen die Geräte zu anderen Zeitpunkten geschaltet werden - oder komplett ausgeschaltet bleiben.

Wie würdet Ihr das Datenbankdesign anlegen?

Der Gerätetabelle noch zusätzliche Spalten spendieren
z.B:
Wochetags_einschalten
Wochetags_ausschalten
Wochenende_einschalten
Wochenende_ausschalten

Oder eine seperate Tabelle mit den Zeitdaten und Verweis auf die GeräteID?

Oder gibt es noch einen anderen Ansatz?

Ich stehe etwas ratlos da.


Grüße
Klaus

haentschman 7. Jan 2014 16:35

AW: Datenbankdesign: wiederkehrende Ereignis
 
Moin...8-)
definitiv:
Zitat:

Oder eine seperate Tabelle mit den Zeitdaten und Verweis auf die GeräteID?
:thumb:

BUG 7. Jan 2014 17:20

AW: Datenbankdesign: wiederkehrende Ereignisse
 
Um das Ganze relativ flexibel zu machen, könnte die zusätzliche Tabelle so aussehen:
Zwei Zeitstempel geben dann jeweils einen Zeitpunkt relativ zu 0:00 des Tages an (von .. bis). Jedes Gerät, für das es einen Tabelleneintrag gibt, der den aktuellen Zeitpunkt einschließt, wird zu dieser Zeit aktiviert. Zusätzlich hast du eine Maske*, welche bestimmt, für welche Tage die Regel bestimmt ist.
Das entscheidende Detail bei diesem Ansatz ist: Jedes Gerät kann mehrere Regeln besitzen, die an unterschiedlichen Tagen das Gerät anschalten.

* z.B. ein Bitfeld oder einzelne boolesche Spalten; entweder für Werktags/Wochenende oder Mo..So.
Mich würde es nicht wundern, wenn irgendwann kurzfristig der Bedarf besteht, einzelne Wochentage voneinander zu unterscheiden. In der Datenbank und der Logik könnte man das schon anlegen.

p80286 7. Jan 2014 17:47

AW: Datenbankdesign: wiederkehrende Ereignisse
 
Ich würde es so machen:
  • ID
  • Gerät_ID
  • AktionsTyp (an/aus)
  • AktionsZeitpunkt

Da bist Du ganz frei in der Definition der Zeitspanne. Für Ein/Aus brauchst Du zwar 2 Datensätze aber Ein und Ausschalten sind ja auch zwei Aktionen.

Gruß
K-H

Der schöne Günther 7. Jan 2014 17:59

AW: Datenbankdesign: wiederkehrende Ereignisse
 
Handelt es sich jetzt hierbei eigentlich um Regeln oder ganz strikt von extern immer wieder neu vorgegebene Ereignisse?

nahpets 7. Jan 2014 18:45

AW: Datenbankdesign: wiederkehrende Ereignisse
 
Der Versuch eines Ansatzes:
Code:
Gerätetabelle
GeräteID,Name,Bezeichning,...
1,Staubsauger,

WochenTagTabelle
ID,Tag
1,Montag,
2,Dienstag,
...
7,Sonntag


UhrzeitTabelle
ID,WochenPlanID,Uhrzeit
10,1,10:00
...
20,2,15:00
...
30,3,17:00
...
40,4,09:00
...
50,4,08:00
...
60,5,15:00
...
70,6,12:00
...
80,1,11:00
...
90,1,17:15
...


TerminTabelle
ID,GeräteID,WochenTagID,UhrzeitID
1,1,1,10
2,1,2,20
...
9,1,6,70

Staubsauger startet demnach
Montag  10:00
Dienstag 15:00
Samstag 17:15


oder

TerminTabelle
ID,GeräteID,WochenTagID
1,1,1
2,1,2
...
9,1,6


Staubsauger startet zu allen Uhrzeiten, die sich zum Wochentag der Wochentagtabelle
in der Tremintabelle finden lassen.
Sofern (technisch) erforderlich (wie von p80286 angeregt) auch einen Ausschaltzeitpunkt oder eine Dauer für den Betrieb in Minuten, Sekunden... ab der Uhrzeit.
Code:
UhrzeitTabelle
ID,WochenPlanID,Uhrzeit,Dauer
10,1,10:00,00:05:00
...
20,2,15:00,00:15:00
...
90,1,17:15,00:00:05
...
oder
Code:
UhrzeitTabelle
ID,WochenPlanID,Uhrzeit,Typ (1 = ein, 0 = aus)
10,1,10:00,1
11,1,10:05,0
...
20,2,15:00,1
21,2,15:15,0
...
90,1,17:15,1
91,1,18:00,0
...

BUG 7. Jan 2014 18:53

AW: Datenbankdesign: wiederkehrende Ereignisse
 
Zitat:

Zitat von p80286 (Beitrag 1242599)
Für Ein/Aus brauchst Du zwar 2 Datensätze aber Ein und Ausschalten sind ja auch zwei Aktionen.

Das ist auch eine Frage der gewünschten Abstraktionsebene. Ich finde es sinnvoll, die Planung/Regeln in der Datenbank zu speichern und bei Bedarf (oder regelmäßig) eine Ereignisfolge zu generieren, die dann abgearbeitet wird. Wenn man nur eine Ereignisfolge hat, könnte es (bei komplexeren Problemen) dann schwer werden, daraus die Überlegung/Planung zu rekonstruieren, die dazu geführt hat (z.B. um Fehler zu finden oder Pläne zu ändern).

Sir Rufo 7. Jan 2014 19:18

AW: Datenbankdesign: wiederkehrende Ereignisse
 
Das sollte eigentlich reichen. Die Wochentage als ID-Tabelle ist überflüssig :)
Geräte
IDName
1Gerät 1
2Gerät 2
Wochenplan
IDGerät_IDTagUhrzeitOnOffVonBis
11107:00On  
21108:00Off 31.12.2013
31109:00Off01.01.2014 
41212:00On  
51215:00Off  
Terminplan
IDGerät_IDDatumUhrzeitOnOff
1101.01.201407:00On
2103.01.201408:00Off

nahpets 7. Jan 2014 20:04

AW: Datenbankdesign: wiederkehrende Ereignisse
 
Zitat:

Zitat von Sir Rufo (Beitrag 1242609)
Die Wochentage als ID-Tabelle ist überflüssig :)

und worher weißt Du, was für ein Wochentag 1 ist?
Sonntag oder Montag?

Bin es halt seit Jahrzehnten gewohnt für jeden Schlüsselwert (wie es hier der Tag ist) gibt es eine Tabelle, in der man die Bedeutung des Schlüsselwertes nachlesen kann.
Sicher kann man technisch gesehen hier auf diese Tabelle verzichten, ebenso, wie man technisch beim Gerät auf den Namen verzichten könnte. Der Informationsgehalt eines Steuersystemes wird hierdurch aber doch sehr eingeschränkt.
Wenn man mehrere Geräte mit gleichem Typ und oder Name... hat, so könnte man hier anstelle der Namen beim Gerät auch einen Fremdschlüssel auf eine Tabelle verwenden, in der alle Gerätetypen mit ihren Detaildaten enthalten sind.
Die Frage ist halt, wie weit man es mit der Normalisierung der Daten treibt.

Klaus01 7. Jan 2014 20:37

AW: Datenbankdesign: wiederkehrende Ereignisse
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1242600)
Handelt es sich jetzt hierbei eigentlich um Regeln oder ganz strikt von extern immer wieder neu vorgegebene Ereignisse?

.. gut, da ist die Überschrift etwas daneben, richtiger sind es immer wiederkehrende Aktionen.
Die Zeitstempel werden vom Benutzer konfiguriert (per GUI) und in die Datenbank geschrieben.
Ein Service liest die Daten aus der Tabelle und führt dann die Schaltaktion aus.


Zitat:

Zitat von BUG
Um das Ganze relativ flexibel zu machen, könnte die zusätzliche Tabelle so aussehen:
Zwei Zeitstempel geben dann jeweils einen Zeitpunkt relativ zu 0:00 des Tages an (von .. bis). Jedes Gerät, für das es einen Tabelleneintrag gibt, der den aktuellen Zeitpunkt einschließt, wird zu dieser Zeit aktiviert. Zusätzlich hast du eine Maske*, welche bestimmt, für welche Tage die Regel bestimmt ist.
Das entscheidende Detail bei diesem Ansatz ist: Jedes Gerät kann mehrere Regeln besitzen, die an unterschiedlichen Tagen das Gerät anschalten.

Werde ich drüber nachdenken.

Derzeit habe ich nur zwei Wochenteile (Wochentags und Wochenende).
Wenn ich das flexibel halten soll (was ja erstmal nicht schlecht ist) könnten
bei der Erstellung der Datensätze des Wochentags - Tageseinträge von 1 bis 5 erstellt werden.


@Sir Rufo
auf einen Wocheplan (mit Datum) und Terminplan wollte ich eigentlich nicht hinaus.

Es würde dann auf eine Tabelle hinauslaufen wie von p80286 vorgeschlagen.
Auch die von nahpets geht in diese Richtung.

Danke für die rege Beteiligung.

Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz