Problem bei der Tabellenstrukturgestaltung

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

  • Problem bei der Tabellenstrukturgestaltung

    Hi

    Ich programmiere gerade ein Wörterabfrageprogramm und ich möchte die Wörter, welche man falsch beantwortet hat in die Datenbank (MySQL) speichern, damit man dann exakt diese nocheinmals abfragen kann. Das Problem, es ist ein Multiusersystem!

    Hier stehe ich vor dem Problem, es gibt zwei Varianten bis jetzt und ich weiss nicht, welche die Bessere ist:

    1. Variante: Die Tabelle würde so gestaltet:
    • id MED_INT <-- Id's
    • uid MED_INT <-- die Benutzer-Id's (zeigt auf andere Tabelle)
    • cid MED_INT <-- die Kategorie-Id's (zeigt auf andere Tabelle)
    • wid MED_INT <-- die Wörter-Id's (zeigt auf andere Tabelle


    Hier gibt es für jedes Wort einen eigenen Datenbankeintrag. Bei vielen Benutzern und wachsender Anzahl Wörter gibt das allerdings eine riesige Zahl von Datensätzen.

    2. Variante:
    • id MED_INT <-- Id's
    • uid MED_INT <-- die Benutzer-Id's (zeigt auf andere Tabelle)
    • incorrect_words MED_TEXT <-- vereint cid & wid durch Seperatoren getrennt


    Hier werden alle Kategorie-Id's und Wörter-Id's durch Seperatoren in einen riesigen String geschrieben und per REGEX weiterverarbeitet. Diese Methode ist aufwändiger zu warten, pro User gibt es aber nur je einen Datensatz.


    Welche der beiden Varianten ist nun die bessere und / oder performantere?

    Falls ihr eine bessere Variante sehen würdet, wäre das um so besser

    Danke schon im Vorraus an diejenigen, die sich die Zeit für das Lesen und vielleicht eine Antwort nehmen.

    Mfg Fab
    Zuletzt geändert von Zerofab; 29.04.2006, 10:21.

  • #2
    hi, am saubersten wäre diese lösung:

    # uid MED_INT <-- die Benutzer-Id's (zeigt auf andere Tabelle)
    # cid MED_INT <-- die Kategorie-Id's (zeigt auf andere Tabelle)
    # wid MED_INT <-- die Wörter-Id's (zeigt auf andere Tabelle

    Relationen die nur zur Verküpfung anerer tabellen dienen bekommen keine zusätliche id. Die eindeutigkeit eines resultiert aus dem zusammengestzten Primärschlüssel aus den zu verknüpfenden Tabellen. In deinem 1. Beispiel hast du eine trasitive Abhängigkeit, weil dein Eintrag zwei primärschlüssel hat.

    Die daten durch einen Separator in einem Tupel zu speichern würde gegen die 3. Normalform verstoßen, da du due einzelnen Attribute nicht mehr dierekt ansprechen kannst

    Gruß Basti

    Kommentar


    • #3
      Hi

      Danke schonmal für die schnelle Antwort.

      Wird die Datenbank dann nicht zu sehr belastet, wenn sie so viele Einträge speichern muss?

      Angenommen, wenn ich 1000 Benutzer habe und jeder hat die Hälfe aller Wörter falsch geschrieben hat, dann sind das schon 2,6 Millionen Datensätze.

      Falls keine noch bessere Möglichkeit kommt, werde ich diese nehmen.

      Hat jemand noch eine andere, bessere Lösung?

      Mfg Fab

      Kommentar


      • #4
        ok, angenommen du hättest 2,6 Millionen Datensätzte in der Tabelle, was hättest du denn für Nachteile?

        Abfrage performace? Was ist wohl schneller, eine DB abzufragen die eigens für die Selektion gewisser Attribute aus relationen geschrieben wurde, oder später in der Programmierung einen String zu exploden und alle zutreffenden Wörter nocheinmal abzufragen. Hast du dir mal die Abfragezeiten von DBs angesehen?

        Datenvolumen? Was willst du denn Speichern? Richtig: integerwerte die bei einer Menge von 2,6 Millionen Datensäten ziehmich genau 5,722 MiB betragen würden

        Kommentar


        • #5
          Hi

          Also ich muss sagen, du kennst dich echt gut mit Datenbanken aus, so wie ich das beurteilen kann.

          (Kannst du mir verraten, wo man das so lernen kann? )

          Ich denke du hast mich überzeugt.

          Danke nochmals für deine Bemühungen.

          Einen schönen Sonntag noch.

          Mfg Fab

          Kommentar

          Lädt...
          X