• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Frage zur Datenbankmodellierung: Buchungssystem

SH_KennY

New member
liebe community,

ich wende mich mal wieder mit einem hilferuf an euch und hoffe, dass ihr mir einmal mehr eine kleine hilfestellung bieten könnt:

mein plan ist es, ein buchungssystem für einen bootsverleih aufzusetzen.
das ganze soll via mysql datenbank umgesetzt werden.

folgendes szenario:

es gibt verschiedene bootstypen, sagen wir:
- tretboote
- ruderboote
- segelboote

von jedem bootstyp gibt es eine unterschiedliche anzahl an vorhandenen booten im bootsverleih, sagen wir:
- tretboote (10)
- ruderboote (7)
- segelboote (5)

die boote sollen an festzusetzenden tagen in einem bestimmten zeitraum buchbar sein, sagen wir:
- montag bis sonntag: 10 - 18 uhr.

soweit, so gut.
und hier kommt mein problem, bzw meine frage:
es wäre ja einfach, wenn ein boot einfach für den ganzen tag ausgeliehen würde und dann in der datenbank somit für den ganzen tag belegt ist.
das ist natürlich nicht das ziel, sondern die boote sollen in folgenden perioden buchbar sein:
- 1 stunde
- 4 stunden
- 1 tag

und da scheiterts bei mir mit der datenbankmoddelierung. ich habe aktuell keine idee, wie ich das zuletzt genannte problem umsetzen soll.

ich würde mich freuen, wenn mir jemand von euch vielleicht einen denkansatz geben könnte.

tausen dank schon im voraus :)
 
1. falsches Forum -> verschoben...
2. zu deinem Problem:

ich würde erst einmal eine Tabelle machen, in der die Boote gespeichert sind - also im Grunde genommen nur zwei Spalten: ID und Bootstyp
Dann eine Buchungstabelle mit fünf Spalten: ID, bootsID, Datum, vonStunde, bisStunde

Mit den geigneten JOINs sollte man dann die Abfragen für das Buchungssystem hinbekommen...
 
2. zu deinem Problem:

ich würde erst einmal eine Tabelle machen, in der die Boote gespeichert sind - also im Grunde genommen nur zwei Spalten: ID und Bootstyp
Dann eine Buchungstabelle mit fünf Spalten: ID, bootsID, Datum, vonStunde, bisStunde

Mit den geigneten JOINs sollte man dann die Abfragen für das Buchungssystem hinbekommen...

Hallo,

arbeite mit SH_KennY an dem Projekt allerdings hat er nur einen Teil der Anfroderungen beschrieben.
Die oben festgelegten Mo-So 10-18h Buchungszeitraum für die Boote sind nicht zu 100% festgelegt. Wie sollen diese "restriktiven" Termine dann in der DB abgelegt werden, wenn nötig sogar je Bootstyp.

Und zu deiner Beschreibung der DB: wie kriege ich dann noch die freien Termine raus? Muss dann mittels PHP (ist festgelegt) dann errechnet werden, welche Termine / Zeiträume noch frei sind?

Vielen Dank für deine / eure Mithilfe ;)
 
Die Restriktionen müssten auf der Anwendungsseite verwaltet werden (bzw. deren Einhaltung - die Restriktionen selbst kann man natürlich auch in der DB speichern).

Mir fällt jetzt kein DB-Design ein, bei dem man die freien Termine direkt aus der DB auslesen kann.
 
hallo,

ich würde es so aufbauen:
1. Tabelle für die Bootstypen (`boattypes`)
id INT(2) PRIMARY KEY auto_increment
name VARCHAR(30) ; Tretboot, Ruderboot, Jolle, Conger, Katamaran, etc

2. Tabelle für die einzelnen Boote (diese haben meist ja noch eine Nummer, daher würde ich diese auch einzeln verwalten, dann kann man auch feststellen welches boot wie oft verwendet wurde und wenn eins kaputt geht, ein spezielles Boot sperren, etc) (`boats`)
id INT(3) PRIMARY KEY auto_increment
name VARCHAR(20) ; "Anne Marie", "Luzifer", etc oder einfach eine Nummer (Boote in einem Bootsverleih sind ja oft durchnummeriert)
numberOfPersons INT(2) ; wie viele personen dürfen auf ein Boot?
additionalInformations TEXT ; Irgendwelche Anmerkungen... gibts ja immer wieder, dass man etwas zu einem Boot dazuschreiben möchte: "Keine Fock vorhanden", "Ruder defekt. Bitte tauschen", etc

