Ankündigung

Einklappen
Keine Ankündigung bisher.

Datenbank in Normalform?

Einklappen

Neue Werbung 2019

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

  • Datenbank in Normalform?

    Guten Abend,

    Ich habe 3 Tabellen:
    Tabelle 1: roomsAndTables:
    id (= Primary Key),
    roomName,
    tableNoName,
    seats

    Tabelle 2: resDetails:
    resId (= Primary Key),
    resDate,
    resTime,
    resName,
    resPersons,
    resPhone

    Tabelle 3: res:
    id (= Primary Key),
    resDetailId (= Foreign Key),
    tableId (= Foreign Key)

    Ist meine Datenbank in der Normalform und wenn nicht, wie normalisiere ich sie; denn: 1 Reservierung kann mehrere Tische haben und 1 Tisch kann mehrere Reservierungen haben (also: M:N-Beziehung).

    Danke im Voraus für die Hilfe und
    mfG APH

    komisch: Kaum macht man`s richtig funktioniert`s a scho.


  • #2
    Soweit nicht schlecht, jedoch solltest Du in Tabelle 2 Datum und Uhrzeit zu einem Datetime zusammenfassen.
    Ich setze voraus, daß immer nur der Beginn der Reservierung notiert wird und das Ende offen bleibt.
    Außerdem halte ich es für klarer, wenn ein und dasselbe Ding auch immer denselben Namen hat. Was in Tabelle 3 "tableid" heißt sollte in Tabelle 1 auch so heißen, sinngemäß das Gleiche für Tabelle 2.

    Kommentar


    • #3
      Zitat von achtelpetit Beitrag anzeigen
      Soweit nicht schlecht, jedoch solltest Du in Tabelle 2 Datum und Uhrzeit zu einem Datetime zusammenfassen.
      Das ist Absicht, da ich es in der Ausgabe getrennt brauche.

      Zitat von achtelpetit Beitrag anzeigen
      Ich setze voraus, daß immer nur der Beginn der Reservierung notiert wird und das Ende offen bleibt.
      Genau so ist es gedacht (zumindest vorerst).

      Zitat von achtelpetit Beitrag anzeigen
      Außerdem halte ich es für klarer, wenn ein und dasselbe Ding auch immer denselben Namen hat. Was in Tabelle 3 "tableid" heißt sollte in Tabelle 1 auch so heißen, sinngemäß das Gleiche für Tabelle 2.
      Das ist mir passiert (d.h. keine Absicht); vielleicht änder ich es noch;


      Und wie kann ich jetzt in einem Rutsch in der Tabelle "res" mehrere Einträge machen, obwohl es in der Tabelle "resDetails" nur 1 Eintrag gibt (weil "1 Person" mehr als 1 Tisch reserviert hat)?

      komisch: Kaum macht man`s richtig funktioniert`s a scho.

      Kommentar


      • #4
        Indem du entsprechend mehrere resDetailId und tableIds einträgst?
        Relax, you're doing fine.
        RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

        Kommentar


        • #5
          Das ist Absicht
          keine gute Absicht, mach Dich mit Datetime vertraut. Beispiel: was passiert, wenn die 1. Reservierung um 23.00 Uhr beginnt und die folgende morgens um 1.00 Uhr?

          Kommentar


          • #6
            Zitat von APH Beitrag anzeigen
            G
            Ist meine Datenbank in der Normalform und wenn nicht, wie normalisiere ich sie; denn: 1 Reservierung kann mehrere Tische haben und 1 Tisch kann mehrere Reservierungen haben (also: M:N-Beziehung).

            Danke im Voraus für die Hilfe und
            mfG APH
            Trennung von Datum und Uhrzeit wurde schon genannt.
            • Reservierung von weniger als in der roomsandtables.seats genanten Sitze?
            • Wann ist das wieder frei?
            • wie verhinderst Du Doppelbuchungen?
            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

            Kommentar


            • #7
              Zitat von achtelpetit Beitrag anzeigen
              [...]
              Beispiel: was passiert, wenn die 1. Reservierung um 23.00 Uhr beginnt und die folgende morgens um 1.00 Uhr?
              Ich verstehe nicht ganz -> was soll da passieren?

              Reservierung von weniger als in der roomsandtables.seats genanten Sitze?
              Es wird ja wenn der komplette Tisch reserviert und nicht die Anzahl der Sitzplätze. (Ich kenne nämlich keinen, der weniger als einen ganzen Tisch reservieren würde. )

              Wann ist das wieder frei?
              derzeit nur manuell (sprich: wenn die Reservierung gelöscht wird) -> Aber ich glaube, ich muss mir da was anderes einfallen lassen.

              wie verhinderst Du Doppelbuchungen?
              danke für den Hinweis -> muss ich mir noch was einfallen lassen (denn derzeit ist es so, dass ein Tisch nur 1 mal pro Tag reserviert werden kann -> was natürlich Schwachsinn ist.)


              @ Akretschmer (sorry, falls falsch geschrieben ):
              Passt es ansonsten mit der Normalisierung?

              danke und
              mfG APH

              komisch: Kaum macht man`s richtig funktioniert`s a scho.

              Kommentar


              • #8
                Meine Anmerkungen:

                - Entitäten werden immer im Singular erfasst: room nicht rooms. reservation nicht reservations.
                - Eine Reservierung besteht aus Datum und Zeit. Fasse diese Information zusammen. Die Datenbank kann diese auch aufteilen zum Auslesen, das benötigt annähernd 0 Zeit:
                Code:
                SELECT DATE(NOW()), TIME(NOW())
                - roomsAndTables gehört für mich aufgeteilt in: room und table. Wobei 1:n

                - Für die Doppelreservierung hätte Postgres sicher einen Range-Datentyp bereit (oder akretschmer?). In MySQL musst du dich mit etwas Business Logik begnügen. Setze einen Unique-Index.
                GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

                Kommentar


                • #9
                  Zitat von ChristianK Beitrag anzeigen

                  - Für die Doppelreservierung hätte Postgres sicher einen Range-Datentyp bereit (oder akretschmer?). In MySQL musst du dich mit etwas Business Logik begnügen. Setze einen Unique-Index.
                  Ja.

                  Code:
                  test=*# create table reservierung(tisch int, dauer tsrange, exclude using gist (tisch with =, dauer with &&));
                  CREATE TABLE
                  test=*# insert into reservierung values (1,'[2014-09-15 15:00:00,2014-09-15 17:00:00)');
                  INSERT 0 1
                  test=*# insert into reservierung values (2,'[2014-09-15 15:00:00,2014-09-15 17:00:00)');
                  INSERT 0 1
                  test=*# insert into reservierung values (2,'[2014-09-15 16:00:00,2014-09-15 18:00:00)');
                  ERROR:  conflicting key value violates exclusion constraint "reservierung_tisch_dauer_excl"
                  DETAIL:  Key (tisch, dauer)=(2, ["2014-09-15 16:00:00","2014-09-15 18:00:00")) conflicts with existing key (tisch, dauer)=(2, ["2014-09-15 15:00:00","2014-09-15 17:00:00")).
                  STATEMENT:  insert into reservierung values (2,'[2014-09-15 16:00:00,2014-09-15 18:00:00)');
                  ERROR:  conflicting key value violates exclusion constraint "reservierung_tisch_dauer_excl"
                  DETAIL:  Key (tisch, dauer)=(2, ["2014-09-15 16:00:00","2014-09-15 18:00:00")) conflicts with existing key (tisch, dauer)=(2, ["2014-09-15 15:00:00","2014-09-15 17:00:00")).
                  Und jetzt erklärst Du, wie Du 2 Reservierungen für den selben Tisch, eine von 15-17 und die andere von 16 bis 18 uhr, via Unique Index verhindern willst
                  PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                  Kommentar


                  • #10
                    Zitat von akretschmer Beitrag anzeigen
                    [...]
                    Und jetzt erklärst Du, wie Du 2 Reservierungen für den selben Tisch, eine von 15-17 und die andere von 16 bis 18 uhr, via Unique Index verhindern willst
                    Gar nicht. Das geht mit MySQL nur mittels Business-Logik .
                    GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

                    Kommentar


                    • #11
                      Zitat von ChristianK Beitrag anzeigen
                      [...] Das geht mit MySQL nur mittels Business-Logik .
                      Wie funktioniert das? Kannst mir ein Beispiel geben?

                      komisch: Kaum macht man`s richtig funktioniert`s a scho.

                      Kommentar


                      • #12
                        Zitat von APH Beitrag anzeigen
                        Wie funktioniert das? Kannst mir ein Beispiel geben?
                        Hehe
                        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                        Kommentar


                        • #13
                          Wie funktioniert das? Kannst mir ein Beispiel geben?
                          Du holst aus der DB die beiden "von-bis"-Zeiträume und prüft mit PHP ob diese beiden Zeiträume sich überschneiden.

                          Such mal etwas hier im Board, das kam schon öfters vor. Achte aber darauf das du etwas verwendet mit der DateTime KLasse von PHP.
                          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                          PHP.de Wissenssammlung | Kein Support per PN

                          Kommentar


                          • #14
                            Zitat von hausl Beitrag anzeigen
                            du holst aus der db die beiden "von-bis"-zeiträume und prüft mit php ob diese beiden zeiträume sich überschneiden.
                            lol.
                            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                            Kommentar


                            • #15
                              Blöd nur, wenn es mal *viele* werden.
                              Standards - Best Practices - AwesomePHP - Guideline für WebApps

                              Kommentar

                              Lädt...
                              X