Ankündigung

Einklappen
Keine Ankündigung bisher.

Wie richtig normalisieren??

Einklappen

Neue Werbung 2019

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

  • Wie richtig normalisieren??

    Hallo PHPler und DBler,

    ich hab mal eine generelle Frage zur Normalisierung an welcher ich mir schon seit Tagen den Kopf zerbrech. Folgende Situation: Ich habe eine Tabelle "Gruppe" und eine Tabelle "Benutzer". Da ein Benutzer in mehreren Gruppen sein kann gibt es noch die Zwischentabelle "GruppeBenutzer". Nachfolgend kurz der Aufbau der Tabellen.

    Code:
    Benutzer(id, name)
    Gruppe(id, name)
    GruppeBenutzer(Benutzer_id, Gruppe_id)
    Es soll möglich sein für einen Benutzer das Ende einer Probezeit zu setzen (kein muss). Das heisst bis zum angegebenen Zeitpunkt soll der Benutzer für die entsprechende Gruppe in der Probezeit sein. Mir ist jedoch nicht ganz klar wo dieser Zeitpunkt gespeichert werden sollte. Ich könnte diesen jetzt in der Zwischentabelle einfügen und speichern:
    Code:
    GruppeBenutzer(Benutzer_id, Gruppe_id, trial_bis)
    . Dort gibt es aber mit der Zeit viele Zeilen welche kein Datum mehr haben, da bei vielen ja irgendwann die Probezeit rum ist.

    Die Möglichkeit Nr. 2 wäre eine eigene Tabelle mit den Zeiten und der Verbindung zur Gruppe und Benutzer:
    Code:
    GruppeBenutzerTrial(Gruppe_id, Benutzer_id, trial_bis)
    Die Frage die sich mir jetzt stellt ist, welche Variante besser ist bzw. näher einer guten Normalisierung kommt. Meiner Meinung nach sollte es eine eigene Tabelle geben. Wenn es ein Erstelldatum bzw. Verbindungsdatum wäre dann wäre es in der Zwischentabelle richtig da sich ja dann immer ein Wert dort befindet.

    Was sagt ihr dazu bzw. was ist eure Meinung dazu? Extra-Tabelle oder in der Zwischentabelle?


    Gruß S. Brosch

  • #2
    Ich würde die Tabellen eher mit einem PrimaryKey aufbauen:
    Code:
    Benutzer [id, name]
    Gruppe [id, name]
    GruppeBenutzer [id, Benutzer_id, Gruppe_id]
    GruppeBenutzerTrial [id, gruppebenutzer_id, trial_bis]

    Kommentar


    • #3
      Die Frage kann man vielleicht in der Theorie richtig beantworten, in der Praxis ist es aber nicht nur eine Frage der richtigen Normalisierung.
      Wieviel Benutzer hast Du überhaupt und in welcher Phase befinden die sich meist- in ihrer aktiven Laufbahn? Lebensdauer nahe Trialphasedauer?

      Das Thema Benutzerrechte dynamisch abzubilden erfordert ja auch etwas Performance. Bis abgefragt ist, was der Benutzer alles darf, sollten vielleicht nicht zuviel joins gemaccht werden, bis überhaupt mal Daten abgefragt bzw. zurückgeliefert werden.

      Was auch häufig interessant ist: Seit wann ist der User überhaupt Gruppenmitglied, klassischer Fall für ein Createdate. Das wäre immer da, gefüllt und nützlich, naja wenigstens aussagekräftig. Wenn die Probezeit dann einfach eine Konstante ist oder eine Gruppenkonstante oder eine Funktion, wären alle Fragen geklärt oder?


      Kommentar


      • #4
        soll der Benutzer für die entsprechende Gruppe in der Probezeit sein
        Die Frage ist, ob der Benutzer überhaupt nur einmal eine Probezeit absolvieren kann oder ob er pro Gruppe eine Probezeit bekommt.
        Im ersten Fall gehört das Enddatum zum Benutzer, im zweiten Fall ist Perry Staltics Vorschlag zielführend

        Kommentar

        Lädt...
        X