Hallo Sven,
vielen Dank für deine Antwort!
Du hast eine Tabelle mit Komponenten drin. Also Domains, Speicherplatz, Traffic, Subdomains, Mailadressen etc., alles das, was man so zusammensetzen kann, um einen Webhosting-Vertrag mit Leben zu füllen.
Dann hast du noch eine weitere Tabelle, welche die Bundles enthält. Name, ID, Preis, sonstige Daten.
Und mit einer dritten Tabelle verknüpfst du diese n:m-Beziehung zwischen Komponenten und Bundles. Denn es gilt: Eine Komponente kann Bestandteil mehrerer Bundles sein, und ein Bundle kann mehrere Komponenten enthalten.
Also als Tabellen ausgedrückt:
artikel:
art_id name einzelpreis
1 domain de 0,49
2 domain com 0,99
3 webspace 100 MB 0,99
4 webspace 200 MB 1,49(An dieser Stelle ist natürlich blöd, dass du alle unterschiedlichen Artikeltypen in einer Tabelle hast. Das Problem läßt sich über eine weitere Spalte "Typ" lösen, die n:1 verknüpft ist mit einer Tabelle "Artikeltypen", in der einer Artikeltyp-ID eine Artikeltypbezeichnung zugeordnet ist - ist aber für die Betrachtung hier irrelevant, sondern eigentlich nur interessant für die GUI).
Kannst Du das mal konkretisieren? Irgendwie peil ich das gerade nicht
...
typ:
id name
1 domain
2 webspace
artikel:
id typ value einzelpreis
1 1 DE 0.49
2 1 COM 0.99
3 2 100 0.99
4 2 200 1.49
Welchen Typ soll dann value haben - oder hast Du das anders gemeint?
bundles:
bund_id name preis
1 Superhosting 100 0,99
[...]Und als Zusammensetzung die Liste der Pakete:
bundles_artikel:
bund_id art_id
1 1 -> Bundle 1 mit 1 .de
[...]
Okay.
Wahlweise kannst du die Stückzahl natürlich auch noch in diese Tabelle packen, um gewisse Redundanzen zu vermeiden, aber das könnten dir auch Aggregatfunktionen zusammenzählen.
Außerdem wird's menschenlesbarer ...
So weit, so gut. Allerdings brauche ich die Möglichkeit, dass der
Kunde zwischen DE- und COM-Domains wählen kann. Wie kann man das in
der Datenbank abbilden?Wahlmöglichkeit bewerben, aber zwei verschiedene Bundles verwenden. Oder den Domaintyp ".de oder .com" wählen.
Ersteres scheidet aus, wenn ein Angebot 100 Domains jeweils wahlweise
DE oder COM enthält - soll ich dann 101 Bundles verwenden? :-)
Könnte man nicht auch eine Tabelle domains anlegen?
artikel_domains:
id tld quantity fee
1 DE 1 0.49
2 COM 1 0.99
3 DE, COM 5 NULL
tld ist eine Enumeration und gibt die möglichen TLDs an, quantity die
Anzahl, sodass Datensatz 3 dem Kunden 5-mal die Wahl zwischen DE und
COM lässt. fee = NULL gibt an, dass das so keinen Preis hat und nur in
einem Bundle vorkommt.
Hälst Du was davon? Dann müsste man eben für jeden Artikeltyp, der im
Bundle enthalten sein kann, eine eigene Tabelle anlegen, und nicht
einen Datensatz in einer Tabelle. Folge wäre, dass bundle_artikles
noch eine Angabe zum Artikeltyp benötigt und uns so unseren
zusammengesetzten Primärschlüssel kaputt macht ...
Mir macht viel mehr Sorgen, wie du die ganzen Preise zusammenrechnen willst. Dein Beispiel legt jedenfalls für die Einzelkomponenten Preise fest, die als im Bundle nicht summiert sind - sondern teurer! Zwar nur ein Cent, aber immerhin. Der schlaue Kunde wird sich also kein Bundle nehmen, sondern Einzeleinkauf machen. :)
Wo hab ich denn sowas geschreiben? ;o
Danke nochmal!
Peter