2012-04-13 12 views
2

Ich habe eine Produkttabelle mit Produkten. Jedes Produkt kann mehrere Bilder haben. Die URLs/IDs der Bilder sollen in meiner Datenbank gespeichert werden. Jetzt, anstatt Spalten wie image_url1, image_url2 usw. in meiner Produkttabelle zu erstellen, ist es gute Praxis, die serialisierten Daten, die die Liste der Bilder in meiner Produkttabelle enthalten, in einer Spalte namens image_url zu speichern.PHP: Serialisieren oder nicht

Oder ist es besser, eine weitere product_image Beziehungstabelle zu erstellen und die Produkt-IDs und Bild-IDs/URLs dort zu speichern?

Bin sicher, dass beide Methoden funktionieren, aber ich möchte mit der besten Praxis gehen.

Hinweis: Die Anzahl der Bilder pro Produkt variiert. Einige Produkte haben möglicherweise nicht einmal ein Bild.

Bearbeiten: Um mehr spezifische Details zu meiner Frage hinzuzufügen. Die Bild-URLs werden nicht für die Suche verwendet. Es wird nur zum Abrufen der URL des Bildes verwendet, wenn das Produkt angezeigt wird.

+0

Diese Frage passt nicht zu unserem Q & A-Format. Wir erwarten, dass die Antworten in der Regel Fakten, Referenzen oder spezifische Fachkenntnisse enthalten. Diese Frage wird wahrscheinlich um Meinung, Debatte, Argumente, Meinungsumfragen oder ausgedehnte Diskussionen bitten. – iambriansreed

+1

nicht serialisieren, Ursachen wie diese führen mich durch Flaschen Scotch gehen .. Vor allem, wenn Sie mit Wordpress arbeiten .. Denken Sie daran, nicht nur sucht Kopfschmerzen, aber Bearbeiten dieser Daten in einem nicht webbasierten Methode ist auch ein Schmerz .. (Dateiname ändert, Zeile manuell aktualisieren, jetzt müssen Sie Charcount auch aktualisieren). – gorelative

Antwort

1

Es empfiehlt sich, eine separate Tabelle zu verwenden. Serialisierte Daten in einem einzelnen Feld würden funktionieren, aber das ist keine gute Idee.

Was ist, wenn Sie auf die Datenbank mit einer anderen Sprache zugreifen müssen. Wäre es in der Lage, ein serialisiertes PHP-Objekt zu deserialisieren? (no)

Die Verwendung von serialisierten Daten würde viel mehr Code erfordern.

ein Bildbeispiel

separate Tabelle löschen:

delete from product_images where product_image_id = 4 

serialisierten Daten:

  • serialisierten Daten aus der Datenbank holen.
  • Deserialisieren in Array oder Objekt.
  • Durchlaufen Sie die Daten, um die Daten zu finden, die Sie benötigen.
  • Entfernen Sie es aus der Liste.
  • Serialisieren Sie die geänderte Liste und speichern Sie sie in der Datenbank.
+0

Was ist, wenn Sie später entscheiden, dass Sie den Bilddaten eine neue Eigenschaft zuweisen möchten? Sie können beispielsweise ein Standardbild zuweisen. Wenn Ihre Daten in der Hauptprodukttabelle serialisiert sind, müssen Sie Code schreiben, um jede Zeile in der Datenbank zu durchlaufen, um die serialisierten Objekte zu aktualisieren. Wenn Sie eine separate Tabelle haben, fügen Sie ein neues Feld hinzu und verwenden eine SQL-Anweisung. – AndrewR

+0

Danke. Gerade dieses eine Beispiel zeigte mir, welche Arbeit es tun müsste, um ein Bild zu bearbeiten/zu löschen. Obwohl ich nicht auf meinen Bildern suchen musste, würde ich definitiv bearbeiten müssen. – WebNovice

2

Viele Leute werden Ihnen sagen, dass es den Punkt einer Beziehung Datenbank-Engine tötet (oder was auch immer), wenn Sie eine Liste der Dinge in einem Feld speichern.

Wenn Sie jedoch nie nach diesem Feld suchen müssen (in Ihrem Fall, wenn Sie nie eine Bild-URL verwenden müssen und das Produkt finden, das das Bild besitzt), unterliegt das Feld niemals Einschränkungen (Wenn beispielsweise nicht sichergestellt werden muss, dass das gleiche Bild nicht zweimal verwendet wird, haben Sie keinen Grund, Daten nicht einfach in ein einzelnes Feld zu speichern.

+4

Fairerweise ist das ein ziemlich großes "Wenn". – ceejayoz

+0

Wahr. Ich mag es, Listen von Dingen in einem Feld zu vermeiden, ich selbst, aber manchmal ist es einfach einfacher als einen ganz anderen Tisch zu machen, der dann mit einem (anderen) 'Join' und all dem ... –

+0

oder einem gebracht werden muss kann eine Ansicht anstelle eines Joins verwenden @Kolink – gorelative

0

Erstellen Sie eine Spalte 'product_id' in der Bilder Tabelle.

2

Best Practices sind nicht silbernen Kugeln, sie sind immer am besten passt für bestimmte Situationen, seien sie breit oder schmal.

Wenn alles, was Sie tun werden Schleife über die Liste der Bilder, die ich nicht um den Schaden zu sehen. Wenn Sie jedoch bestimmte Bilder bearbeiten oder suchen, würde ich es nicht tun. Statt Ihrer anderen Wahl (benannte Bildfelder) sollten Sie Bilder in eine andere Tabelle mit einem Fremdschlüssel für das Produkt einfügen, zu dem sie gehören.

Alternativ, wenn Sie wirklich alle von ihnen in ein Feld müssen stopfen, können Sie Ihre DB XML-Funktionen suchen. Ich habe einige Sachen gemacht, viele Felder in einem XML-Dokument zu kodieren und es als ein Feld in der DB zu speichern, dann benutze XPath, um es zu durchsuchen. Sie sind abhängig von der Ebene der XPath-Funktionen, die vom db-Anbieter implementiert werden, aber in meinem Fall war es ziemlich performant und erlaubt uns, verschiedene Typen derselben Objektklasse in derselben Tabelle zu speichern.

Verwandte Themen