# Darstellung von Datensätzen mit Beziehungen in Java?



## cgu (21. Dez 2006)

*Guten Abend liebe Community,*

folgendes Problem plagt mich in den letzten Tagen, daher suche ich bei euch Rat. Es ist ein Projekt, mit dem ich in der nächsten Zeit betraut sein werde. Leider kann ich euch keine genaueren Daten nennen, aber ich versuche mein Vorhaben so gut es eben geht zu umschreiben.



*Basis:*

Es gibt eine Datenbank mit benötigten Daten. Die Datenätze stehen untereinander in Beziehung. Diese Beziehungen sollen dargestellt werden. Beziehungen werden mit simplen Linien dargestellt. Datensätze werden mit Ihrem Namen als Schriftzug dargestellt.



*Erläuterung:*

Jeder Datensatz steht mit seinem „Namen“ in einem dreidimensionalem Raum. Die Anordnung bzw. Positionierung der Datensätze soll anhand eines Algorythmus sinnvoll geschehen. Sinnvoll bedeutet in diesem Fall, dass diejenigen Datensätze, die in Beziehung zueinander stehen, beieinander positioniert werden. Dies könnte man mit einem Datensatz und dessen „Freunden“ vergleichen, die selbst Datensätze darstellen. Die „Freunde“ werden um den Datensatz herum im dreidimensionalen Raum positioniert.



*Logische Problematik:*

Der Algorythmus muss jewweils auch die „Freunde“ der „Freunde“ mit einbeziehen. Dies hat zur Folge, dass zum Einen viele und vor allem komplexe Beziehungen untereinander entstehen können, sich zum Anderen die Positionierung schwierig gestaltet, da jeder Datensatz nur einmal vorhanden ist und somit eventuell auch Beziehungen über große Distanzen im Raum enstehen. Die Anzahl der Beziehungen ist auf 10 Begrenzt.


*Technische Problematik:*

Die Technologie, die zum Einsatz kommt, muss sich für die Webdarstellung eigen und einen dreidimensionalen Raum darstellen können, in dem sich der Benutzer bewegen kann. Der Benutzer bewegt sich über das anklicken eines Datensatzes, der dann automatisch im Bild zentriert wird. Dies bedeutet, dass der Benutzer automatisch positioniert wird (keine aktive Bewerbung auf x,y, und z-Achse). Rotation gibt es nicht. Die Struktur wird nach jedem Bildaufbau neu erzeugt. 
Der Raum beinhaltet lediglich die „schwebenden“ Datensätze, ist geografisch nicht begrenzt und muss nicht komplett dargestellt werden. Günstigster Weise sollten die Beziehungen untereinander jeweils in echtzeit dynamisch generiert werden und nur der  aktulle Ausschnitt –ähnlich dem betreten verschiedener „Level“ in einem Computerspiel- sichtbar sein. Dies könnte z.B. bedeuten, dass nur der aktuell aktivierte Datensatz (in der Abbildung „Datensatz 2“) angezeigt wird, sowie die Datensätze, die sich 3 Verbindungen entfernt finden.


Die untenstehende Abbildung soll das Problem schematisch darstellen. Die Visualisierung soll anders gelöst werden.



*Meine Frage nun:*

Mit welcher Technologie  kann das vorhaben in Bezug auf die obenstehenden Kriterien realisiert werden bzw. kann das Vorhaben mit Java realisiert werden. Wenn ja, wo liegen die Vorteile? Wo liegen die Nachteile? Wie leistungsfähig ist Java in Bezug auf Datenmengen und Geschwindigkeit? Wie aufwendig ist die Programmierung? Wie schwierig ist die Programmierung?


----------



## Campino (21. Dez 2006)

> Wie leistungsfähig ist Java in Bezug auf Datenmengen und Geschwindigkeit?


Du willst zu jedem Datensatz nur die Freunde und die Freunde der Freunde darstellen, ab den Freunden der Freunde kannst du also sämtliche Beziehungen ignorieren. Mit diesen musst du dich erst beschäftigen, wenn sie angeklickt werden. Das begrenzt die zu bearbeitende Datenmenge auf maximal 911 (1 Basis-Knoten+10 Freunde+die 10*10 Freunde der Knoten, wobei einer dieser 10 immer der Basisknoten ist, d.h. 9 Freunde, damit sind wir in der dritten Ebene bei 90, jeder davon hat 9+den Vorgänger Freunde, macht 810, also 1+10+90+810=911). Die Grenzen der Datenverarbeitung sehe ich eher bei der Übertragungsgeschwindigkeit Datenbankserver-Anwendung als bei Java. Wenn du allerdings einen sehr langsamen Client hast, kann das schon mal zum Tragen kommen. 



