Bewertungen: SQL oder PHP: Belastbarkeit-Ausgleich

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Bewertungen: SQL oder PHP: Belastbarkeit-Ausgleich

    Hallo

    ich hab eine Menge an Daten. Es geht um Bewertung von Liedern. Jeder Benutzer darf nur einmal bewerten.

    Jetzt muss ich mich entscheiden: Belaste ich den Server mit SQL oder mit PHP?

    was ist schneller?

    Variante 1:
    ich lege eine Tabelle an und speichere Dort jede Bewertung ab. Somit muss ich später, beim Lesen der Datei, die ganze Tabelle 20 mal durchlaufen (20 mp3 pro Seite)
    und bei z.b. 1000 mp3's und 1000 Besucher wären es schon enorme Datenmengen

    Variante 2:
    für jedes mp3 lege ich neue Spalte an und Speichere da die ID's der Benutzer nacheinander mit "#" getrennt ab, damit ich später explode() 'n kann und per PHP den Benutzer rausgraben

    während ich das geschrieben hab, ist mir 2. Variante viel besser vorgekommen, da ich eindeutig mehr mp3's habe als Besucher, die abstimmen

    aber will trotzdem Meinung der Profis hören :)

    oder andere Varianten :)
  • Joins sind definitv schneller als deine explode Variante.

    Ich bin noch nicht so durch deine Tabellenstruktur durchgestiegen.

    Wenn ich das richtig verstehe hast du in einer Tabelle deine Benutzer und in einer deine Songeinträge.
    Und die Bewertungen sind dann sozusagen die Zwischentabelle wo du einfach nur die benutzer und song ID speicherst sowie die Bewertung?



    Eine Datenbank hält schon einiges aus. (Davon ausgegangen, dass du die Indizies richtig setzt ;) )


    Wenn es dann trotzdem zu langsam wird/ist, könntest du dir Gedanken über temporäre Zwischentabellen machen, welche zu einer bestimmten Zeit immer wieder erstellt werden, damit du dir bei jedem Aufruf die Joins ersparst.

    siehe
    MQT oder Summarty Table´s
  • Hi vince, mein Retter :D

    Habe eine Tabelle für User
    Eine Tabelle für Songs

    Bewertung wird in der Song-Tabelle gespeichert (wie das Lied bewertet wurde)

    wer wie viel Punkte gegeben hat ist irrelevant.

    ich wollte dann eine neue Tabelle erstellen und da Song ID und User ID speichern

    wenns aber über 1000 Songs geben würde und über 1000 Besucher, die abgestimmt haben, würde die Tabelle schon 1.000.000 Einträge haben.
    ich würde mich also da reinstürzen mit "Wähle alle User die für das Lied mit der ID xy abgestimmt haben" oder "Wähle alle Lieder, die User mit der ID xy bewertet hat" und muss mich hiermit durch die 1.000.000 Einträge durchmüllen. Und so für jedes einzelne mp3 auf der Seite

    Wenn ich natürlich die Variante 2 nehme(alle lieder, die user bewertet hat), kann ich einen Array zurücklegen und dann beim jeden Aufruf nur mit Array vergleichen. wäre schneller.

    Aber eine andere Möglichkeit wäre es in der Tabelle mit den Songs eine Spalte anlegen und da mit # getrennte ID's von Usern eintragen, die das Lied bewertet haben. Dann müsste ich in worst case nur 1000 Einträge durchgehen und dann explode'n. Was natürlich Nachteil hat, fällt mir grad auf, dass ich ziemlich viel Zeichen für die Spalte reservieren muss....
  • Koljan777 schrieb:

    wenns aber über 1000 Songs geben würde und über 1000 Besucher, die abgestimmt haben, würde die Tabelle schon 1.000.000 Einträge haben.
    ich würde mich also da reinstürzen mit "Wähle alle User die für das Lied mit der ID xy abgestimmt haben" oder "Wähle alle Lieder, die User mit der ID xy bewertet hat" und muss mich hiermit durch die 1.000.000 Einträge durchmüllen. Und so für jedes einzelne mp3 auf der Seite


    Richtig.

    Aber es kommt nicht immer auf die Menge an.
    Du hast 1 Million Einträge. Wobei es 2 ID´s gibt welche inidiziert sind (was schonmal ziemlich schnell ist).
    Sagen wir mal du hast für die IDs ein SMALLINT(5) oder MEDIUMINT(6) gewählt.

    Wie sieht die Abstimmungs Spalte aus ?
    Wahrscheinlich einfach nur TINYINT(1)

    Somit ist die Tabelle aus der du die Daten wählst sehr klein im Vergleich zu den Einträgen.

    Denn MediumInt verbraucht 3Bytes und Tinyint 1Byte.
    Pro Eintrag 7Bytes * 1.000.000Einträge == 7.000.000Byte == 6.67MB

    Mit Smallint würdest du sogar nur auf 4.76MB kommen.


    Da wiederrum alles indiziert ist und du nicht viel Overhead besitzt sondern alles mit ID´s machst ist die Performance logischerweise besser als wenn du die Bewertungen in einem gigatischen Textfeld beim Song speicherst.

    Ich kann mich nur wiederholen. Unterschätze eine Datenbank nicht. Du kannst das Ding gerne hart rannehmen :D
    Und wenn der Server in die Knie gehen sollte, dann arbeitest du mit temporären Zwischentabellen.
  • Das sind wirklich keine Datenmengen die dir Angst machen sollten ;)
    Außerdem bist du mit dieser Datenbankstruktur viel flexibler.

    Wer bewertet das File?
    Was hat der Benutzer bewertet?
    Wieviele Sachen hat der Benutzer bewertet? Durchschnittsbewertung? ...

    Was mir noch nicht einleuchtet:
    Somit muss ich später, beim Lesen der Datei, die ganze Tabelle 20 mal durchlaufen (20 mp3 pro Seite)


    Ein Query sollte reichen, oder?
  • Danke vince.

    Ich habe mehr Angst vor Ladezeiten als von Kapazität der Datenbank.
    Ich werde dann jetzt eine Tabelle anlegen und loslegen :)


    @d0nut

    das File bewerten die angemeldeten User. Damit es zu keiner doppelten Bewertung kommt will ich User ID's speichern und beim Laden der Seite prüfen, ob ein mp3 schon bewertet wurde von dem aktuellen Benutzer. Wenn ja, Sterne sperren und gesamte Bewertung anzeigen. Wenn nicht - Sterne aktivieren

    ich habe mich aber jetzt schon entschieden, wenn die Profis meinen, dass die Datenbank keine Probleme mit durch 1000000 Einträge surfen kriegt


    Was mir noch nicht einleuchtet:

    Somit muss ich später, beim Lesen der Datei, die ganze Tabelle 20 mal durchlaufen (20 mp3 pro Seite)

    Ein Query sollte reichen, oder?
    kommt drauf an welche Abfrage ich nehme. Wenn ich alle User nehme, die eine "anvisierte" mp3 bewertet haben, dann muss ich 20 mal eine query schicken, für jedes mp3 einmal.
    das entlastet bei großen mp3-Anzahl PHP, macht aber SQL fertig

    ich gehe davon aus dass ich mehr mp3's habe als Benutzer

    wenn ich alle von einen User bewertete mp3's nehme, dann habe ich nur eine query aber 20 mal in größeren Array laufen als in der 1. Variante

    Aber wie gesagt, habe mich jetzt für
    Wähle alle Lieder, die User mit der ID xy bewertet hat
    entschieden und Danke euch beiden, insbesondere vince ^^

    mit freundlichen Grüßen^^