MySQL Produktvarianten

baserider

Well-known member
ID: 174417
L
10 März 2007
682
23
Hi,

ich möchte mal als Biespil das iPads nehmen.
Das gibt es ja in schwarz/weiß jeweils mit 16,32,64GB mit und ohne 3G. Die restlichen technischen Daten sind ja immer identisch

Macht es denn Sinn in der Datenbank jeweils für jede Variation einen neuen Datensatz anzulegen bzw. wie könnte die Datenbank aussehen, so das man am besten nur 1 mal alles eingeben muss was gleich ist und jeweils die Unterschiede zuordnet? Ist ja auch bei anderen Herstellern noch so oder auch beim iphone
 
Varianten werden für gewöhnlich mit einem Masterartikel und den Variantenartikeln gemacht.

Der Master ist hierbei ein abstrakter Artikel, der nicht bestellt werden kann, aber alle - über alle Varianten identischen - Merkmale aufweist.
Die Variante hat dann als Daten nur noch die konkreten Merkmale für die jeweilige Ausprägung.
 
Hi,

wenn ich nun ein Datenbankdesign anlegen möchte, bedeutet das also ich lege eine Tabelle an mit den allgemeinen Merkmalen und dann jeweils Tabellen für die Varianten?
 
Merkmale haben sowohl die Variante (z.B. Speicher von iPad), als auch der Master (z.B. Produktbezeichnung, Hersteller).
Varianten und Master sind beides Artikel, die sonst sehr ähnlich sind.

Damit komme ich auf 2 Tabellen: Merkmale und Artikel mit 1:n.
 
Hi,

danke. Jetzt wird es klarer :) Hab es mal kurz aufgeschrieben und wenn ich dich richtig verstanden habe dann ungefähr so hier:

Artikel
--------
id
name
prozessor
wlan

Merkmale
-----------
id
artikel_id
speicher
3G
 
Nö. Die Spalten sind alle abstrakt.

WLAN und Prozessor sind Merkmale (außer, wirklich jeder Artikel hat bei dir Prozessor und WLAN).
Und Speicher und 3G hat bei Merkmal absolut nix verloren. Das is eher ein Name-Value-Paar.
 
Wie wäre es mit
Artikel
------
id
pid (keine pid = Masterartikel = nicht bestellbar)
name

und Merkmale
------
id
artikel_id
name
wert

Wobei bei mir dann immer die Frage aufkommt, wie insbesondere die wert-Spalte formatiert sein sollte. Kann ja von Preis bis Beschreibung so ziemlich alles sein, außer solche universellen Dinge werden auch noch in Artikel gesteckt (was wohl sogar zu bevorzugen wäre)
 
Was Universielles, wie z.B. ne Artikelnummer kann man ja zusätzlich in die Artikel-Tabelle aufnehmen.

Es sollten halt nur keine spezifischen Sachen, wie das genannte WLAN oder so in den Tabellen als Spalte auftauchen.
 
Hi,

@theHacker, dann habe ich dich irgendwie nicht so richtig verstanden. Könntest du mir mal eine kleines Beispiel aufzeigen, wie du es meinst? Oder geht das so in die Richtung wie von joschilein geschrieben? Dann frage ich mich ebenfalls, wie die wert-Spalte dann formatiert wird, da ja nicht nur Texte dort drin stehen.
 
Könntest du mir mal eine kleines Beispiel aufzeigen, wie du es meinst? Oder geht das so in die Richtung wie von joschilein geschrieben?
Ich hatte genau joschilein's Lösung im Kopf.
Dann frage ich mich ebenfalls, wie die wert-Spalte dann formatiert wird, da ja nicht nur Texte dort drin stehen.
Gut, hier kann man es dann wieder beliebig kompliziert machen; jenachdem, was du brauchst.

Denkbar wären mehrere Tabellen (eine für Text-Merkmale, eine für Integer-Merkmale) bzw. mehrere Spalten mit verschiedenen Typen in einer Tabelle.
Welche Lösung da die sinnvollere is, weiß ich nicht sicher. Ich persönlich tipp ja drauf, dass alles in einer Tabelle zwar mehr Platz braucht (weil viele NULL-Werte), aber wohl von der Performance besser geht, weil du mit einem JOIN alles dran hast, was du brauchst.

Um es noch komplizierter zu machen:

  1. Statt merkmal.name kannst du hier einen Fremdschlüssel in eine Tabelle mit Merkmalen und deren Metadaten machen.
  2. Statt merkmal.wert wäre auch Typ + Fremdschlüssel in typ-spezifische Tabelle möglich.
  3. Wenn du (2) mit (1) kombinierst, kann der Typ entfallen, weil der dann Merkmal-Metadatum is.
 
Merkmale
key|value|artikel|variante


Variante
id|artikel

Abfrage für alle Merkmale

Code:
SELECT
  key, 
  value 
FROM 
  Merkmale as M 
LEFT JOIN 
  Variante as V
ON
  (
    M.artikel=V.artikel
  OR
    M.variante=V.id
  )
WHERE 
  V.id=%d;
bei Merkmale ist entweder artikel oder variante NULL
 
Zuletzt bearbeitet:
Und wie weise ich einem Artikel, der keine Variante is, dann eine ID? :LOL:

Du hast die Unterscheidung Master vs. Variante nicht in die Merkmalstabelle stecken. Das passt nicht.
 
Ich hatte genau joschilein's Lösung im Kopf.
Gut, hier kann man es dann wieder beliebig kompliziert machen; jenachdem, was du brauchst.

Wenn ich mal bei den iPads bleibe, dann würde man in der Tabelle Merkmale, alle Dinge die gleich sind mehrfach reinschreiben, denn in der Tabelle Artikel sollen ja nur ganz universelle Dinge abgelegt werden. Prozessor, Bildschirmdiagonale usw. sind ja (bei den ipads) überall gleich, aber kommen nicht in die Tabelle Artikel, weil ich ja mit der gezeigten Lösung auch andere Artiklel speichern könnte.
 
Nein, die allgemeinen Infos würdest du dann z.B. der Artikel-ID 1 zuordnen, die spezifischen Merkmale den Artikeln 2-5, und 2-5 bekommen eben zusätzlich die Info (mit der pid), dass sie Varianten von 1 sind, und damit zusätzlich zu den eigenen Eigenschaften auch alle Eigenschaften von 1 haben...
 
Hi,

ich glaub nun hab ichs verstanden :)
Dann kann man ja nun einseits Varianten abbilden aber auch alle möglichen weiteren Artikel.