kontaktpfad wie bei openBC ermitteln? how to ...
susi
- datenbank
hallo,
ich versuche seit geraumer zeit ein feature ähnlich wie bei openBC zu bauen!
dort kann man wenn man einen kontakt bzw. ein profil aufruft den "kontaktpfad" einsehen!
für alle die es nicht kennen ...
wenn ich "albert" aufrufe sehe ich dass ich einen kontakt namens "herbert" habe, dieser einen kontakt von "franzi" und franzi einen zu "albert"
es wird mir also
herbert->franzi->albert ausgegeben ...
geht dies rein mit SQL? bzw. mySQL?
ich habe keinen schimmer wie es funktionieren kann zumal es ja kontakte gibt die weiter verstreut sind und dann 5 "zwischenkontakte" auftreten!
how to? ich hab keine ahnung wie ...
lg, susi
Hi Susi,
geht dies rein mit SQL? bzw. mySQL?
klar, das geht. Dafür ist die Datenhaltung ja da.
Es bestehen zwischen den einzelnen Kommunikationsdatensätzen offensichtlich "n:m"-Beziehungen. Diese kannst Du über eine Tabelle 'Kommunikationsbeziehungen' in etwa wie folgt designen:
KB_ID integer ID
KB_KD1 integer Verweis auf einen Kommunikationsdatensatz 1
KB_KD2 integer Verweis auf einen Kommunikationsdatensatz 2
Somit wären die Beziehungen in der Datenhaltung hinreichend nachgebildet und eine recht triviale Abfragelogik könnte dann ermitteln, ob Franz mit Dieter verzeigert ist und über wieviele Zeiger dieses ggf. abgebildet ist.
Die Kommunkationsdatensätze sind natürlich über eine dafür geeignete Tabelle 'Kommunikation' zu pflegen.
Liebe Grüsse!
Gerold Dietl
Hi,
KB_ID integer ID
KB_KD1 integer Verweis auf einen Kommunikationsdatensatz 1
KB_KD2 integer Verweis auf einen Kommunikationsdatensatz 2
meinst du einen derartigen Aufbau für "alle Kontakte von x" oder "alle Verbindungen von x zu irgendwem"?
Im zweiten Fall würde das in einen ziemlichen Datenwust ausufern, der aus meiner Sicht kaum noch handhabbar ist. Da könnte ich mir eher ein graphentheoretisches Konstrukt mit einem entsprechenden Kurze-Wege-Suche-Algorithmus vorstellen, der nach einer bestimmten Zahl von Schritten abbricht.
Im kleinen Stil kann man das sicherlich mit einer Menge von SQL-Abfrage realiesieren, so etwa: Gib mir alle Kontakte von x (SQL-SELECT)
Für jeden Kontakt gebe mir alle dessen Kontakte (SQL-SELECT)
(-> entweder Tiefen- oder Breitensuche). Abbruch bei Treffer oder nach n Schritten.
MfG
Rouven
Hi,
meinst du einen derartigen Aufbau für "alle Kontakte von x" oder "alle Verbindungen von x zu irgendwem"?
"alle mit allen" habe ich verstanden, die Anforderungslage analysierend. Selbstverständlich ist eine feste Suchtiefe hilfreich, will man "Datenwust" vermeiden.
Siehst Du eine bessere Implementation?
Grüsse!
Gerold
Hi,
Siehst Du eine bessere Implementation?
das dürfte sehr auf die Datenbank ankommen. Die großen kommerziellen Systeme bieten rekursive Abfragen an, da kann man einfach rekursive Self-JOINs mit einer Abbruchbedingungen laufen und somit die Datenbank alles machen lassen. Die wird sich da allerdings nicht unbedingt geschickt anstellen (keine Heuristiken kein gar nix).
Anders herum wäre es eine reine Skript-Berechnung eben auf Basis von Graphentheorie, wobei ich da kein Fachmann bin, vielleicht gibts da Algorithmen mit guten Heuristiken.
MfG
Rouven
Hi,
ich könnte mir vorstellen, dass es Sinn macht in regelmässigen zeitlichen Abständen (60sec oder 3600sec ?) einen Job laufen zu lassen, der die Beziehungen zwischen den Kommunikationsdatensätzen ermittelt und diese in einer jeweils zu überschreibenden Tabelle bereitstellen. Das liesse sich über einen kleinen Dienst (Daemon + SOAP fürs datenholen bspw.) recht gut kapseln. Was wohl nicht so toll wäre ist eine "just in time-Bearbeitung" der Anforderung "Beziehungen".
Der Einsatz besonders hoch entwicklerter Algorythmen erscheint mir nicht erforderlich. Einfach vom o.g. Job alle Datensätze laden und dann mit fester Tiefe das "Beziehungsbüchlein" schreiben.
Grüsse!
Gerold