ORM-Frameworks sind eine häufig genutzte Möglichkeit, die Unterschiede zwischen
der objektorientierten Programmierung und der relationalen Datenspeicherung zu überbrücken.
Gleichzeitig sind rekursive Beziehungen in vielen Datenmodellen vorhanden, um
Hierarchien und andere baum- oder netzartigen Strukturen abzubilden. Diese Arbeit beschäftigt
sich mit der Problemstellung, wie man Daten in rekursiven Beziehungen in einem
ORM-Framework möglichst effizient aus der Datenbank laden kann. Zur Lösung des
Problems werden zuerst fünf verschiedene Lösungsansätze theoretisch entwickelt, und anschließend
in Entity Framework Core (EF Core) umgesetzt. Dies geschieht so, dass sich die
entstandenen Implementierungen wie normale LINQ-Abfragen in EF Core nutzen lassen.
Anschließend wurden die Lösungsansätze in verschiedenen Szenarien mit verschiedenen
SQL-Dialekten getestet, gefolgt von einer Betrachtung der Testergebnisse nach den verschiedenen
Test-Parametern. Diese Auswertung zeigt, dass Abfragen mit rekursiven allgemeinen
Tabellenausdrücken und Abfragen mit KeyLoading in den meisten Fällen am
effizientesten sind. Die anderen drei Ansätze sind entweder generell zu langsam oder nur
in speziellen Situationen nutzbar. Die Auswertung zeigt auch, dass die Performance der
verschiedenen Lösungsansätze immer von der Situation abhängig ist, besonders vom ge-
nutzten SQL-Dialekt.:1 Einleitung
2 Rekursive Beziehungen in relationalen Datenbanken
2.1 Definition
2.2 Rekursive Abfragen durch allgemeine Tabellenausdrücke
3 Object-Relational Mapping und Entity Framework Core
3.1 Object Relational Impedance Mismatch
3.1.1 Konzepte der objektorientierten Programmierung
3.1.2 Konzepte von relationalen Datenbanken
3.1.3 Probleme durch Unterschiede zwischen den Konzepten
3.2 Überbrückung des Impedance Mismatch durch Object-Relational Mapping
3.2.1 ORM-Frameworks
3.2.2 Allgemeine Lösungsansätze
3.2.3 Zugehörige Daten laden
3.3 Entity Framework Core
3.3.1 Generierung des Datenbankschemas
3.3.2 Abfragen mit LINQ
3.3.3 C# Expressions
3.3.4 Ablauf einer Abfrage in Entity Framework Core
3.3.5 Der ChangeTracker
3.3.6 Abfragen mit RawSql
4 Rekursive Abfragen in ORM Frameworks
4.1 Allgemeine Lösungsansätze
4.1.1 Anforderungen an die Lösungsansätze
4.1.2 Grundlegende Überlegungen
4.1.3 Rekursive allgemeine Tabellenausdrücke
4.1.4 Benutzerdefinierte Funktionen
4.1.5 Laden mit Hilfseigenschaft
4.1.6 Vertikales und horizontales Aufrollen
4.1.7 KeyLoading
4.2 Umsetzung in Entity Framework Core
4.2.1 Anforderungen im Kontext von Entity Framework Core
4.2.2 Rekursive allgemeine Tabellenausdrücke
4.2.3 Laden mit Hilfseigenschaft
4.2.4 Vertikales Aufrollen
4.2.5 Horizontales Aufrollen
4.2.6 KeyLoading
5 Test der Lösungsansätze
5.1 Testverfahren
5.1.1 Performancemessung in C#
5.1.2 Messung der SQL-Abfragedauer
5.2 Test-Szenarien
5.3 Auswertung der Testergebnisse
5.3.1 Anmerkungen zu Messungen mit TotalProcessTime
5.3.2 Auswertung nach verschiedenen Kriterien
5.3.3 Allgemeine Auswertung
5.3.4 Auswertung nach Verzweigungen
5.3.5 Auswertung nach Rekursionstiefe
5.3.6 Auswertung nach Anzahl der Strukturen
5.3.7 Auswertung nach dem Laden zugehöriger Daten
5.3.8 Auswertung nach SQL-Dialekt
5.3.9 Auswertung nach Beziehungstyp
5.3.10 Auswertung nach Schlüsseltyp
6 Fazit
A Messwerte
Identifer | oai:union.ndltd.org:DRESDEN/oai:qucosa:de:qucosa:83322 |
Date | 03 February 2023 |
Creators | Killisch, Benjamin Uwe |
Contributors | Hochschule für Technik, Wirtschaft und Kultur Leipzig |
Source Sets | Hochschulschriftenserver (HSSS) der SLUB Dresden |
Language | German |
Detected Language | German |
Type | info:eu-repo/semantics/acceptedVersion, doc-type:bachelorThesis, info:eu-repo/semantics/bachelorThesis, doc-type:Text |
Rights | info:eu-repo/semantics/openAccess |
Page generated in 0.0021 seconds