Hallo,
mir fallen spontan zwei möglichkeiten ein. zum einen kannst du dir eine menge tabellen sparen, indem du zwei entitäten bildest:
- produkte
- eigenschaften
in der ersten tabelle stehen natürlich die produkte, in der zweiten die eigenschaften (nicht inhalte), die ein produkt haben kann. das wären also zum beispiel farbe, gewicht, versandart, auflage etc. zwischen den beiden entiäten besteht eine n:m beziehung, sprich es braucht eine zusätzliche beziehungstabelle:
- produkte_eigenschaften
die spalten wären:
produkt_id
eigenschaft_id
lieferzeit
wert
wobei die ersten zwei spalten einen zusammengesetzten primär-schlüssel bilden. bei lieferzeit wird immer nur die schnellstmögliche lieferzeit abgebildet, die langsameren werden impliziert. der vorteil davon ist zum einen wesentlich weniger tabellen und somit übersichtlicher. auch wenn neue eigenschaften hinzukommen, kann man dies tun, ohne in das daten-layout eingreifen zu müssen. der nachteil besteht darin, dass du die einzelnen eigenschaften wie zum beispiel der farbe nicht verschiedene attribute zuordnen kannst, die nur spezifisch für die farbe sind, da ja sonst alle anderen eigenschaften davon mitbetroffen wären. falls solche individuelle attribute der jweiligen eigenschaften auszuschließen sind, ist dies ein sehr guter weg.
Tabellen einparen hören sich immer gut an ;-)
Frage:
bekomm ich dann nicht Probleme mit meiner Formel, die ein Preis ausrechnet?
SELECT ROUND((
(groesse._breite / 1000 * groesse._hoehe / 1000* auflage._auflage * gewicht._bedrgewicht/1000 * gewicht._bedrkosten) +
((farbe._vorderfarbe + farbe._rueckfarbe) * produkt._plattenkosten) +
((((farbe._vorderfarbe + farbe._rueckfarbe) * produkt._ruestzeitproplatte/60) + ((auflage._auflage / CEIL(produkt._bogengroesse / (groesse._breite / 1000 * groesse._hoehe / 1000 * 1.1))) / produkt._maschinengeschwindigkeit) + produkt._einrichtzeit/60) * produkt._maschinenstundensatz) +
(produkt._bogengroesse * gewicht._bedrgewicht/1000 * gewicht._bedrkosten * produkt._einrichtboegen) +
ceil(groesse._breite / 1000 * groesse._hoehe / 1000 * auflage._auflage * gewicht._bedrgewicht/1000) * versandart._versdandt) *
faktor._faktor*ffracht._faktor, 2) AS preis
FROM `t1_produkt` AS produkt
INNER JOIN t1_gewinnfaktor AS faktor ON faktor._gewinnfaktor_id = produkt._gewinnfaktor_id
INNER JOIN t1_produkt_has_farbe ON t1_produkt_has_farbe._produkt_id = produkt._produkt_id
INNER JOIN t1_farbe AS farbe ON farbe._farb_id = t1_produkt_has_farbe._farb_id
INNER JOIN t1_produkt_has_versandart ON t1_produkt_has_versandart._produkt_id = produkt._produkt_id
INNER JOIN t1_versandart AS versandart ON versandart._versandart_id = t1_produkt_has_versandart._versandart_id
INNER JOIN t1_produkt_has_auflage ON t1_produkt_has_auflage._produkt_id = produkt._produkt_id
INNER JOIN t1_auflage AS auflage ON auflage._auflage_id = t1_produkt_has_auflage._auflage_id
INNER JOIN t1_produkt_has_gewicht ON t1_produkt_has_gewicht._produkt_id = produkt._produkt_id
INNER JOIN t1_gewicht AS gewicht ON gewicht._gewicht_id = t1_produkt_has_gewicht._gewicht_id
INNER JOIN t1_produkt_has_groesse ON t1_produkt_has_groesse._produkt_id = produkt._produkt_id
INNER JOIN t1_groesse AS groesse ON groesse._groesse_id = t1_produkt_has_groesse._groesse_id
INNER JOIN t1_fracht AS ffracht ON ffracht._fracht_id = fprodukt._fracht_id
INNER JOIN t1_fracht_has_produkt AS fprodukt ON fprodukt._fracht_id = ffracht._fracht_id
INNER JOIN t1_fracht_has_farbe AS ffarbe ON ffarbe._fracht_id = ffracht._fracht_id
INNER JOIN t1_fracht_has_gewicht AS fgewicht ON fgewicht._fracht_id = ffracht._fracht_id
INNER JOIN t1_fracht_has_groesse AS fgroesse ON fgroesse._fracht_id = ffracht._fracht_id
INNER JOIN t1_fracht_has_auflage AS fauflage ON fauflage._fracht_id = ffracht._fracht_id
INNER JOIN t1_fracht_has_versandart AS fversandart ON fversandart._fracht_id = ffracht._fracht_id
WHERE produkt._produkt_id = %d AND gewicht._gewicht_id = %d AND groesse._groesse_id = %d AND farbe._farb_id = %d AND auflage._auflage_id = %d AND versandart._versandart_id = %d AND fprodukt._produkt_id = %d AND fgewicht._gewicht_id = %d AND fgroesse._groesse_id = %d AND ffarbe._farb_id = %d AND fauflage._auflage_id = %d AND fversandart._versandart_id = %d ORDER BY ffracht._prioritaet
wenn sich bei einer Option oder bei ein Produkt ein Wert ändert, wird ein neuer aus den neuen Daten erstellt und der alte als inaktiv markiert, damit ich den alten Preis für ein bestehenden Auftrag berechnen kann.
Im alten Datensatz wird ein vermerk gemacht, welcher der aktuelle Datensatz ist, damit wenn der Kunde das Produkt noch einmal bestellen möchte, dass man ihn darauf hinweisen kann, dass sich etwas am Preis geändert hat
wenn ich richtig überlege, würde ich ja Probleme bekommen, wenn jemand eine Option z.B. Farben löschen würde. Die Formel würde ja noch versuchen auf diese Teile zuzugreifen
was natürlich der Vorteil ist, dass man relativ leicht neue Optionen hinzufügen kabnn, z.B. Falzen, etc., was noch kommen wird
falls du aber lieber für jede eigenschaft eine einzelne entität machen willst, damit du ihnen individuelle attribute zuordnen kannst, dann ist meine frage, ob die lieferzeiten nicht auch von dem produkt abhängt oder nur von der eigenschaft bestimmt wird ?
die Lieferzeit hängt von allen Option und vom Produkt ab
Beispiel: es gibt eine Option, z.B. eine bestimmtes Papiergewicht, oder der Kunde möchte eine Auflage von z.B. 1000000 Stück, soetwas ist natürlich über Nacht nicht realisierbar
der Kunde soll die Möglichkeit haben zwischen den verschiedenen Lieferzeiten auswählen zu können, da diese sich preislich unterscheiden
beispiel farbe, ist dabei die lieferzeit nicht auch davon abhängig, welches produkt hergestellt wird oder bezieht sich die lieferzeit nur so wie du es gemacht hast auf die farbe, sprich ist unabhängig von dem produkt ?
die Lieferzeit bezieht sich doch auf jede Option und auf das Produkt selber
t1_farbe_has_t1_lieferzeit
t1_versandart_has_t1_lieferzeit
t1_produkt_has_t1_lieferzeit
t1_auflage_has_t1_lieferzeit
t1_gewicht_has_t1_lieferzeit
t1_groesse_has_t1_lieferzeit
wenn die lieferzeit nämlich auch von dem produkt abhängig ist, dann würde die lieferzeit mit in die beziehungstabelle kommen von farbe und produkte. das wäre wichtig erst einmal abzuklären.
die Lieferzeit muss von jeder Option und von jeden Produkt abhängen, da es vielleicht nich über Nacht lieferbar ist.
hier ist mal ein kleiner Entwurf
Datenbanklayoutdatei für den DBdesigner4
DatenbankLayout
von den Tabellen her gefällt es mir viel besser
nur wie setze ich das mit meinen Formeln um?
ein Produkt verwendet eine spezielle Formel
im Moment habe ich eine Tabelle "Formel", wo die Formel drin steht, in der Produkttabelle ist eine Spalte FormelID, die ich vorher abfrage um die richtige Formnel zu ermitteln. Anhand dieser Formel wird dann der Preis berechnet
mfg
Twilo
Farbtabelle