Vermietungsdatenbank

Kampfgummibaerlie

Datenbank-Guru
Beiträge
728
Ich nutze OpenOffice Base von Apache, und würde gerne eine Datenbank erstellen, wo ich relativ weit bin, jedoch an einem Punkt zurzeit seit einer Woche oder so hänge, und keinen Tipp im Internet finde.

Meine Datenbank:
Ich habe eine Tabelle Öffnungszeiten
Ich habe eine Tabelle Maschinen
Ich habe eine Tabelle Uhrzeiten
Ich habe eine Tabelle Wochentage
Ich habe eine Tabelle Vermietungen
Abfrage, damit die Uhrzeiten angezeigt werden, die für den entsprechenden Wochentag gelten.

Mein Wissen:
Ich habe mir mein gesamtes Wissen über SQL aus dem Internet mittels Videos oder Foren herausgesucht, doch für diesen Schritt finde ich keinen Weg, wie ich (wie auch immer), definieren kann, dass die eine Maschine zu einem Datum zwar 2 mal vorkommen kann, jedoch nur, falls das Feld "Zeit bis" in der Tabelle Vermietungen ausgefüllt ist.

Ich weiß, wie man Uniques einsetzt, ich weiß, wie man Joins einsetzt, ich weiß, wie man Constraints ensetzt, aber komme nicht hinter die Frage:

Wie kann ich machen, dass eine Maschine zu einem Datum nur ein 2. mal vorkommen kann, wo im vorigen Eintrag von Maschine und Datum die "Zeit bis" eingetragen ist.
 
Werbung:
Wenn ich Dich richtig verstehe, suchst Du ein EXCLUSUIN CONSTRAINT, der verhindert, daß sich überlappende Verleih-Zeiträume für eine Maschine überlappen. Entweder, das Ende-Datum ist offen, dann soll da quasi 'bis in alle Ewigkeit' interpretiert werden (solange es halt kein Ende-Datum gibt), oder aber die Zeiträume stehen fest und dürfen sich (bei ein und derselben Maschine) nicht überlappen.

Zuerst die gute Nachricht: dafür gibt es exclusion constraints, Demo:

Code:
test=# create table verleih (maschine text, von_bis daterange, exclude using gist (maschine with =, von_bis with &&));
CREATE TABLE
test=*# insert into verleih values ('maschine1', '[2017-03-01,2017-03-10)');
INSERT 0 1
test=*# insert into verleih values ('maschine1', '[2017-03-10,2017-03-20)');
INSERT 0 1
test=*# insert into verleih values ('maschine2', '[2017-03-01,)');
INSERT 0 1
test=*# insert into verleih values ('maschine2', '[2017-03-10,2017-03-20)');
FEHLER:  kollidierender Schlüsselwert verletzt Exclusion-Constraint »verleih_maschine_von_bis_excl«
DETAIL:  Schlüssel (maschine, von_bis)=(maschine2, [2017-03-10,2017-03-20)) kollidiert mit vorhandenem Schlüssel (maschine, von_bis)=(maschine2, [2017-03-01,)).
test=*# insert into verleih values ('maschine1', '[2017-03-15,2017-03-25)');
FEHLER:  kollidierender Schlüsselwert verletzt Exclusion-Constraint »verleih_maschine_von_bis_excl«
DETAIL:  Schlüssel (maschine, von_bis)=(maschine1, [2017-03-15,2017-03-25)) kollidiert mit vorhandenem Schlüssel (maschine, von_bis)=(maschine1, [2017-03-10,2017-03-20)).
test=*#

Der erste Fehler kommt, weil maschine2 vorher ohne End-Datum verliehen wurde, der zweite Fehler, weil maschine 1 zwischen dem 15. und dem 20. doppelt verliehen würde.


Und nun die schlechte Nachricht (für Dich): das kann nur PostgreSQL.
 
Danke für die Ratschläge, bin nur im Laufe bisher daraufgekommen, dass man so absurd viele Abfragen erstellen kann, dass eben eine solche "falsche" Eingabe, die ich eindeutig machen möchte, möglich wäre.

Zum Beispiel:
Ich erstelle mir eine Tabelle "Uhrzeiten" und eine mit "Wochentagen" mit 00:00 bis 23:55 und Montag bis Sonntag, filtere aus denen mittels einer Ansicht die entsprechenden Uhrzeiten an den Wochentagen
In einer Abfrage filtere ich heraus, welcher Wochentag aus dem eingegebenem Datum springen würde.

(DAYOFWEEK:)Datum), und die Tabelle Wochentage ist so aufgestellt, dass die Woche mit Sonntag anfängt, und mit Samstag (1-7) aufhört.

Im Formular (wovon ich relativ wenig weiß, ich glaube, ich scheitere daran), nur die "von" Uhrzeiten wählen kann, die mindestens die Zeit der Öffnungszeit entspricht.

WHERE (UHRZEIT >= ÖFFNUNGSZEIT)

Aber zurück zu meiner Frage:
Wäre DAS an und fürsich möglich? Oder arbeite ich hier in die falsche Richtung, weils eh nix wird.

Anhang:
Ja, ich habe zuviel/soviel Zeit für sowas.
 
Sorry, ich kann Dir nicht ganz folgen, was wohl daran liegt, daß ich "OpenOffice Base von Apache" weder kenne noch nutze.
 
Falls ich erklären darf:
Apache OpenOffice ist, wie der Name schon sagt, eine Art gratis "MS Office", es hat ein Tabellenprogramm, ein Textbearbeitungsprogramm, eine Datenbank (die ich hier meine), und so weiter dabei.

Die Datenbank wird in SQL geschrieben, und ist auch durch "Extansions" erweiterbar, und ich habe mir ein PostgreSQL-Dings runtergeladen und eingerichtet, weiß aber nicht einmal, wie ich probieren kann, ob das PostgreSQL-Dings auch wirklich funktioniert.

Wie wärs, wenn wir mal in ein Gespräch gehen, und du mir zB eine Art "Hello World" ansagen könntest, ob ich PostgreSQL verwenden kann? :/
 
PostgreSQL ist was anderes als z.B. ein gratis "MS Office", das ist eine Server-Datenbank. Ganz andere Liga. Verwenden kannst Du es, ist OpenSource und steht unter der freiesten Lizenz überhaupt: BSD. Ich kenne Installationen im 3-stelligen TB-Bereich von Daten. Aber vermutlich bist Du a) damit hoffnungslos überfordert und b) wäre das für Dich auch etliche Nummern zu groß.
 
Ich google mal eben, bin immerhin noch jung ^^
Vielleicht dauert es länger, bis ich die einzelnen Argumente und so weiter wirklich verstehe, aber wie heißts so schön:
Lieber mit 70 sagen, dass man es probiert hat.

Bin atm am Googeln nach "BSD" ;)
 
Werbung:
Zurück
Oben