
Graphen helfen bei der Beantwortung von Konnektivitätsfragen in Softwareprojekten, wie der Bestimmung von Benutzerberechtigungen, der Reihenfolge der Komponenteninitialisierung und der Erkennung zirkulärer Prozesse.
Warum Graphen?
Javas Standardbibliotheken bieten Datenstrukturen für Listen und Maps, aber die Graphen-Funktionalität ist begrenzt. Bibliotheken wie JGrapht und Google Guava füllen diese Lücke.
Praktischer Anwendungsfall: Datenbank-Benutzerlöschung
Das Kernbeispiel betrifft das Entfernen von Benutzerdaten aus einer Datenbank unter Berücksichtigung von Tabellenabhängigkeiten. Die wichtigsten Herausforderungen waren:
- Unvollständige Foreign-Key-Informationen in der Datenbank
- Normalisierte Daten, die das Löschen abhängiger Datensätze erfordern
- Mögliche Zyklen im Datenmodell
Lösungsarchitektur
Datentypen
Für Table, TableColumn und ForeignKey werden unveränderliche Datenstrukturen mit der Immutables.org -Bibliothek verwendet.
Graph-Wrapper
Eine eigene Graph-Klasse, die JGraphts DirectedGraph umschließt, bietet Methoden wie hasPath() zur Bestimmung der
Konnektivität zwischen Tabellen-Knoten.
Visualisierung
Mit Graphviz wurden .dot-Dateien generiert, um Beziehungen zu visualisieren. Die GraphAsDot-Klasse transformiert
Graph-Strukturen in Graphviz-Syntax mit anpassbaren Attributen.
Filterung von Foreign Keys
Basierend auf Löschabhängigkeiten werden Foreign Keys gefiltert, um die relevanten Beziehungen für die Datenlöschung zu identifizieren.
Fazit
Graphenvisualisierung kommuniziert komplexe Beziehungen effektiv, besonders während Analysephasen. Der Ansatz wurde als “Flapdoodle Graph” zur Wiederverwendung paketiert. Als Alternative bietet Google Guava Graph-Funktionalität für Projekte, die zusätzliche Abhängigkeiten vermeiden möchten.
