DagobertDuck: Bewertungssystem

Hallo und guten Tag,

ich habe ein Frage bezüglich MySQL, die sich wohl an die Datenbankexperten hier richtet.
Zunächst jedoch möchte ich die Ausgangssituation beschreiben.

Ich entwickle ein Community-Portal, bei dem es vor allem darum geht, daß angemeldete User Artikel schreiben können, die dann im Folgenden von angemeldeten Usern anhand eines 5-wertigen Sternesystems o.ä. bewertet werden können.

Damit jeder User jeden Artikel nur einmal bewerten kann, gibt es eine Tabelle, in der die jeweilige Artikel-id nebst User-Id (des Bewertenden) gepeichert wird

ARTIKEL_ID | USER_ID |
01            11
01            13
04            11
..

Soweit ist das klar. Nun ist es so, dass wir erstens von einer relativen hohen User-Zahl (>50000) und zweitens von einem äußerst aktiven Bewertungsverhalten ausgehen (welches in diesem community-Gedanken selbst begründet ist). Das heisst also, dass diese Tabelle sehr schnell ansteigen wird und die Zeilenanzahl in sieben- bis achtstellige Werte rutscht.

Nun meine Frage(n):

Sind meine Überlegung richtig und ist die Konzeption oben beschriebener Tabelle für dieses Problem soweit korrekt?  Wird es nicht zu extremem Performanceproblemen kommen, diese riesige Tabelle ständig wieder auszulesen (bei jedem Öffnen des Artikels, ob dieser oder jene User den Artikel schon bewertet hat)?

Vielleicht hat jemand noch einen Tip für mich. Meine längsten Tabellen hatten bisher nicht mehr als 100000 Einträge, ich bewege mich hier auf etwas unbekanntem Terrain.

Besten Dank und viele Grüße
DagobertDuck

  1. Hallo,

    Damit jeder User jeden Artikel nur einmal bewerten kann, gibt es eine Tabelle, in der die jeweilige Artikel-id nebst User-Id (des Bewertenden) gepeichert wird

    ARTIKEL_ID | USER_ID |
    01            11
    01            13
    04            11
    ..

    ein UNIQUE-Index über diese beiden Spalten wird benötigt.

    Sind meine Überlegung richtig und ist die Konzeption oben beschriebener Tabelle für dieses Problem soweit korrekt?  Wird es nicht zu extremem Performanceproblemen kommen, diese riesige Tabelle ständig wieder auszulesen (bei jedem Öffnen des Artikels, ob dieser oder jene User den Artikel schon bewertet hat)?

    wozu? Wenn ein User einen Artikel bereits bewertet hat und diesen erneut bewerten will, schlägt dies mit einer Schlüsselverletzung fehl. Mit diesem Fehler rechnest Du, wenn er eintritt, gibst Du dem User eine nette Meldung, dass er diesen Artikel bereits bewertet hat und deswegen nicht nochmals bewerten kann.

    Freundliche Grüße

    Vinzenz

    1. Hallo Vinzenz,

      danke für deine Antwort. Du hast recht, hätte ich selber drauf kommen können. Es ist nur so, dass ich eigentlich die Bewertungsmöglichkeit gar nicht mehr visualisieren wollte, wenn der User schon bewertet hat, sprich die Sterne z.B. ausgegraut sind.

      Viele Grüße
      Dagobert

      Hallo,

      »» Damit jeder User jeden Artikel nur einmal bewerten kann, gibt es eine Tabelle, in der die jeweilige Artikel-id nebst User-Id (des Bewertenden) gepeichert wird
      »»
      »» ARTIKEL_ID | USER_ID |
      »» 01            11
      »» 01            13
      »» 04            11
      »» ..

      ein UNIQUE-Index über diese beiden Spalten wird benötigt.

      »» Sind meine Überlegung richtig und ist die Konzeption oben beschriebener Tabelle für dieses Problem soweit korrekt?  Wird es nicht zu extremem Performanceproblemen kommen, diese riesige Tabelle ständig wieder auszulesen (bei jedem Öffnen des Artikels, ob dieser oder jene User den Artikel schon bewertet hat)?

      wozu? Wenn ein User einen Artikel bereits bewertet hat und diesen erneut bewerten will, schlägt dies mit einer Schlüsselverletzung fehl. Mit diesem Fehler rechnest Du, wenn er eintritt, gibst Du dem User eine nette Meldung, dass er diesen Artikel bereits bewertet hat und deswegen nicht nochmals bewerten kann.

      Freundliche Grüße

      Vinzenz

      1. yo,

        danke für deine Antwort. Du hast recht, hätte ich selber drauf kommen können. Es ist nur so, dass ich eigentlich die Bewertungsmöglichkeit gar nicht mehr visualisieren wollte, wenn der User schon bewertet hat, sprich die Sterne z.B. ausgegraut sind.

        das ist "harmlos" auch bei vielen zugriffen und einer grossen tabelle. wie Vinz schon sagte, lege einen Unique index über beide spalten. und da du zu einem bestimmten user die bewertung eines bestimmten beitrages suchst, kann der unique index auch gleichzeitig genau dafür verwendet werden.

        kleine anmerkung von mir, falls das noch nicht geklärt ist, in die tabelle mit den beiden fremdschlüsseln muss natürlich auch noch der wert für die bewertung mit rein.

        Ilja

  2. Vielleicht hat jemand noch einen Tip für mich. Meine längsten Tabellen hatten bisher nicht mehr als 100000 Einträge, ich bewege mich hier auf etwas unbekanntem Terrain.

    SQL Statments sind ziemlich fix, wenn es darum geht den Schlüssel oder ein Index einzugrenzen. Mach dir deshalb bei so kleinen Tabellen keine Sorgen.

    1. Hallo Pyros,

      danke, das ist gut zu wissen.

      Dagobert

      »» Vielleicht hat jemand noch einen Tip für mich. Meine längsten Tabellen hatten bisher nicht mehr als 100000 Einträge, ich bewege mich hier auf etwas unbekanntem Terrain.

      SQL Statments sind ziemlich fix, wenn es darum geht den Schlüssel oder ein Index einzugrenzen. Mach dir deshalb bei so kleinen Tabellen keine Sorgen.