> Wie aufwendig ist die Programmierung? Wie schwierig ist die Programmierung?


Das größte Problem wird sein, den 3D Kram auf die Reihe zu kriegen. Wie kompliziert das ist, kann ich dir nicht genau sagen. Für dieses Projekt würde ich, wegen der Web-fähigkeit, mit Java3D arbeiten. Mit dieser Bibliotheke bin ich leider nicht vertraut, ich denke aber, dass das schaffbar ist. Dann brauchst du Datenbank-Krams, musst also vom Applet auf den Server zugreifen und die Daten von dort holen. Eventuell würde ich ein zusätzliches serverseitiges Tool, z.B. ein Servlet dort die Daten sortieren lassen und nur das Benötigte senden. Dann einen Algorithmus zur Anordnung der Daten...da hab ich spontan keine Idee...ich denke das ist so mittel, nichts für den absoluten Anfänger, für jemand halbwegs erfahrenes eine nette Übung, für einen Profi kein Problem...vorrausgesetzt du hast eine Idee für den Algorithmus, der Rest müsste eigentlich Standardkrams sein. Die größte Barriere ist in meinen Augen also der logische Kram mit dem Anordnungs-Algorithmus. 



> Mit welcher Technologie kann das vorhaben in Bezug auf die obenstehenden Kriterien realisiert werden bzw. kann das Vorhaben mit Java realisiert werden. Wenn ja, wo liegen die Vorteile? Wo liegen die Nachteile?


*Technologie:* 
*Ein Datenbankserver*, eventuell Servlets zum Vorsortieren der Daten, dass ist aber nicht unbedingt erforderlich. 
*Java3D* zur 3D-Darstellung, ich rate zu Java3D, weil das die am weitesten verbreitete Technik zur 3D-Darstellung in Java sein müsste.  Die Verwendung andere Tool wie JOGL oder des für die Spieleprogrammierung gedachten jlwgl wäre aber auch möglich. 
*Netzwerkprogramierung: *Sockets zum Übertragen der Daten. Eventuell Datenbankzugriff vom Applet aus...

*Vorteile von Java: *
*Plattformunabhängigkeit* Linux, MacOS, Windows, egal was beim User rennt, alles ist möglich
*Applet*  Die Anwendung kann via Applet in eine Webseite eingebaut werden. Das wird bei anderen Techniken schwierig. Mir fallen spontan nur ActiveX und Flash ein. Bei ActiveX ist man auf Windows beschränkt, außerdem ist das oft deaktiviert. Bei Flash bin ich mir nicht sicher, wie gut die 3D-Darstellung ist. Außerdem weiß ich nicht, ob ein Datenbankkontakt zum Laden der Daten möglich ist. 
Für Java spricht äußerdem, dass ein eventuelles Vorsortier-Servlet in der selben Sprache geschrieben werden kann, man muss also nicht zwei Sprachen beherrschen, falls man mal Änderungen vornehmen muss. 

*Nachteile von Java: *
*Dekompilierbar* Man kann die Bytecodes in Sourcecodes zurückübersetzen. das ist, wenn man nicht möchte, dass Code geklaut wird, eventuell nicht wünschenswert. Je nach Anwendungsbereich allerdings auch egal. Ärgerlich ist die Möglichkeit, den Code zu dekompilen, Änderungen vorzunehmen und wieder zu kompilen. Damit kann man z.B. in Onlinegames schummeln. In keinem Fall sollte man Passwörter oder Ähnliches in den Code schreiben oder Informationen, die der User nicht haben darf und das Applet eigentlich nicht braucht zu übertragen. Deshalb empfiehlt sich hier ein Vorsortier-Servlet, dass Passwörter verwaltet und überflüssige Daten zurückhält. 

so, ich hoffe das hilft etwas, 
campino


----------



## Wildcard (22. Dez 2006)

Die schwierigsten Sachen sind mit sicherheit der Algorithmus und die 3D Darstellung.
Am besten du kaufst dir erstmal ein Buch über Graphen-Theorie und Graphzeichnen.
Java3D hab ich persönlich nie benutzt, sollte aber eine lösbare Aufgabe sein.  :wink:


----------



## cgu (22. Dez 2006)

Vielen dank für deinen ausführlichen Beitrag, Campino. Auch für deinen Beitrag, Wildcard.

Also wie es mir scheint, ist meine Befürchtung eingetreten, dass der Algorythmus zum Anordnen der Datensätze die größte Schwierigkeit zu sein scheint. An diesem Problem bin ich aber bereits dran, das bekomme ich hin. In der Theorie und Algorythmus-Entwicklung bin ich relativ fit. Nur progammieren kann ich nicht 

