"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

SQL: Konzept gesucht

DJ_Cyberdance 10.01.2007 - 09:08 887 12
Posts

DJ_Cyberdance

Here to stay
Avatar
Registered: Jun 2002
Location: Vesterålen
Posts: 1838
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

...
Registered: Aug 2002
Location: #
Posts: 3279
aus objektorientierter sicht würd ich mal ganz laut "vererbung" rufen: von einer basisklasse "produkt" leitest du konkrete klassen ab, die die eigentlichen produkte/leistungen repräsentieren.

leider ist die abbildung einer solchen hierarchie ohne mapping-framework a ziemliche hackn. patterns dafür gibts zB von martin fowler (
http://www.martinfowler.com/eaaCata...nheritance.html http://www.martinfowler.com/eaaCata...nheritance.html http://www.martinfowler.com/eaaCata...nheritance.html).

mit welcher programmiersprache und welcher datenbank gehst du die sache an?

Laessig

Big d00d
Avatar
Registered: Mar 2002
Location: Purkersdorf
Posts: 141
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
Avatar
Registered: Jun 2002
Location: Vesterålen
Posts: 1838
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
Avatar
Registered: Mar 2002
Location: Purkersdorf
Posts: 141
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
Avatar
Registered: Jul 2002
Location: Graz
Posts: 9818
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

Legend
waffle, waffle!
Avatar
Registered: Jan 2004
Location: wien
Posts: 794
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
Avatar
Registered: Jun 2002
Location: Vesterålen
Posts: 1838
Ö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
Avatar
Registered: Mar 2002
Location: Purkersdorf
Posts: 141
das kannst auch nicht bei einer 1:n verknüpfung wo du den tabellennamen in ein feld hineinspeicherst oder?

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4282
eventuell könnte das doch über ein subselect gehen.

rettich

Legend
waffle, waffle!
Avatar
Registered: Jan 2004
Location: wien
Posts: 794
Zitat von kleinerChemiker
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
Avatar
Registered: Sep 2003
Location: krenker.at
Posts: 744
rechnungs id als foreign key in produkttabelle(n)?

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4282
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.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz