Ankündigung

Einklappen
Keine Ankündigung bisher.

Normalisierung kontra Leistung ?

Einklappen

Neue Werbung 2019

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

  • Normalisierung kontra Leistung ?

    Hier ein alltägliches Beispiel einer Page die ich unterhalte:

    Anzeige einer Freundesliste

    Der Ablauf:
    Sämtliche Freundes ID's aus der freunde tabelle laden.

    Zu sämtlichen freunden jeweils auser der user_details tabelle die namen laden, aus der user_bilder tabelle den profilbildnamen laden, aus der usertabelle den Zeitpunkt der letzten aktion und den loginstatus ermitteln um festzustellen ob der freund online ist.

    Daten ausgeben.

    Mir stellt sich nun die Frage inwiefern es nun sinnvoll ist Daten bereits in die Freundestabelle zu laden um mir ständig wiederkehrende Datanbankquerys zu ersparen.

    Gelernt habe ich folgendes: Daten sollten in einer Datenbank nur ein mal gespeichert werden um Redundanzen zu vermeiden. Einige Redundanzen würden jedoch Leistungsgewinne erzielen.

    Ein Beispiel bei der obigen Freundesliste. Angenommen ich speichere bei der Freundesfestlegung nun gleich den namen (der bereits in der user_details tabelle ist) in der tabelle freunde mit. Dieser zusätzliche Eintrag würde zwar einen minimalen mehraufwand bedeuten aber erspart mir jedes mal wenn eine Freundesliste geladen wird - was deutlich häufiger vorkommt als einen freund hinzufügen - ein komplettes query.

    Meine Frage ist nun: Inwiefern machen solche Redundanzen Sinn um die Leistung zu steigern ? Welche Risiken entstehen durch solche Konstrukte ? Gibt es vielleicht jemanden der seine Erfahrungen posten kann ? Gibt es SQL konstrukte (hab mich da vor kurzem in Join etwas eingelesen) mit denen ich ohne sicherheitsrisiken Abfragen aus mehreren tabellen durchführe?


    Danke für eure Mühe,

    Exon

  • #2
    Hallo,

    meistens erzielst du mit geeigneter Indexierung bereits eine enorme Leistungssteigerung.

    Stellen wir uns folgenden Aufbau vor:
    Code:
    user_friends
    user_id | friend_id
    
    user_details
    user_id | user_name | last_action | last_login
    
    user_bilder
    user_id | bild_src
    Dann sollten die Spalten user_id und friend_id dort wo sie vorkommen als Index markiert werden.

    Der folgende Query (der natürlich auch ohne Indexierung funktioniert) sieht dann so aus:
    Code:
    SELECT d.*, b.* FROM user_friends AS f NATURAL JOIN user_details AS d NATURAL JOIN user_bilder AS b WHERE f.user_id = XY
    Das ist für eine Datenbank absolut kein Problem.
    Allgemein würde ich dir auch raten, die Performance nur dann höher zu bewerten als die Normalisierung, wenn du auch tatsächlich Probleme hast oder wirklich weißt, welche Nebeneffekte nicht redundante Daten auf deine Community-Skripte und seine Verwaltung haben bzw. abzusehen ist, dass die Normalisierung wirklich die Performance drücken wird.

    Kommentar


    • #3
      Danke für die Antwort Zergling.

      Das Indizieren der Felder ist bereits erledigt.

      Zitat von Zergling
      Allgemein würde ich dir auch raten, die Performance nur dann höher zu bewerten als die Normalisierung, wenn du auch tatsächlich Probleme hast oder wirklich weißt, welche Nebeneffekte nicht redundante Daten auf deine Community-Skripte und seine Verwaltung haben bzw. abzusehen ist, dass die Normalisierung wirklich die Performance drücken wird.
      Nunja die Community ist für ca 20.000 User ausgelegt.

      Da bisher jedes (ausser ein paar kleinere Klassen) jedes Stück Code von mir ist und ich erst vor 3 Wochen angefangen habe, habe ich den Vorteil das alles noch recht offen zu planen ist. Ich bin also noch nicht von allzufesten Strukturen und Skripten abhängig.

      Wichtig ist eventuell noch das viele AJAX effekte benutzt werden. Gerade das macht mir dabei auch sorgen: Jeder mouseOver Effekt bringt mindestens ein Query mit sich und ansonsten werden pro seitenaufruf auch viele Daten geladen.

      Kommentar

      Lädt...
      X