Ich werde dieses Projekt nicht selbst programmieren, daher ist es unter dem Aspekt einen geeigneten Programmierer zu finden nicht wirklich wichtig in welcher Sprache es umgesetzt wird. Da findet sich schon jemand. Lediglich die technischen Möglichkeiten woltle ich ausloten, und da hast du mir sehr geholfen. Letztendlich hat sich auch hier meine Vermutung bestätigt, dass nur Java oder Flash in frage kommt. In Flash müsste man allerdings die 3D-Engine "faken", soweit ich informiert bin.

Für den Algorythmus bin ich nun an einem grundsatz am überlegen. Ich denke, dass ich prinzipiell zwei möglichkeiten habe:

1. 
Ich beschränke den Raum der zur Darstellung genutzt wird auf eine "Hemisphäre", sodass alles in Front der "Kamera" dargestellt wird. Das würde das ganze relativ einfach gestalten, da man eine Art dreidimensionale  Baumstruktur wählen könnte. Im ersten Schritt würde ich dann die Vertiefung  über Rekursion abfragen und darstellen und lediglich in eine Richtung (von dem aktuellen Datensatz ausgehend) die Beziehungen abfragen. Im zweiten Schritt kämen dann die Querverweise. Bei diesem Verfahren müsste auf die Darstellung geachtet werden, damit die Abstände so gewählt werden, dass alles gut darstellbar ist, da der Benutzer das bild nicht rotieren oder bewegen kann. (Siehe Abb. 1).

2. 
Es wird der komplette dreidimensionale Raum genutzt. Dies hat den Vorteil, dass man nicht darauf achten müsste, dass alles gut sichtbar ist, da der Benutzer den Raum frei rotieren lassen kann (immer: um die eigene Achse). Es müsste eldiglich der Abstand der einzelnen Elemente geregelt werden. Querverweise dürften dann keine Schwierigkeiten machen. Hierbei müsste man allerdings wirklich auf eine 3D-Engine zugreifen können. Mit „faken“ ist da nicht mehr viel glaub ich .... Java könnte das also leisten denke ich.

Ich denke, ich werde versuchen, es in Variante 2. Umzusetzen. Vor allem wird das effektvoller aussehen. Wie seht ihr das?


----------



## Campino (22. Dez 2006)

Ich finde die Darstellung mit Querverbindungen nicht so super schön...

Der "11. Datensatz E3" ist mit dem "2. Datensatz E2" verbunden. Wenn man ihn nun nicht rechts unter "Datensatz E2" darstellen würde, sondern links unter diesem, könnte man verhindern, dass sich die Verbindungen E1-E2 sowie 11.D E3 und 2.D E2 kreuzen, was in meinen Augen die Übersichtlichkeit erhöhen würde. Wenn man dann noch 5.D E3 oberhalb der Verbindung E1-2.D E2 darstellt, hätte man noch eine solche Kreuzung vermieden. Mit Verschieben von 1. D E2 nach oben, 3.D E3 nach oben und 2.D E3 nach oben ließen sich ebenfalls viele Kreuze vermeiden. Das sollte ein geeigneter Algorithmus in meinen Augen leisten...ob du dann eine Hemispäre oder ein Ganzuniversum nutzt, ist eigentlich egal, aber den Baum rotieren zu können ist natürlich sehr effektvoll. 

campino


----------



## Illuvatar (22. Dez 2006)

Ich hab mal ein dreidimensionales Mind-Mapping-Programm geschrieben, ich dachte, es könnte für dich interessant sein, wie dein Diagramm in diesem dargestellt wird. (Da ist der Algorithmus allerdings relativ simpel gehalten, die Unterelemente einfach kugelförmig um das Oberelement)

Screenshot

Das im Programm anzuschauen ist sicher interessanter; hier der Installer für das Progamm, hier ist die Mindmap-Datei, die ich zum Test erstellt habe, die kannst du gleich im Programm laden.
Noch dazu: Das Programm ist an einigen Ecken und Enden noch nicht ganz ausgereift  vor allem eine Hilfe fehlt. Wenn du selbst rumspielen willst, vor allem ein Tip: Klick mit der rechten Maustaste auf einen Mindmap-Knoten, im Kontextmenü kannst du fast alles machen.


----------



## M.L. (28. Dez 2006)

Auch hallo.

Irgendwie erinnert das Problem an den Geobereich: http://www.geodbs.de/inhalt.html

mfg M.L.


----------

