DJ_Cyberdance
Here to stay
|
Hallo!
Folgende Schwierigkeit: Ich bastle an einem CMS, das unter anderem eine Tabelle für Rechnungen enthält. Diese Rechnungen können für verschiedene Dienstleistungen unterschiedlichen Typs ausgestellt werden. Daher sind diese Leistungen bzw Produkte auch nicht in einer einzigen, sondern etwa 3 bis 4 unterschiedlichen Tabellen. Diese in eine Tabelle zusammenzufassen geht kaum, weil sie zu unterschiedliche Eigenschaften aufweisen.
Aus der Tabelle rechnungen soll jedoch ersichtlich sein, zu welchem Produkt/welcher Leistung in welcher Tabelle eine Rechnung gehört, andersherum muß aus jedem Produkt die zugehörige Rechnung ersichtlich sein.
In der Tabelle Rechnungen reicht die bloße Angabe einer Produkt-ID nicht aus, da diese ID ja in mehreren Tabellen der unterschiedlichen Produkte enthalten sein kann.
Meine Idee wäre nun, das über ein weiteres Feld in der Tabelle rechnungen zu lösen, in dem jeweils die Produktkategorie bzw. zugehörende Tabelle steht.
Hat jemand eine schönere Idee, wie man sowas besser lösen kann...?
|
DKCH
...
|
|
Laessig
Big d00d
|
da wird dir nichts anderes übrigbleiben als für jede produkt/leistung tabelle eine relation mit der rechnung einzuführen. i.e. gibts für jede produkt/leistung tabelle eine spalte mit dem entsprechenden schlüssel in der rechnungs-db (bei einer 1:n verknüpfung). im falle einer n:n verknüpfung musst du das ganze eben mit einer zwischentabelle (wie in diesem fall üblich) für jede produkt/leistungs tabelle machen.
|
DJ_Cyberdance
Here to stay
|
DKCH: Es geht eigentlich, wie Du dem Titel entnehmen kannst, nicht um die Programmierung, sondern rein um die SQL-Datenbank. Implementiert wirds in PHP5.
Laessig: Wie meinst Du das mit der Zwischentabelle? Einfaches Beispiel: Zwei Produkttabellen, eine Tabelle mit Rechnungen:
Table: products_a Fields: a_id, a_rechnung, a_name, a_....
Table: products_b Fields: b_id, b_rechnung, b_irgendwas, b_...
Table: rechnungen Fields: r_id, r_source, r_type, r_betrag, r_...
In r_source würd ich meinen, daß die produkt-id drinsteht, also entweder a_id oder b_id. In r_type steht dann drin, ob die ID in r_source von tabelle products_a oder products_b stammt.
Edit: Falls es befremdlich wirkt, daß die Produkttabellen ein Rechnungsfeld aufweisen: Die Produkte sind alle kundenspezifisch, dh. es gibt für jedes Produkt genau eine Rechnung. Aber es gibt eben eine begrenzte Anzahl (~4) an Produkttypen, die sich nicht alle in eine Tabelle schreiben lassen.
Wie würde das nun mit Deiner Zwischentabelle aussehen?
Bearbeitet von DJ_Cyberdance am 10.01.2007, 10:33
|
Laessig
Big d00d
|
wie gesagt ist die zwischentabelle für eine n:n verknüpfung notwendig. was machst du bei deiner derzeitigen modellierung wenn eine rechnung mit 2 produkten aus products_a oder mit 1 produkt aus product_a und 1 produkt aus product_b verknüpft werden soll? du hast ja nur ein feld (bzw. eine tabellenspalte) in die du die information aufnehmen kannst.
wenn also eine rechnung mit mehreren produkten verknüpft sein kann und umgekehrt (eben n:n) benötigt man eine zwischentabelle. in der befinden sich die zuordnungen r_id<->a_id bzw. r_id<->b_id .
würd ich deinem fall sowieso empfehlen, da du dort auch die information, auf welche tabelle sich der schlüssel eigentlich bezieht, besser ablegen kannst.
schematisch: tabellen: rechnungen <-> rech_prod <-> products_x
schlüssel: rechnungen:r_id <-> rech_prod:r_id, x_id, prod_tablename <-> products_x: prod_id
pseudocode: wir wollen alle produkte zur rechnung mit id 25 finden. finde alle einträge in rech_prod mit r_id 25 für alle gefundenen einträge { finde den zugehörigen eintrag aus tabelle prod_tablename mit schlüssel x_id }
|
ica
hmm
|
edit: weisst du von einer rechnung wozu sie gehört?
zwischentabelle:
Table: products_a_rechnungen_mapping Fields: a_id, r_id
Table: products_b_rechnungen_mapping Fields: b_id, r_id
|
rettich
Legendwaffle, waffle!
|
hab ich das richtig verstanden, dass du mehrere produkte zur gleichen rechnung hängen willst? also eine m:n beziehung (ein produkt kann in mehreren rechnungen vorkommen, eine rechnung kann ein oder mehrere produkte beinhalten)
dann wären intersection tables (zwischentabellen) das mittel, um diese beziehungen aufzulösen.
rechnung <-> x_rechnung_produkt <-> produkt
wobei x_rechnung_produkt immer genau eine rechnungs_id und eine produkt_id beinhaltet.
eventuell dann noch
produkt <-> produkttyp <-> produkttypdetails
add: zu langsam. wurde bereits alles korrekt erklärt
|
DJ_Cyberdance
Here to stay
|
Öhm, die Sache ist insofern einfach, als daß es pro Produkt genau eine Rechnung gibt - und genau umgekehrt. Nur daß die Produkte eben in unterschiedlichen Tabellen stehen.
Gesetzt den Fall, ich nehm eine Zwischentabelle, in die ich product_X_id, rechnung_id und tablename reinschreibe - kann ich irgendwie _ein_ SQL-query formulieren, sodaß ich von einer gegebenen Rechnung eindeutig auf das zugeordnete Produkt schließen kann? Das geht wohl kaum...
|
Laessig
Big d00d
|
das kannst auch nicht bei einer 1:n verknüpfung wo du den tabellennamen in ein feld hineinspeicherst oder?
|
kleinerChemiker
Here to stay
|
eventuell könnte das doch über ein subselect gehen.
|
rettich
Legendwaffle, waffle!
|
eventuell könnte das doch über ein subselect gehen. wennst nicht weißt, auf welche table du gehen sollst, wirds schwer werden.
|
LoSerRaTiO
www.krenker.at
|
rechnungs id als foreign key in produkttabelle(n)?
|
kleinerChemiker
Here to stay
|
ich dachte mit subselect an so was wie etwa:
SELECT r.* p.* FROM rechnung JOIN (SELECT produkt_typ from rechnung WHERE id=$id) USING (id) WHERE id=$id
wobei in produkt_typ der tabellenname des produktes steht.
|