Ankündigung

Einklappen
Keine Ankündigung bisher.

ReservierungsDB

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • ReservierungsDB

    Hi,
    ich möchte für unseren Verein eine Reservierungsdatenbank einrichten. Wir haben eine Kartbahnhalle und da sollen die Trainingszeiten verwaltet werden.
    Der Admin soll die Möglichkeit haben, die Zeit für jeden Tag selber festzulegen.
    Beispiel: Montag: 09:00, 10:00, 11:00, 15:00, 16:00, 17:00, 20:00 (Jeweils immer 1 Stunde).

    Macht folgendes Sinn?
    1 Tabelle:
    id, tag, uhrzeit, name

    Im Frontend biete ich eine Selectbox mit den freien Zeiten an. (Select uhrzeit from kartbahn where name = "")
    Wenn die Zeit belegt ist, wird der Name per Update eingetragen und bei dem nächsten Aufruf ist die Zeit dann nicht mehr in der Auswahl.

    Oder gibt es noch eine bessere Herangehensweise?


  • #2
    Was mir spontan so dazu einfällt...
    Tag und Stunde in zwei Feldern verkompliziert nur unnötig die Abfragen., nimm ein Feld vom Typ DATETIME. Und gönne dir ruhig noch ein Feld für das Trainingsende, auch wenn die Zeitdauer jetzt noch fix 1 Stunde ist.
    Wenn du für Name eine kundenID nimmst, kannst du später leichter in einer Kundentabelle z.B. Adresse und Telefonnummer pflegen.
    PHP-Klassen auf github

    Kommentar


    • #3
      Zitat von jspit Beitrag anzeigen
      Was mir spontan so dazu einfällt...
      Tag und Stunde in zwei Feldern verkompliziert nur unnötig die Abfragen., nimm ein Feld vom Typ DATETIME. Und gönne dir ruhig noch ein Feld für das Trainingsende, auch wenn die Zeitdauer jetzt noch fix 1 Stunde ist.
      Wenn du für Name eine kundenID nimmst, kannst du später leichter in einer Kundentabelle z.B. Adresse und Telefonnummer pflegen.
      Genau. Und wenn er TSRANGE für die Buchungsdauer und einen EXCLUSION CONSTRAINT darauf verwendet kann die Bude nicht doppelt verbucht werden.
      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

      Kommentar


      • #4
        Wie ist das grundsätzlich?
        Ich werfe jetzt einfach mal eine Aussage in den Raum:
        Die Datenbank sollte dumm bleiben. Das die Bude nicht doppelt belegt wird, ist Sache der Software.

        Bekomme ich von der Postgresql eine Rückmeldung, dass ein Fehler vorliegt? Kann ich den dann in PHP verarbeiten?

        @jspit
        Welche Vorteile bringt mir das Trainingsende?
        Ich sehe hier noch keinen Verwendungszweck (Soweit bin ich noch gar nicht).

        Kommentar


        • #5
          Zitat von kaptainIglo Beitrag anzeigen
          Wie ist das grundsätzlich?
          Ich werfe jetzt einfach mal eine Aussage in den Raum:
          Die Datenbank sollte dumm bleiben. Das die Bude nicht doppelt belegt wird, ist Sache der Software.
          Demo:

          Code:
          test=# create table kartbahn (buchungs_id int primary key, gast int, dauer tsrange, exclude using gist(dauer with &&));
          CREATE TABLE
          Time: 30,185 ms
          test=*# insert into kartbahn values (1, 1, '[2014-11-28 10:00:00,2014-11-28 13:00:00)');
          INSERT 0 1
          Time: 0,614 ms
          test=*# insert into kartbahn values (2, 5, '[2014-11-28 13:00:00,2014-11-28 17:00:00)');
          INSERT 0 1
          Time: 0,234 ms
          test=*# insert into kartbahn values (3, 4, '[2014-11-28 16:00:00,2014-11-28 20:00:00)');
          ERROR:  conflicting key value violates exclusion constraint "kartbahn_dauer_excl"
          DETAIL:  Key (dauer)=(["2014-11-28 16:00:00","2014-11-28 20:00:00")) conflicts with existing key (dauer)=(["2014-11-28 13:00:00","2014-11-28 17:00:00")).
          Time: 0,613 ms
          test=*#
          Die DB ist also hier nicht dumm und erkennt die doppelte Buchung. Aber wenn Du eine dumme DB willst bist Du mit MySQLnatürlich bestens bedient.
          PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

          Kommentar


          • #6
            Zitat von kaptainIglo Beitrag anzeigen
            Wie ist das grundsätzlich?
            Um die Frage noch mal allgemein zu beantworten: das ist quasi wie ein UNIQUE CONSTRAINT, nur daß hier nicht auf feste Werte, sondern auf Bereiche geprüft wird. So ein Exclusion Constraint kann über mehrere Felder gehen, wobei für jedes Feld unterschiedliche Conditions gelten können. Beispiel Hotel mit X Zimmern. Ein passender Constraint wäre da z.B.

            (zimmer_id with =, belegt with &&)

            Also, Zimmer_ID ist halt das konkrete Zimmer, das muß gleich sein, BELEGT der Belegungszeitraum, hier als Datentyp TSRANGE. = prüft auf Gleichheit, kennt man. && prüft auf Überlappung.

            RANGE-Typen haben 4 Eigenschaften: von und bis sowie ob die Grenzen inklusive oder exklusive sind, dazu dient [ und ( sowie ) und ]. Rest siehe mein Beispiel.
            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

            Kommentar


            • #7
              Willkommen bi PG. MySQL ist dessen (noch) nicht mächtig.
              GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

              Kommentar


              • #8
                Zitat von akretschmer Beitrag anzeigen
                Die DB ist also hier nicht dumm und erkennt die doppelte Buchung. Aber wenn Du eine dumme DB willst bist Du mit MySQL natürlich bestens bedient.
                Bei dem Versuch, einen Insert zu fahren (auf PHP-Ebene), würde vermutlich eine Exception geworfen? Kann ich dann zuordnen warum die geworfen wurde.
                Beispiel: Fehlerhafte Daten (25:00) oder weil eben eine doppelte Buchung vorliegt?

                Das mit dem Range scheint ne coole Sache zu sein.

                Kommentar


                • #9
                  Zitat von kaptainIglo Beitrag anzeigen
                  Bei dem Versuch, einen Insert zu fahren (auf PHP-Ebene), würde vermutlich eine Exception geworfen? Kann ich dann zuordnen warum die geworfen wurde.
                  Beispiel: Fehlerhafte Daten (25:00) oder weil eben eine doppelte Buchung vorliegt?
                  Ja, die Fehlermeldung bekommst Du in PHP mit den üblichen Funktionen angezeigt.

                  Das mit dem Range scheint ne coole Sache zu sein.

                  Ist es!
                  PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                  Kommentar


                  • #10
                    Mit PDO:
                    PHP-Code:
                    $pdo->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION); 
                    Standards - Best Practices - AwesomePHP - Guideline für WebApps

                    Kommentar

                    Lädt...
                    X