Thomas24: Geschwindigkeit: explode vs. MySQL

Hi!

Ich möchte mein meine Frage in folgendes (erfundenes) Bsp. packen, da es sonst zu kompliziert zu erklären wäre:
Ich will einen Onlineshop programmiern, bei dem der Admin pro Produkt beliebig viele Optionen mit beliebig vielen Auswahlmöglichkeiten erstellen kann.
z.B.
Produkt Auto:
Option Farbe: rot, blau, grün
Option PS: 100, 120, 200

Ist es nun sinnvoller das ganze in 2 tables zu speichern alla:

id | product | ...
-------------------
  1 | Auto    | ...

id | product_id | option | optionvalue
---------------------------------------
  1 |          1 | Farbe  | rot
  2 |          1 | Farbe  | blau
  3 |          1 | Farbe  | grün
  4 |          1 | PS     | 100
...

oder in einer Tabelle z.B. nach folgendem Patter: option:option1|option2;

id | product | options
-----------------------
  1 | Auto    | Farbe:rot|bla|grün;PS:|100|120|200

$result = mysql_fetch_array(...);
$split_options = explode(";", $result);
$options = array();
foreach($split_options as $option) {
  $option = explode(":", $option);
  $options[$option[0]] = explode("|", $option[1]);
}

Vielen Dank
Thomas

  1. Hi,

    Ist es nun sinnvoller das ganze in 2 tables zu speichern alla:

    Ja.
    Stichwort Normalisierung.

    oder in einer Tabelle z.B. nach folgendem Patter: option:option1|option2;

    Nein.

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
    1. Hi,

      Ist es nun sinnvoller das ganze in 2 tables zu speichern alla:

      Ja.
      Stichwort Normalisierung.

      Normalisierung is doch dazu da redundanzen zu vermeiden und hat nix mit der programmierung in php zu tun???

      Nach dem Schema der normalform bräuchte ich ja 3 Tabellen:
      products: id, productname, ...
      options: id, product_id, optionkey
      ovalues: id, priduct_id, optionvalue

      Wenn ich jetzt sowohl dieses komplexe Schema, als auch die simplere Version:
      products: id, productname, ...
      option: id, product_id, option

      einrechne hätte ich in meinem php script statt
      1 db-abfrage mit einer Zeile Rückgabewert
      12 db-abfragen mit insgesamt ca. 35 Zeilen

      Bedeutet das nicht einen deutlichen Performanceverlust, wenn immer auf die db-Antwort gewartet werden muss?

      thx
      Thomas

      1. Hallo

        Ist es nun sinnvoller das ganze in 2 tables zu speichern alla:

        Stichwort Normalisierung.
        Normalisierung is doch dazu da redundanzen zu vermeiden und hat nix mit der programmierung in php zu tun???

        Was hat die PHP-Programmierung mit dem Design deiner Datenbank zu tun?

        Nach dem Schema der normalform bräuchte ich ja 3 Tabellen:
        products: id, productname, ...
        options: id, product_id, optionkey
        ovalues: id, priduct_id, optionvalue

        Solange einem optionkey ein optionvalue gegenübersteht, gehören die in *eine* Tabelle, womit zwei Tabellen übrig blieben.

        1 db-abfrage mit einer Zeile Rückgabewert
        12 db-abfragen mit insgesamt ca. 35 Zeilen

        Dass man mit einer Abfrage mehrere Tabellen verknüpfen kann, weißt du? Um beim obigen Beispiel zu bleiben, kannst du so einem Produkt all seine möglichen Eigenschaften, die in einer anderen Tabelle gespeichert sind, mitgeben.

        Tschö, Auge

        --
        Die deutschen Interessen werden am Liechtenstein verteidigt.
        Veranstaltungsdatenbank Vdb 0.2
        1. Hllo Auge!

          Nach dem Schema der normalform bräuchte ich ja 3 Tabellen:
          products: id, productname, ...
          options: id, product_id, optionkey
          ovalues: id, priduct_id, optionvalue
          Solange einem optionkey ein optionvalue gegenübersteht, gehören die in *eine* Tabelle, womit zwei Tabellen übrig blieben.

          nein!
          Wisste nicht wie ichs besser ausdrücken sollte, optionkey wäre z.B. "Farbe", während optionvalue z.B. schwarz wär.
          Ich hab jedoch grad gesehn das ich da gemurkst hab, die tabelle müsste natürlich so aussehn:
          ovalues: id, option_id, optionvalue

          1 db-abfrage mit einer Zeile Rückgabewert
          12 db-abfragen mit insgesamt ca. 35 Zeilen

          Dass man mit einer Abfrage mehrere Tabellen verknüpfen kann, weißt du? Um beim obigen Beispiel zu bleiben, kannst du so einem Produkt all seine möglichen Eigenschaften, die in einer anderen Tabelle gespeichert sind, mitgeben.

          Wahnsinn wie löchrig mein Hirn is, in der Theorie kenn ich JOINs sogar recht gut...
          Du hast recht, danke fürs entknotten meiner Gehirnwindungen ;)

          lg
          Thomas

  2. Hi,

    ergänzend zu Chris' Antwort:

    oder in einer Tabelle z.B. nach folgendem Patter: option:option1|option2;

    Die in einer Tabellenzelle gespeicherten Daten sind immer atomar. In Deinem Beispiel hätte der Datensatz also *einen* Wert, nämlich "option:option1|option2;". Dieser kann ausschließlich als "option:option1|option2; betrachtet werden, niemals als etwas anderes.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hallo Cheatah!

      Die in einer Tabellenzelle gespeicherten Daten sind immer atomar. In Deinem Beispiel hätte der Datensatz also *einen* Wert, nämlich "option:option1|option2;". Dieser kann ausschließlich als "option:option1|option2; betrachtet werden, niemals als etwas anderes.na klar, aus sicht des db-systems, aber aus sicht von php muss es doch nicht so sein...

      (Is jedoch nur meine persönliche Meinung, ich frag ja weil ich eben nicht genau bescheid weiß was besser ist)

      lg
      Thomas

      1. Hallo

        Als erstes: Zeilenumbrüche gibt es nicht nur aus Spaß. Bitte benutze sie, schon allein, um deine Antwort von der des Vorposters zu unterscheiden.

        Die in einer Tabellenzelle gespeicherten Daten sind immer atomar. In Deinem Beispiel hätte der Datensatz also *einen* Wert, nämlich "option:option1|option2;". Dieser kann ausschließlich als "option:option1|option2; betrachtet werden, niemals als etwas anderes.

        na klar, aus sicht des db-systems, aber aus sicht von php muss es doch nicht so sein...

        PHP hat keine Sicht. Du hast eine Datenbank, und greifst mit Hilfe von PHP auf deren Bestand zu. Dies tust du mit der für die Datenbank vorgesehenen Syntax, sprichst -innerhalb von PHP- also deren Sprache. Als Ergebnis bekommst du (vielleicht) Daten, die du mit PHP weiterbenutzt. Das sind zwei verschiedene Baustellen.

        Tschö, Auge

        --
        Die deutschen Interessen werden am Liechtenstein verteidigt.
        Veranstaltungsdatenbank Vdb 0.2
        1. hi!

          Als erstes: Zeilenumbrüche gibt es nicht nur aus Spaß. Bitte benutze sie, schon allein, um deine Antwort von der des Vorposters zu unterscheiden.

          Denkst du wirklich das das absichtlich war?
          Hatte den ersten Satz gelöscht und dabei wohl unabsichtlich den Finger ein bisschen zu lange auf der Löschtaste...

          PHP hat keine Sicht. Du hast eine Datenbank, und greifst mit Hilfe von PHP auf deren Bestand zu. Dies tust du mit der für die Datenbank vorgesehenen Syntax, sprichst -innerhalb von PHP- also deren Sprache. Als Ergebnis bekommst du (vielleicht) Daten, die du mit PHP weiterbenutzt. Das sind zwei verschiedene Baustellen.

          hab mich vorher echt blöd angestellt, kenn mich schon wieder aus...

          danke
          Thomas

          1. Hallo

            Als erstes: Zeilenumbrüche gibt es nicht nur aus Spaß. Bitte benutze sie, schon allein, um deine Antwort von der des Vorposters zu unterscheiden.

            Denkst du wirklich das das absichtlich war?

            Das kommt hier öfter vor, als du denkst.

            Hatte den ersten Satz gelöscht und dabei wohl unabsichtlich den Finger ein bisschen zu lange auf der Löschtaste...

            Na denn

            PHP hat keine Sicht. Du hast eine Datenbank, und greifst mit Hilfe von PHP auf deren Bestand zu. Dies tust du mit der für die Datenbank vorgesehenen Syntax, sprichst -innerhalb von PHP- also deren Sprache. Als Ergebnis bekommst du (vielleicht) Daten, die du mit PHP weiterbenutzt. Das sind zwei verschiedene Baustellen.

            hab mich vorher echt blöd angestellt, kenn mich schon wieder aus...

            Ich wollt's nur erwähnt haben. Viele, die hier (woanders aber wohl auch) posten, sind sich dieser Beziehungen nicht bewusst. Deine vorhergehenden Ausführungen hörten sich so an, als gehörtest du zu dieser Gruppe.

            Tschö, Auge

            --
            Die deutschen Interessen werden am Liechtenstein verteidigt.
            Veranstaltungsdatenbank Vdb 0.2
      2. Hi,

        na klar, aus sicht des db-systems, aber aus sicht von php muss es doch nicht so sein...

        ich habe Dir ein Grundprinzip genannt, wie *Du* die Daten zu betrachten hast.

        (Is jedoch nur meine persönliche Meinung, ich frag ja weil ich eben nicht genau bescheid weiß was besser ist)

        Jupp, Du hast Fachwissen als Antwort erhalten, welches Du nun entsprechend nutzen kannst.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. ok, werds trennen und mit JOINs machen, danke!

          lg
          Thomas