Datenbankaufbau Produktvergleich speichern

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

  • Datenbankaufbau Produktvergleich speichern

    Hi,

    auf meiner Seite kann man 2 Produkte miteinander vergleichen und ich möchte in einer Datenbank nur die jeweiligen produktnamen (id's) der Produkte speichern, die miteinander verglichen wurden.

    ist folgender Ansatz korrekt, bzw. was gibt es für eine bessere Lösung?

    vergleich
    ---------
    -id
    -produkt1
    -produkt2
    -datum

    oder so

    vergleich
    ---------
    -id
    -datum

    vergleich_details
    ---------------
    -vergleich_id
    -produkt

    Ich möchte später herausbekommen welche Produkte am meisten miteinander verglichen wurden.

  • #2
    Sollen immer nur genau zwei Produkte verglichen werden?
    Oder ggf. auch mehrere in einem Vergleich? (Dann wäre der zweite Ansatz erst mal sinnvoller.)
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Hi,

      bis jetzt sind es immer nur 2 Produkte, aber evtl. wird das ja auch mal mehr.
      Es kommen ja dann schnell mehrere 100.000 Datensätze zusammen und um die Produktnamen bzw. Hersteller zu ermittlen muss ich ja einen Join auf die Produkttabelle machen. Welche möglichkeiten gibt es denn um die Geschwindigkeit zu erhöhen?

      Kommentar


      • #4
        100.000 Rows sind für die gängigen RDBMS nur eine Fliegenschiss. Mit einem vernünftigen Schema – das scheint deins ja zu sein – und genügend RAM wirst du sehr lange keine Geschwindigkeitsprobleme haben. Du bist ja nicht Amazon. ;-)

        Kommentar


        • #5
          Hi,

          ich hab jetzt mal nach menem ersten Vorschlag von oben 500000 Datensätze eingefügt und in die Produktabelle so ca. 1000 Datensätze. Die folgende Abfrage benötigt immer ca. 3 Sekunden, das erscheint mir schon recht viel. Wie kann man das noch verbessern?

          Code:
          SELECT 
          	v.produkt_1,
                  v.produkt_2, 
                  p.hersteller, 
                  p2.hersteller, 
                  COUNT(*) as anzahl
          FROM 
          	vergleich v
          INNER JOIN 
                  produkte p on p.name = v.produkt_1 
          INNER JOIN 
                  produkte p2 on p2.name = v.produkt_2
          WHERE 
                  p.hersteller = p2.hersteller
          AND 
                  p.hersteller = 'Dell'
          GROUP BY 
                  CONCAT(produkt_1,produkt_2)
          ORDER BY 
                  anzahl DESC
          LIMIT 0,5

          Kommentar


          • #6
            Wozu soll das CONCAT() gut sein? Außerdem musst du im GROUP BY alle Spalten anführen, die auch im SELECT verwendet werden.

            Kommentar


            • #7
              Hi,

              Warum muss ich im Group By alle Spalten auflisten?
              Das Concat ist dafür, um die Anzahl der Vergleiche von z.B. Produkt a und Produkt b zu bekommen, also wie viel mal wurde Produkt a mit Produkt b verglichen.

              EDIT:

              Habe grad gemerkt das es auch ohne Concat geht, also GROUP BY produkt_1,produkt_2. Da ich nach der Kombination aus beiden Produkten gruppieren wollte, dachte ich, das die Spalten noch verbunden werden müssen

              Zuletzt geändert von lx-club; 25.09.2010, 13:20.

              Kommentar


              • #8
                Zitat von lx-club Beitrag anzeigen
                Warum muss ich im Group By alle Spalten auflisten?
                Da es erstens nicht SQL-kompatibel ist (jede andere Datenbank außer MySQL würde dir zurecht einen Fehler werfen) und zweitens es zu nicht eindeutigen Ergebnissen kommen kann.

                "When grouping, keep in mind that all columns that appear in your SELECT column list, that are not aggregated (used along with one of the SQL aggregate functions), have to appear in the GROUP BY clause too."

                SQL GROUP BY

                Zitat von lx-club Beitrag anzeigen
                Das Concat ist dafür, um die Anzahl der Vergleiche von z.B. Produkt a und Produkt b zu bekommen, also wie viel mal wurde Produkt a mit Produkt b verglichen.
                Nö, dafür ist das GROUP BY da. CONCAT() ist hier überflüssig und frisst außerdem unnötig Performance.

                Kommentar


                • #9
                  Danke, für die Info.
                  Hab das Concat entfernt und mal alle Spalten (ausser anzahl) bei GROUP BY mit angegeben, doch von der Performance her sind es immer noch ca. 3 Sekunden (Beim zweiten ausführen der Abfrage wird wohl die Abfrage immer gecacht)

                  Kommentar


                  • #10
                    Was sagt EXPLAIN?

                    Gibts eigentlich einen besonderen Grund, warum die Herstellerspalte ein Text ist? Sollte das nicht ein Fremdschlüssel auf die Herstellertabelle sein?

                    Kommentar


                    • #11
                      Zitat von h3ll Beitrag anzeigen
                      Was sagt EXPLAIN?

                      Gibts eigentlich einen besonderen Grund, warum die Herstellerspalte ein Text ist? Sollte das nicht ein Fremdschlüssel auf die Herstellertabelle sein?
                      Code:
                      id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra
                      1 	SIMPLE 	v 	index 	NULL 	IDX_produkt 	104 	NULL 	500000 	Using index; Using temporary; Using filesort
                      1 	SIMPLE 	p2 	eq_ref 	PRIMARY,IDX_hersteller 	PRIMARY 	152 	func 	1 	Using where
                      1 	SIMPLE 	p 	eq_ref 	PRIMARY,IDX_hersteller 	PRIMARY 	152 	func 	1 	Using where
                      Den Fremdschlüssel muss ich noch hinzufügen. Ich habe die Produkttabelle als Dump bekommen und dort steht der Hersteller als Text drin. Ich weiß das ist falsch und alle Hersteller kommen auch noch in eine gesonderte Tabelle und dann mache ich noch einen Join auf die Herstellertabelle
                      Zuletzt geändert von lx-club; 25.09.2010, 13:45.

                      Kommentar


                      • #12
                        Zitat von lx-club Beitrag anzeigen
                        von der Performance her sind es immer noch ca. 3 Sekunden (Beim zweiten ausführen der Abfrage wird wohl die Abfrage immer gecacht)
                        Du misst mit kalten Caches? Wozu?

                        Kommentar


                        • #13
                          Ich meinte beim ersten Ausführen sind es 3 Sekunden und wenn ich die Abfrage erneut ausführe sind es halt 0.0001 Sekunden. (phpmyadmin) Wie kann ich das verlässlich ermitteln?
                          Zuletzt geändert von lx-club; 25.09.2010, 13:53.

                          Kommentar


                          • #14
                            Was willst du ermitteln?

                            Kommentar


                            • #15
                              Mir ist nicht klar was du mit kalter Cache meinst. Die Ausführungszeit wird ja immer im phpmyadmin angezeigt bzw. auch lokal in meinem Programm.
                              Hatte mich halt gewundert, weil ca. 3 Sekunden ja schon lang sind.

                              Kommentar

                              Lädt...
                              X