Ankündigung

Einklappen
Keine Ankündigung bisher.

Datenbankdesign

Einklappen

Neue Werbung 2019

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

  • Datenbankdesign

    Hallo liebe PHP-Freunde,

    derzeit stellt mich der Entwurf eines Datenbankkonzepts vor ein echtes Problem, dass ich in dieser Weise noch nie hatte. Es gibt bestimmt geeignte Lösungen, die sich auch mit einer MySQL Datenbank umsetzen lassen, allerdings führen viele meiner Ansätze zu merkwürdigen Konstrukten.

    Das Problem/die Aufgabe:
    Es geht darum eine Art Schülerverwaltung umzusetzen. Bekanntlich sind die Schüler jedes Schuljahr in einer neuen Klasse - zumindest die meisten von ihnen. Es soll innerhalb der Applikation möglich sein zwischen den Schuljahren zu wechseln, also unterschiedliche Zuordnungen zwischen Schülern und Klassen darzustellen. Es soll also auch ein Rückblick möglich sein. Dabei fallen immer wieder Datensätze an, die zu einem Schüler und gleichzeitig in ein bestimmtes Schuljahr gehören. Viele Beziehungen sind demnach also anhängig vom Schuljahr, was die Sache aus meiner Sicht nicht gerade vorteilhaft macht.

    Folgende angedeutete Lösung käme ggf. in Frage, aber ob wirklich sinnvoll?

    Tabelle Schüler, sid eindeutige Referenz
    Tabelle Schuljahre, yid eindeutige Referenz

    Relationstabelle Schüler_Schuljahr
    id | sid | yid

    Nun gibt es eine Beziehung zwischen den Schüler und den Schuljahren, die Referenzid aus der Schüler_Schuljahr kann nun dazu benutzt werden Daten wie die Klassenzugehörigkeit der Schüler in einer weiteren Tabelle abzubilden. Das hat den Vorteil, dass die Schüler nur einmalig angelegt werden müssen. Auch andere Inhalte können diese Referenz nutzen und Inhalte eindeutig einem Schuljahr und einem Schüler zuordnen.

    Überzeugt bin ich von dieser Lösung nicht.

    Ich hoffe, dass ich mein Problem ausreichend gut darstellen konnte. Es muss Lösungen für dieses Problem geben. Vielleicht gibt es auch mehrere, für die es jeweils Vor- und Nachteile gibt. Ggf. habt ihr auch ein Stichwort, wie sich dieses Designproblem fachsprachlich fassen lässt, so dass ich mich tiefergehend informieren kann.

    Viele Grüße
    ec

  • #2
    Letztlich läuft das darauf hinaus, wie die Daten gepflegt werden. Einen Selbstläufer wird man wohl nicht hinbekommen. Da die Einschulung eine feste Größe ist und Sitzenbleiben und Schulwechsel sicher mit zu breücksichten sind, bleibt letztlich nur, am Ende des Schuljahres für alle Schüler die Klassenstufe neu zu vergeben. Davon ausgehend sähe ein Modell vielleicht so aus:

    Code:
    Schueler
    ID | Name | foo | bar | Einschulung
    
    rel_Klasse_Schueler
    SchuelerID | KlasseID
    
    Klasse
    ID | Jahr | Klassenstufe | KlasseErgänzung
    Bsp.

    Code:
    Schueler
    1 | Karl   | Koch   | … | 2000
    2 | Regine | Müller | … | 2000
    
    rel_Klasse_Schueler
    1 | 55
    2 | 55 // war in der selben Klasse wie Karl
    1 | 77 // Sitzengeblieben
    2 | 78
    
    Klasse
    55 | 2006 | 7 | a
    77 | 2007 | 7 | a
    78 | 2007 | 8 | a
    [COLOR="#F5F5FF"]--[/COLOR]
    [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
    [COLOR="#F5F5FF"]
    --[/COLOR]

    Kommentar


    • #3
      Es soll sogar Schüler geben,die innerhalb eines Jahres die Klasse wechseln ...

      Hast Du die auch in deinem Modell ?

      Ich würde für die Fälle im Modell von Nikosch die Relation um das Datum erweitern:

      Code:
      rel_Klasse_Schueler
      ===============
      1 | 55 | 01.08.2006
      2 | 55 | 01.08.2006 // war in der selben Klasse wie Karl
      1 | 77 | 01.08.2007 // Sitzengeblieben
      2 | 78 | 01.08.2007
      So kannst Du über das letzte Datum der Relation die aktuelle Klasse bekommen
      Webstammtisch Oldenburg

      Kommentar


      • #4
        @eisenhans: in einem OO-Datenmodell würdest du das üblicherweise mit historisierten Beziehungen realisieren. Will heißen: eine Beziehung für die aktuelle Zugehörigkeit und eine für die "historische" Zugehörigkeit. Letztere kann mehrmals vorkommen, erstere nur einmal. Damit tust du dir bei der Abfrage leichter und die Selektivität bei Abfrage der aktuellen Schüler auf der Beziehungs-Tabelle ist größer!

        @ecomeback: wichtig ist hier vor allem die Konfiguration der JOIN-Indizes auf der Beziehungs-Tabelle. Diese müssen in der Reihenfolge der JOINs definiert sein, sonst kann diesen MySQL nicht verarbeiten. Der GORM des APF legt daher einen JOIN- und einen Reverse-JOIN-Index an, damit die n:m Beziehung in beide Richtungen abfragbar ist.
        Viele Grüße,
        Dr.E.

        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        1. Think about software design [B]before[/B] you start to write code!
        2. Discuss and review it together with [B]experts[/B]!
        3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
        4. Write [I][B]clean and reusable[/B][/I] software only!
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

        Kommentar


        • #5
          Wenn man vernünftigerweise voraussetzt, daß ein Schüler auch innerhalb eines Schuljahres die Klasse wechseln kann, dann müssen in "rel_Klasse_Schueler"
          2 Spalten ergänzt werden: "Eintritt_in_die_Klasse" und "Austritt_aus_der_Klasse".

          Da die meisten Schüler ja geschlossen von einer Klasse in eine andere wechseln, brauchst Du nur eine entsprechend formulierte Anfügeabfrage, um alle Schüler der 7a in die 8a zu versetzen. Die (hoffentlich) wenigen Sitzenbleiber müssen natürlich zu Fuß korrigiert werden.

          Kommentar

          Lädt...
          X