3. Tabelle für Restriktionen (`restricts`)
boats_id ; als foreign key für `boats`.`id`
startDateTime DATETIME
endDateTime DATETIME
whitelist TINYINT ; dieses feld gibt an ob es sich um eine Sperrung des Bootes handelt (weil es kaputt ist, bei der Reinigung, etc) oder um eine zusätzliche Freischaltung (Nachtsegeln, Zeitverlängerung, etc)
reason TEXT ; ein Grund weshalb, hilft bei der organisation der Boote

3. Tabelle für die Buchungen der Boote (`bookings`)
boats_id ; als forein key für `boats`.`id`
startDateTime DATETIME
periodInHours INT(2)

Nun sind eigentlich alle Abfragen leicht zu machen:
1) Alle Boote abfragen:
Code:
SELECT `id`, `name`, `additionalInformations` FROM `boats`

2) Welche Boote sind aktuell nicht belegt und wann ist ihre nächste belegung?
Code:
SELECT
  boa.`id`, boa.`name`, MIN(boo.`startDateTime`)
FROM `boats` as boa
INNER JOIN `bookings` as boo ON (boa.`id`==boo.`boats_id`)
WHERE
(
  NOW() < boo.`startDateTime`
OR
  NOW() > DATE_ADD(`startDateTime`, INTERVAL +`periodInHours` HOUR)
)
AND
  NOW() > `startDateTime`
GROUP BY boa.`id`

3) Ist ein Boot aktuell belegt?
Code:
SELECT
  boa.`id`, boa.`name`, boo.`startDateTime`, boo.`periodInHours`
FROM `boats` as boa
INNER JOIN `bookings` as boo ON (boa.`id`==boo.`boats_id`)
WHERE
  NOW() > boo.`startDateTime`
AND
  NOW() < DATE_ADD(`startDateTime`, INTERVAL +`periodInHours` HOUR)
WHERE
  boa.`id` = ?

4) Welche Boote sind in einem bestimmten Zeitraum (von DATUM bis DATUM+STUNDEN) NICHT verfügbar?
Code:
SELECT
  boa.`id`
FROM `boats` as boa
INNER JOIN `bookings` as boo ON (boa.`id`==boo.`boats_id`)
WHERE
(
  DATUM > boo.`startDateTime`
AND
  DATUM < DATE_ADD(boo.`startDateTime`, INTERVAL +`periodInHours` HOUR)
)
OR
  DATE_ADD(DATUM, INTERVAL +STUNDEN HOUR) > boo.`startDateTime`
GROUP BY boa.`id`

5) Kunde möchste von DATUM aus für STUNDEN buchen. welche boote kommen in Frage?
SELECT boa.`id`, boa.`name` WHERE boa.`id` NOT IN ( 4) ) ; 4) natürlich durch die Abfrage aus 4 ersetzten^^ will es nur übersichtlich halten.

Die Restrictions sind ja nur ein weiterer join und ein bisschen logik. Hoffe es hilft ein bisschen.

Lg Kasalop
 
Ah - OK wenn man bei der Ausgabe auf die einzelnen Boot geht, kann man die freien Boote abfragen...
Ich hatte irgendwie immer eine Anfrage vor Augen, die einem komplett ausgibt, wieviele Boote von welchem Typ gerade frei sind.

... aber da fällt mir auf, dass man das über ein COUNT(*) und GROUP BY `boatType` auch herausbekommen kann...

PS: @Kasalop: irgendwie fehlt die Verknüpfung zwischen boattypes und boats...
 
ahh ja sicher^^ Bitte selbstständig fixen. Da ein Boot immer nur einen type haben kann ist es eine 1:n und damit einfach in der tabelle boats ein weiteres feld:
boattypes_id INT
als foreign key für `boattypes`.`id`

Lg Kasalop
 
Zurück
Oben