Geschwindigkeit: explode vs. MySQL
Thomas24
- php
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
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
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
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
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 ZeilenDass 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
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
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
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
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
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
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
ok, werds trennen und mit JOINs machen, danke!
lg
Thomas