MySQL n:m mit "Richtungsangabe"

WhiZZler

Chancentod²
ID: 85586
L
6 Mai 2006
588
32
begrüße!

ich habe ein kleines datenbank design problem.. ich möchte in der datenbank prozesse und die verknüpfungen zwischen den einzelnen prozessen darstellen..

bei der verknüpfung handelt es sich aber um keine ganz normale n:m verknüpfung, es soll eine "richtung" mitgespeichert werden..
damit ist gemeint, dass ein prozess die ergebnisse anderer prozesse verwendet und gleichzeitig als grundlage für andere prozesse dient.. zur verdeutlichung ein kleines schaubild, das die verknüpfung eines prozesses mit anderen prozessen zeigen soll..

Code:
[b]input[/b]                                                                [b]output[/b]
prozess a         ------>                                         
                                                prozess x               -------->         prozess c
prozess b         ------>

der ominöse prozess x bekommt in diesem fall also die ergebnisse von prozess a und prozess b und liefert sein ergebnis für prozess c..

wie würdet ihr das in der datenbank abbilden?

meine idee war ganz einfach folgende struktur für die n:m tabelle:
Code:
from_process_id | to_process_id
(die namen der spalten sind noch recht suboptimal gewählt.. aber fürs erste sollte klar sein, was gemeint ist ;) )

für das beispiel hätte ich also folgende n:m tabelle:
Code:
from_process_id | to_process_id
a | x
b | x
x | c

ich sehe allerdings probleme beim auslesen der beteiligten prozesse zu einem prozess.. beim auslesen müsste in den query ein "WHERE from_process_id = x OR to_process_id = x".. nebenbei müsste ich über ein IF statement zusätzlich bestimmen, ob es sich um einen ein oder ausgehenden prozess handelt (aus der "sichtweise" des prozesses, der näher bestimmt werden soll..)

aus diesen gründen finde ich diese lösung nicht besonders schick.. deswegen hoffe ich auf eure geistesblitze ;)

vielen dank im voraus!
mfg
whizzler
 
wie wäre es mit einem union?

Code:
(SELECT 'to' AS direction .... WHERE to_process_id = 'x')
UNION
(SELECT 'from' AS direction .... WHERE from_process_id = 'x')
 
Was hindert dich, die Fallunterscheidung in der Anwendung zu machen, die die Daten ausliest?

Ansonsten wenn du diese Unterscheidung (bei ice-breaker im UNION) nicht haben willst, kannst du vielleicht anders rangehen und die Kanten schon doppelt in die Datenbank speichern.

src | dest | dir / dir *)
A|X|->
X|A|<-
B|X|->
X|B|<-
X|C|->
C|X|<-

Wenn dich nur der Knoten X interessiert, kriegst du gleich die Richtung der Kante mit:
Code:
[FONT=Courier New][B][COLOR=#9932cc]SELECT[/COLOR][/B] src, dest, dir
[B][COLOR=#9932cc]FROM[/COLOR][/B] processes
[B][COLOR=#9932cc]WHERE[/COLOR][/B] src = 'X';[/FONT]
src | dest | dir / dir *)
X|C|->
X|A|<-
X|B|<-

*) dir Teil des Primärschlüssels, wenn bidirektionale Kommunikation zwischen zwei Prozessen nicht erlaubt is
 
danke für die antworten :)

ich denke ich werde es über UNION oder über eine IF bedingung im FROM teil machen.. also entweder so wie ice es vorgeschlagen hat oder so:

Code:
SELECT from_process_id, to_process_id, IF(from_process_id = 'x', '->', '<-') AS direction
FROM processinterrelations
WHERE from_process_id = 'x' OR to_process_id = 'x'

ich schau mal, ob es da geschwindigkeitsunterschiede gibt und entscheide mich dann..
aber mit hinblick auf die kompatibilität mit anderen DBMS ist UNION wohl die bessere lösung (dafür bietet Zend_Db_Select zumindest ne eigene methode.. für IF nicht :ugly: deswegen fühle ich mich mit UNION eher auf der sicheren seite :ugly: )

noch eine frage.. ich wusste nicht so richtig, wie ich das im erm modell darstellen soll.. ist diese darstellung korrekt?

im prinzip ist es ja eine normale n:m relation.. die zusatzinformation mit der richtung wird ja erst in der anwendung selbst ermittelt..