{"id":55000555,"date":"2008-02-01T00:00:00","date_gmt":"2020-05-06T15:18:56","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=555"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Datenhierarchien_in_Access","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Datenhierarchien_in_Access\/","title":{"rendered":"Datenhierarchien in Access"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg01.met.vgwort.de\/na\/2178ad37b655415c928149c0ab0afe1d\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Hierarchieartige Strukturen spielen im Datenbankentwurf immer wieder eine gro&szlig;e Rolle. Bereits eine schlichte 1:n-Beziehung stellt eine Hierarchie dar. Um in der Dateneingabe einerseits flexibel zu bleiben, aber dennoch Benutzerfehler schon durch den Entwurf zu verhindern, muss man einige Dinge beachten. In diesem Beitrag zeigen wir die Fallstricke beim Entwurf hierarchischer Datenstrukturen auf.<\/b><\/p>\n<p>Bei diesen Fragen stehen drei Themen im Mittelpunkt:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Die Datenmodellierung: Welche Tabellen, welche Felder<\/li>\n<li class=\"aufz-hlung\">Die Abfragetechnik: Wie kommen Sie an gew&uuml;nschte Informationen heran<\/li>\n<li class=\"aufz-hlung\">Die Pr&auml;sentation: Wie stellen Sie die Daten &uuml;bersichtlich dar<\/li>\n<\/ul>\n<p>In diesem Artikel geht es zun&auml;chst um den ersten Teil, die Datenmodellierung.<\/p>\n<h2>Hierarchien<\/h2>\n<p>Es gibt mehrere Arten von Hierarchien, die sich zun&auml;chst in Begriffshierarchien und Objekthierarchien aufteilen:<\/p>\n<p>Begriffshierarchien oder logische Hierarchien liegen vor, wenn die Objekte, die Sie in Form von Datens&auml;tzen verwalten wollen, in einem Teil der zu speichernden Eigenschaften &uuml;bereinstimmen, sich aber in anderen unterscheiden. Dabei geht es nicht um die Eigenschaftsauspr&auml;gungen, also die Feldwerte, sondern um die Eigenschaften an sich beziehungsweise die Felddefinitionen.<\/p>\n<p>Nehmen wir an, Sie haben es in Ihrer Datenbank mit Firmen zu tun, die sich in Kunden und Lieferanten aufteilen. Um Beziehungen mit referentieller Integrit&auml;t zu anderen Tabellen des Modells umzusetzen (etwa Kunde\/Auftrag, Lieferant\/Bestellung), brauchen Sie eine Lieferantentabelle und eine Kundentabelle. Sie ben&ouml;tigen durchaus unterschiedliche Informationen zu beiden &#8211; zu den Lieferanten erfassen Sie etwa Lieferrabatte oder durchschnittliche Lieferzeiten, zu den Kunden erfassen Sie Informationen, die f&uuml;r die Akquise wichtig sind und die Sie in Zusammenhang mit Lieferanten nie brauchten.<\/p>\n<p>Die Felddefinitionen beider Tabellen sind jedoch zu einem gro&szlig;en Teil identisch: Sowohl Kunden als auch Lieferanten definieren sich &uuml;ber einen Namen, eine Stammadresse und andere Informationen, denn sie geh&ouml;ren der gleichen Grundmenge an: den Firmen.<\/p>\n<p>Hier haben wir nun eine einstufige Begriffshierarchie: Firma &#8211; (Kundenfirma, Lieferantenfirma).<\/p>\n<p>Es gibt ein Feldb&uuml;ndel, das f&uuml;r Firmen generell gilt, und es gibt je ein Feldb&uuml;ndel, das speziell nur f&uuml;r Kunden oder Lieferanten gilt. So etwas nennt man Generalisierungs-Spezialisierungs-Struktur. In der objektorientierten Programmierung gibt es &auml;hnliches, dort ist daf&uuml;r die Bezeichnung IsA-Beziehung (&#8222;Ist-Ein-Beziehung&#8220;) &uuml;blich. Klassenprogrammierer modellieren so etwas mit Vererbung von Klassen.<\/p>\n<h2>Implementieren von Begriffshierarchien<\/h2>\n<p>Wie aber modelliert ein Datenbankprogrammierer diese Beziehung in einer Tabellenstruktur Nun, genau hier kommen die oft verkannten 1:1-Beziehungen zum Einsatz. Genauer sind es 1:1\/0-Beziehungen: sie sind also nicht symmetrisch. Es gibt eine Mastertabelle, die 1-Seite, die die Felder f&uuml;r die h&ouml;here Generalisierungsstufe aufnimmt (im Beispiel die Firma), und Detailtabellen, die 1\/0-Seite, die die Felder f&uuml;r die st&auml;rker spezialisierten Stufen aufnehmen &#8211; im Beispiel Kunde und Lieferant.<\/p>\n<p>Solche Hierarchien k&ouml;nnen nat&uuml;rlich auch mehrstufig werden. Ein Beispiel ist die biologische Systematik: <b>Reich\/Stamm\/Klasse\/Ordnung\/Familie\/Gattung\/Art<\/b>:<\/p>\n<p>&#8211; Wirbeltiere<\/p>\n<p> &#8211; Fische<\/p>\n<p> &#8211; Reptilien<\/p>\n<p> &#8211; V&ouml;gel<\/p>\n<p> &#8211; S&auml;ugetiere <\/p>\n<p> &#8211; Paarhufer<\/p>\n<p> &#8211; Unpaarhufer<\/p>\n<p> &#8211; Raubtiere<\/p>\n<p> &#8211; Nagetiere<\/p>\n<p>Die anzulegenden Tabellen tragen dabei nicht etwa die Namen <b>Klasse<\/b>, <b>Ordnung<\/b>, <b>Familie<\/b>, <b>Gattung<\/b> und <b>Art<\/b>, sondern Sie m&uuml;ssen tats&auml;chlich eine Tabelle <b>Wirbeltiere<\/b> f&uuml;r die Eigenschaften, die allen Wirbeltieren gemeinsam sind, anlegen. Damit nicht genug: Es gibt weitere Spezialtabellen namens <b>Fische<\/b>, <b>Reptilien<\/b>, <b>V&ouml;gel <\/b>und <b>S&auml;uger<\/b> und dann in einer weiteren Stufe noch Spezialtabellen zweiter Ordnung wie <b>Huftiere<\/b> und <b>Raubtiere<\/b> oder bei den Reptilien <b>Schlangen<\/b>, <b>Eidechsen<\/b> und <b> Schildkr&ouml;ten<\/b>.<\/p>\n<p>Umfangreiche Begriffshierarchien erfordern also eine Vielzahl von Tabellen. Zum Gl&uuml;ck sind die meisten derartigen Hierarchien in betriebswirtschaftlichen Anwendungen sehr flach, sodass sich die Tabellenzahl in Grenzen h&auml;lt.<\/p>\n<p>Der Aufbau der Tabellen ist nicht sonderlich schwer: Auf der obersten Ebene wird ein Schl&uuml;sselfeld angelegt (zum Beispiel ein Autowert-Feld) sowie Felder f&uuml;r alle Daten, die allen Individuen gemeinsam sind. Die Tabellen der zweiten Ebene enthalten als Prim&auml;rschl&uuml;ssel ein Feld, das die Beziehung zum Prim&auml;rschl&uuml;ssel der ersten Ebene aufbaut. Im Falle eines Autowertes auf oberster Ebene verwenden Sie hier eine Long-Integer-Zahl. Diese vererbt sich auf alle nachgeordneten Ebenen. Hinzu kommen die spezifischen Daten dieser Ebene. Die verschiedenen Tabellen auf einer Ebene haben dabei durchaus v&ouml;llig unterschiedliche Felder, was ja letztlich der Grund f&uuml;r die Aufteilung auf mehrere Tabellen ist. F&uuml;r die weiteren Ebenen setzt sich dies analog fort.<\/p>\n<p>Sie k&ouml;nnten nun auf die Idee kommen, einfach eine Tabelle <b>Tiere<\/b> anzulegen, die alle Felder enth&auml;lt oder, um ein praxisn&auml;heres Beispiel zu verwenden, nur eine Tabelle namens <b>Firmen<\/b>, die Kunden- und Lieferantenfelder mit aufnimmt. Dadurch entstehen jedoch verschiedene Probleme.<\/p>\n<p>Die Tabelle <b>Tiere <\/b>w&uuml;rde jetzt unter anderem die Felder <b>Fellfarbe <\/b>und <b>Flossenform <\/b>enthalten. Dadurch bleibt bei allen Nichtfischen das Feld mit den Flossen leer und kein Nichts&auml;uger braucht das Feld zum Eintragen einer Fellfarbe.<\/p>\n<p>Dadurch wird zun&auml;chst die NULL-Wert-Semantik ruiniert, da NULL jetzt nicht mehr wie gefordert f&uuml;r prinzipiell existierende, aber noch nicht bekannte Daten steht, sondern f&uuml;r Daten, die gar nicht existieren k&ouml;nnen.<\/p>\n<p>Angenommen keines dieser spezialisierten Felder w&uuml;rde zwingend eine Eingabe erfordern. Dann k&ouml;nnen Sie, wenn keines dieser Felder ausgef&uuml;llt ist, nicht mehr unterscheiden, um welche spezielle Gruppe es sich handelt. Also brauchen Sie ein Typfeld, das diese Information liefert. Der Benutzer kann dann aber problemlos die Kategorie <b>Fisch <\/b>ausw&auml;hlen und dazu die <b>Fellfarbe <\/b>ausf&uuml;llen. Ergo: Die Datenbank bietet die strukturelle M&ouml;glichkeit, widerspr&uuml;chliche Informationen einzugeben.<\/p>\n<p>Wenn nun eines oder mehrere solcher Felder zwingend eine Eingabe erfordern, zum Beispiel die Fellfarbe bei S&auml;ugetieren, tritt das erste Problem auf: Sie k&ouml;nnen das Feld nicht auf <b>Eingabe erforderlich<\/b> stellen, da dieses etwa bei Fischen nicht ausgef&uuml;llt werden darf.<\/p>\n<p>Und schlie&szlig;lich stellt sich noch ein weiteres Problem: Zwischen Teilen dieser zusammengew&uuml;rfelten Tabelle und anderen Tabellen sollen Beziehungen bestehen. Zum Beispiel wollen Sie eine Beziehung zwischen Kunden und Auftr&auml;gen und zwischen Lieferanten und Bestellungen herstellen. Wenn beide zusammen in einer Tabelle namens <b>Firmen<\/b> gespeichert sind, steht diese auf der einen Seite der Beziehung.<\/p>\n<p>Das Datenbanksystem kann nun aber Fehleingaben wie die Zuordnung eines Lieferanten zu einem Auftrag nicht mehr &uuml;ber referentielle Integrit&auml;t verhindern. Fehleingaben kann man hier nicht mehr durch die reine Tabellenstruktur, sondern nur noch durch eine entsprechende Programmierung vermeiden.<\/p>\n<p>Die Variante mit je einer Lieferanten- und Kundentabelle vermeidet diese Probleme, ersetzt sie aber durch neue.<\/p>\n<p>Eine Liste aller Firmen erhalten Sie beispielsweise nur &uuml;ber eine UNION-Abfrage auf Teile dieser Tabellen. F&uuml;r Firmen, die gleichzeitig Lieferant und Kunde sind &#8211; das kann es ja durchaus geben -, g&auml;be es direkt zwei Datens&auml;tze, je einen in der Lieferanten- und in der Kundentabelle. Dies f&uuml;hrt dazu, dass &auml;nderungen der Firmendaten an mehreren Stellen notwendig sind. Bei Verwendung von Autowerten hat dieselbe Firma als Kunde und Lieferant verschiedene Prim&auml;rschl&uuml;ssel. Durch einen Vertipper im Firmennamen bei der doppelten Eingabe entstehen inkonsistente Daten.<\/p>\n<p>Somit bleibt nur die M&ouml;glichkeit, Begriffshierarchien auch regelgerecht mit 1:1\/0-Beziehungen aufzubauen.<\/p>\n<p>Es ist nat&uuml;rlich legitim, durch Wahl abstrakterer Begriffe f&uuml;r die Felder die Tabellenanzahl m&ouml;glichst klein zu halten. Zum Beispiel k&ouml;nnten Sie statt der Felder <b>Fellfarbe<\/b> (S&auml;uger), <b>Schuppenfarbe<\/b> (Fische) oder <b>Federfarbe<\/b> (V&ouml;gel) die zwei Felder <b>Farbe <\/b>und <b>Ummantelungsart<\/b> auf der Ebene <b>Tier<\/b> verwenden.<\/p>\n<h2>Arten von Begriffshierarchien<\/h2>\n<p>Man kann mehrere Sorten von Spezialisierungen unterscheiden:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Optional: Es kann Detaildatens&auml;tze geben.<\/li>\n<li class=\"aufz-hlung\">Obligatorisch: Es gibt einen Datensatz in mindestens einer Detailtabelle.<\/li>\n<li class=\"aufz-hlung\">Disjunkt: Es darf einen Datensatz in h&ouml;chstens einer Detailtabelle geben.<\/li>\n<li class=\"aufz-hlung\">Adjunkt: Es darf je einen Datensatz in mehreren Detailtabellen geben.<\/li>\n<\/ul>\n<p><!--30percent--><\/p>\n<p>Das Tierbeispiel ist disjunkt obligatorisch. Jedes Tier geh&ouml;rt zu je einer Klasse, Ordnung, Familie, Gattung und Art. Sie k&ouml;nnen zu einem Tier nicht einfach Teile der Hierarchie weglassen. Obendrein geh&ouml;rt jedes Tier zu h&ouml;chstens einer Klasse, Ordnung, Familie, Gattung und Art. Es darf also nicht mehreren Tabellen auf derselben Ebene zugeordnet sein.<\/p>\n<p>Das Firmenbeispiel ist adjunkt optional. Eine Firma braucht weder Lieferant noch Kunde zu sein (&#8222;sonstige Firma&#8220;), kann eines davon sein, aber auch beides zugleich.<\/p>\n<p>Aus den beiden Eigenschaftenpaaren lassen sich also vier Typen kombinieren. Das Festlegen eines davon ist &uuml;ber Trigger m&ouml;glich. Ohne weitere Trigger hat man den Typ adjunkt optional eingestellt.<\/p>\n<p>Das Fehlen von Triggern ist nat&uuml;rlich ein schweres Manko von Access, insbesondere da diese per definitionem Bestandteil eines RDBMS sein m&uuml;ssen. Es bleibt hier nur der Notnagel, Trigger in den Eingabeformularen per Ereignisse und VBA-Code nachzustellen und den Zugriff anderer Clients ohne diese Kontrolle auf die Daten zu verhindern.<\/p>\n<p>Dieses Ungemach ist nat&uuml;rlich jedem Access-Entwickler vertraut, man kann es allenfalls durch einen SQL-Server oder eine vergleichbare Datenbankmaschine als Backend umgehen.<\/p>\n<h2>Zusammenfassung<\/h2>\n<p>Durch ein richtiges Modell ergeben sich folgende Vorteile:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Zu einem Datensatz existieren keine systematisch leeren Felder, daher kann auch keiner annehmen, diese Werte m&uuml;sse es geben und sie seien nur noch nicht gef&uuml;llt.<\/li>\n<li class=\"aufz-hlung\">Typspezifische Pflichtfelder sind m&ouml;glich.<\/li>\n<li class=\"aufz-hlung\">Der Typ wird daran erkannt, in welcher Detailtabelle ein Datensatz vorliegt.<\/li>\n<li class=\"aufz-hlung\">Die NULL-Wert-Semantik bleibt gewahrt.<\/li>\n<\/ul>\n<p>In Bild 1 sehen Sie, wie sich die zahlreichen Datens&auml;tze der obersten Ebene auf immer mehr spezialisierte Tabellen verteilen. Die Anzahl Tabellen wird je Ebene immer gr&ouml;&szlig;er, die Anzahl Datens&auml;tze in den Tabellen dabei kleiner. Letztlich zieht sich ein Datensatz einfach &uuml;ber mehrere Tabellen hin; erkennbar an der Grauf&auml;rbung bei einigen Beispieldatens&auml;tzen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_01\/Hierarchien-web-images\/1_opt.jpeg\" alt=\"1.TIF\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Begriffshierarchie<\/span><\/b><\/p>\n<h2>Objekthierarchien<\/h2>\n<p>Eine Objekthierarchie oder auch materiale Hierarchie wie in Bild 2 liegt vor, wenn die Objekte, die Sie in Form von Datens&auml;tzen verwalten wollen, zueinander in einem &Uuml;ber-Unter-Ordnungsverh&auml;ltnis stehen. Die Eigenschaften der Objekte, die sich als Tabellenfelder niederschlagen, sind dabei zun&auml;chst irrelevant; entscheidend ist die m&ouml;gliche Existenz mehrerer abh&auml;ngiger Datens&auml;tze zu einem Datensatz auf der n&auml;chsten Ebene, was analog auch f&uuml;r weitere Ebenen gilt.<\/p>\n<p>Nehmen wir an, Sie haben in Ihrer Datenbank Firmen, deren Angestellte f&uuml;r Sie als Ansprechpartner fungieren, die wiederum mit Ihnen jeweils mehrere Gespr&auml;che f&uuml;hren.<\/p>\n<p>Eine Firma regiert also beliebig viele Ansprechpartner, von denen jeder beliebig viele Gespr&auml;che regiert. Umgekehrt k&ouml;nnen Sie jedes Gespr&auml;ch genau einer Person zuordnen und diese wiederum genau einer Firma.<\/p>\n<p>Im Gegensatz zur Begriffshierarchie zerfasern die Tabellen also nicht beim Durchlaufen der Ebenen, sondern es gibt auf jeder Ebene nur eine Tabelle. Allerdings zerfasern hier die Datens&auml;tze, im typischen Fall geh&ouml;ren also zu jedem Datensatz auf der n&auml;chsten Ebene mehrere Datens&auml;tze. Der Hierarchiecharakter zeigt sich also bei der Begriffshierarchie auf Tabellenebene und hier, bei der Objekthierarchie, auf Datensatzebene.<\/p>\n<p>In der Klassenprogrammierung entspricht dieser Art der Hierarchie die mehrfache Instanzierung, wobei eine Oberklasse &uuml;ber eine Listeneigenschaft verf&uuml;gt, die mehrere Unterklassen derselben Art referenziert.<\/p>\n<h2>Arten von Objekthierarchien<\/h2>\n<p>Auch bei den Objekthierarchien gibt es mehrere Hierarchietypen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Reflexiv: Die Hierarchie ist selbstbez&uuml;glich; in der Folge m&uuml;ssen die Objekte aller Ebenen vom gleichen Typ sein (siehe Bild 3).<\/li>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_01\/Hierarchien-web-images\/r_opt.jpeg\" alt=\"r.TIF\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Reflexive Objekthierarchie<\/span><\/b><\/p>\n<li class=\"aufz-hlung\">Irreflexiv: Die Hierarchie ist nicht selbstbez&uuml;glich.<\/li>\n<li class=\"aufz-hlung\">Finit (geschlossen): Es gibt eine feste Anzahl Hierarchieebenen, die sich nie &auml;ndert.<\/li>\n<li class=\"aufz-hlung\">Infinit (offen): Die Ebenen k&ouml;nnen beliebig tief geschachtelt sein.<\/li>\n<\/ul>\n<p>Aus diesen beiden Eigenschaftenpaaren lassen sich diesmal nur drei Typen kombinieren. Eine finite Hierarchie kann reflexiv oder irreflexiv sein; eine infinite Hierarchie ist aber nur reflexiv m&ouml;glich.<\/p>\n<h2>Implementieren der Hierarchiearten<\/h2>\n<p>Geschlossene irreflexive Hierarchien sind der h&auml;ufigste Fall in der Datenbankentwicklung. Diese legen Sie einfach in Form aufeinander folgender 1:n-Beziehungen an. Ebene 1 wiederholt den Prim&auml;rschl&uuml;ssel von Ebene 0 als Fremdschl&uuml;ssel; Ebene 2 wiederholt den Prim&auml;rschl&uuml;ssel von Ebene 1 als Fremdschl&uuml;ssel und so weiter.<\/p>\n<p>Jede dieser Tabellen kann von anderer Bedeutung sein und andere Datenfelder enthalten als vorg&auml;ngige und nachfolgende Ebenen. Die Fremdschl&uuml;sselfelder m&uuml;ssen mit Eingabezwang versehen werden, da sonst nicht sichergestellt ist, dass alle Elemente bis auf die gleiche Ausgangsebene (&#8222;Wurzel&#8220;) zur&uuml;ckverfolgt werden k&ouml;nnen.<\/p>\n<p>In Bild 2 sehen Sie eine dreistufige Hierarchie; das k&ouml;nnte etwa das erw&auml;hnte Beispiel mit den Firmen (Ebene 0), Ansprechpartnern (Ebene 1) und Gespr&auml;chen (Ebene 2) sein. Die drei Datenbankobjekte weisen logischerweise v&ouml;llig unterschiedliche Felder auf. Die Tiefe solcher Hierarchien &auml;ndert sich nicht, es sei denn, das Vorbild der realen Welt, das Sie modelliert haben, w&uuml;rde sich &auml;ndern. Um die Hierarchie daran anzupassen, w&auml;re eine &auml;nderung der Tabellenstruktur erforderlich.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_01\/Hierarchien-web-images\/n_opt.jpeg\" alt=\"n.TIF\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Objekthierarchie<\/span><\/b><\/p>\n<p>Die Hierarchieinformationen (die Kaskade der Fremdschl&uuml;ssel) und die Nutzdaten eines Objekts (Firmenname, Telefon, Gr&uuml;ndungsjahr der Firma; Firmenfremdschl&uuml;ssel, Vor- und Nachname, Durchwahl des Ansprechpartners; Ansprechpartnerfremdschl&uuml;ssel, Zeit und Inhalt des Gespr&auml;chs) befinden sich in jeder Ebene in jeweils derselben Tabelle.<\/p>\n<p>Offene irreflexive Hierarchien sind logisch ausgeschlossen. Jede Ebene w&uuml;rde durch eine eigene Tabelle modelliert, w&auml;hrend die Anzahl der Ebenen gleichzeitig nicht feststeht. <\/p>\n<p>Die Datenbank w&auml;re also gezwungen, auf Benutzereingaben gegebenenfalls mit dem Hinzuf&uuml;gen von Tabellen, Erstellen von Beziehungen, respektive L&ouml;schen derselben und gleichzeitigem Hinzuf&uuml;gen oder L&ouml;schen verbindender Datens&auml;tze zu reagieren.<\/p>\n<p>Das ist mit dem Prinzip eines fixen logischen Datenschemas, das dem relationalen Gedanken zu Grunde liegt, nicht vereinbar.<\/p>\n<p>Reflexive geschlossene Hierarchien sind denkbar, kommen aber in der Praxis so gut wie nie vor. Ein Beispiel k&ouml;nnte Folgendes sein:<\/p>\n<p>Sie verwalten einen Verein, in dem es genau drei R&auml;nge gibt, die ganz au&szlig;erordentlich wichtig sind und laut Statuten niemals ge&auml;ndert werden d&uuml;rfen. Ein Zenturio ist mehreren Dekurionen vorgesetzt, ein Dekurio mehreren Legion&auml;ren. Jedes Vereinsmitglied geh&ouml;rt genau einem der drei R&auml;nge an. Der Rang ist eine reine Vorgesetzteninformation, zu der es sonst keine weiteren Daten gibt.<\/p>\n<p>Sie erstellen zun&auml;chst drei kaskadierende 1:n-Tabellen Zenturio, Dekurio, Legion&auml;r &#8211; analog zu Firma, Ansprechpartner, Gespr&auml;ch &#8211; mit allen erforderlichen Daten.<\/p>\n<p>Jetzt sollte Ihnen Zweierlei auffallen. Erstens: Alle drei Tabellen haben genau die gleichen Datenfelder, da ja alle logisch vom Typ Person sind. Zweitens: Wenn ein Mitglied einen neuen Rang bekommt, m&uuml;sste es mit allen Informationen aus der einen Tabelle gel&ouml;scht und gleichzeitig in eine andere eingef&uuml;gt werden. Beim irreflexiven Beispiel stellte sich dieses Problem nicht, da ein Gespr&auml;ch nicht irgendwann zur Firma bef&ouml;rdert wird.<\/p>\n<p>Idee: Alle Personendaten wie etwa Vorname, Nachname oder Geburtsdatum kommen in eine separate Personen-Tabelle. Die Tabellen <b>Zenturio<\/b>, <b>Dekurio <\/b>und <b>Legion&auml;r <\/b>enthalten nur noch je einen Prim&auml;r- und Fremdschl&uuml;ssel, der die reine Hierarchie darstellt.<\/p>\n<p>Mit einer Abfrage &uuml;ber alle Legion&auml;re k&ouml;nnen Sie sich &uuml;ber den Dekurion-Fremdschl&uuml;ssel der Legion&auml;r-Tabelle die zugeh&ouml;rigen Dekurionen anzeigen lassen und durch den Zenturionen-Fremdschl&uuml;ssel der Dekurionen-Tabelle die denen vorgesetzten Zenturionen. Sie merken sofort: Die Zenturionen-Tabelle brauchen Sie gar nicht: Einem Zenturio ist niemand &uuml;bergeordnet. Ergo wird die &uuml;berfl&uuml;ssige Tabelle entsorgt. Das Beziehungsschema sehen Sie in Bild 4.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_01\/Hierarchien-web-images\/H_opt.jpeg\" alt=\"H.TIF\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Reflexive geschlossene Hierarchie<\/span><\/b><\/p>\n<p>Die Beziehungen sind gew&ouml;hnliche 1:n-Beziehungen mit Eingabepflicht auf den Fremdschl&uuml;sseln <b>fiZ <\/b>und <b>fiD<\/b>, die 1:1\/0-Beziehung ist von <b>Person_1 <\/b>als Master nach <b>Legion&auml;r <\/b>als Detail erstellt. Eine n-stufige Hierarchie dieser Art beginnt also oben mit der Datentabelle, an die die 1:n-Kaskade von n-1 reinen Hierarchietabellen anschlie&szlig;t, und wird unten von einer 1:1-Beziehung auf die wiederholte Datentabelle abgeschlossen.<\/p>\n<h2>Reflexive offene Hierarchie<\/h2>\n<p>Dieser Hierarchietyp ist der kr&ouml;nende Abschluss. Wie Bild 3 zeigt, gibt es hier nicht mehr mehrere Ebenentabellen, die die hierarchische Ordnung herstellen, sondern nur noch eine Tabelle, welche die diesbez&uuml;glichen Informationen f&uuml;r alle Ebenen mit zwei Feldern aufnimmt. Hierarchieebenen erscheinen jetzt also nicht mehr horizontal als nebeneinanderstehende Tabellen, sondern vertikal als untereinanderstehende Datens&auml;tze.<\/p>\n<p>Daraus folgt, dass die Hierarchie durch blo&szlig;e Dateneingabe beliebig erweitert werden kann.<\/p>\n<p>Kein Licht ohne Schatten: Die Nachfahren eines Urelements muss man jetzt m&uuml;hsam in der Tabelle zusammensuchen:<\/p>\n<p>Das Urelement 1 hat die Kinder 4 und 5. 4 hat die Kinder 9, 10 und 11, die somit die Enkel von 1 sind. 9 wiederum hat die Kinder 21, 22, 23, 24, also die Urenkel von 1.<\/p>\n<p>Da die Hierarchie in ihrem Aufbau einem Baum entspricht, benutzt man hier auch gerne die entsprechende Terminologie.<\/p>\n<p>Die in der Hierarchie angeordneten Elemente hei&szlig;en daher auch Knoten.<\/p>\n<p>Ein Urelement, also ein Knoten, dem kein Knoten mehr &uuml;bergeordnet ist, hei&szlig;t Wurzel oder Root.<\/p>\n<p>Den Weg von Element 1 zu Element 22, also 1\/4\/9\/22, nennt man den Pfad zu 22.<\/p>\n<p>Endknoten, also solche, denen keine Knoten untergeordnet sind, hei&szlig;en Bl&auml;tter.<\/p>\n<p>Ein &uuml;bergeordneter Knoten hei&szlig;t Elter oder Parent; ein untergeordneter Knoten Kind oder Child.<\/p>\n<p>Die Art der Darstellung hei&szlig;t Adjazenzliste oder Vater-Zeiger (Parent Pointer).<\/p>\n<p>Vielleicht f&auml;llt Ihnen auf, dass man anhand eines Datensatzes gar nicht mehr wie bisher so ohne Weiteres wie&szlig;, auf welcher Ebene der Hierarchie man sich befindet.<\/p>\n<p>Insbesondere wie&szlig; man auch nicht, wie tief geschachtelte Nachfahren man unter einer Wurzel zu erwarten hat. Damit wie&szlig; man auch nicht mehr, wie viele Felder eine Abfrage haben m&uuml;sste, um auch den l&auml;ngsten Pfad noch in einer Zeile als nebeneinanderstehende Felder darzustellen.<\/p>\n<p>Mit reinen ANSI-SQL ist es auch in der Tat unm&ouml;glich, das herauszufinden. Das geht nicht ohne rekursive oder iterative Prozeduren, also entweder eine prozedurale Sprache wie VB(A) oder .Net oder die &uuml;ber den ANSI-Standard hinausgehenden M&ouml;glichkeiten, etwa die Sprache T-SQL des Microsoft SQL-Servers.<\/p>\n<p>Damit m&uuml;ssen Sie sich abfinden, da eine offene Hierarchie sich nun mal nicht anders modellieren l&auml;sst.<\/p>\n<p>Letzteres ist zugegebenerma&szlig;en nicht ganz richtig: Es gibt eine alternative Darstellungsweise in Form einer Teilmengenhierarchie (Nested Sets), die aber die Selbstbezogenheit der Hierarchie auch nicht ignorieren kann.<\/p>\n<p>Einige Dinge sind mit diesem Prinzip erheblich einfacher, insbesondere kommt man ohne Rekursion aus, da die entsprechenden Informationen in der Tabelle gespeichert werden. Anderes ist erheblich schwieriger.<\/p>\n<p>Schlussendlich k&ouml;nnen Sie weder so noch so die notwendige Arbeit vermeiden. Wir werden diesem Thema zu gegebener Zeit einen eigenen Beitrag widmen. <\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Entwurf der Tabellen f&uuml;r reflexive offene Hierarchien<\/p>\n<p>Nun sollen Sie noch erfahren, wie Sie die Tabellen f&uuml;r eine reflexive offene Hierarchie entwerfen m&uuml;ssen.<\/p>\n<p>Sie ben&ouml;tigen wie im Vereinsbeispiel eine Tabelle mit Nutzdaten, etwa die Tabelle <b>Person<\/b>. Dazu brauchen Sie jetzt nicht mehrere, sondern nur noch eine Hierarchietabelle, die ausschlie&szlig;lich die Anordnung der Knoten mittels der Schl&uuml;ssel verwaltet.<\/p>\n<p>Diese Tabelle hat genau zwei Felder: Einen Prim&auml;rschl&uuml;ssel (kein AutoWert!) &#8211; etwa in Form eines Zahlenfeldes &#8211; und ein Fremdschl&uuml;sselfeld vom gleichen Typ. Letzteres steht auf <b>Eingabe erforderlich <\/b>und muss Duplikate zulassen.<\/p>\n<p>Das Prim&auml;rschl&uuml;sselfeld steht dabei f&uuml;r den Kindknoten, das Fremdschl&uuml;sselfeld f&uuml;r den Elternknoten.<\/p>\n<p>Betrachten Sie noch einmal Abb. 3: <b>4 <\/b>ist also Kind von <b>1 <\/b>und Elter von <b>9<\/b>. Welche Eigenschaften (Name, Gewicht, Datum et cetera) diese Elemente unabh&auml;ngig von ihrer Stellung in der Hierarchie haben, steht in der Nutzdatentabelle unter dem jeweiligen Schl&uuml;ssel, der ruhig als AutoWert ausgef&uuml;hrt sein kann.<\/p>\n<p>Sowohl der Kindschl&uuml;ssel als auch der Elternschl&uuml;ssel m&uuml;ssen auf diese Nutzdatentabelle bezogen sein. Analog zum Vereinsbeispiel ergibt sich das Schema aus Bild 5: Die Nutzdatentabelle steht als oberstes Glied der Hierarchie in einer 1:n-Beziehung zum Elternschl&uuml;ssel der Hierarchietabelle. Den Abschluss bildet noch einmal die Nutzdatentabelle, diesmal als Master in einer 1:1-Beziehung zum Kindschl&uuml;ssel der Hierarchietabelle als Detail.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_01\/Hierarchien-web-images\/r2_opt.jpeg\" alt=\"r2.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Reflexive offene Hierarchie<\/span><\/b><\/p>\n<p>Passen Sie auf, dass Sie hierbei nicht in folgende Entwurfsfalle tappen: Sie k&ouml;nnten auf die Idee kommen, die Hierarchiebeziehung ohne eigene Hierarchietabelle direkt von der Nutzdatentabelle auf sich selbst zu erstellen (siehe Bild 6). Das sollten Sie nicht versuchen! Da die Wurzelelemente keine Eltern haben, bliebe hier das Fremdschl&uuml;sselfeld leer (siehe Bild 7). Dann kann auf dieses Feld aber nicht mehr wie gew&uuml;nscht ein Eingabezwang gelegt werden. Die herausgetrennte Hierarchietabelle umgeht dieses Problem. Wurzeln werden beim Abfragen leicht daran erkannt, dass sie im Fremdschl&uuml;ssel vorkommen, aber nicht im Prim&auml;rschl&uuml;ssel.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_01\/Hierarchien-web-images\/Falsch1_opt.jpeg\" alt=\"Falsch1.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Falsche Selbstverkn&uuml;pfung<\/span><\/b><\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_01\/Hierarchien-web-images\/Falsch2_opt.jpeg\" alt=\"Falsch2.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Verbotene Nullwerte bei Selbstverkn&uuml;pfung<\/span><\/b><\/p>\n<p>Allerdings ist auch der vorgeschlagene Entwurf mit einer eigenst&auml;ndigen Hierarchietabelle nicht v&ouml;llig problemfrei. Sie k&ouml;nnen hier zwar erzwingen, dass das Fremdschl&uuml;sselfeld in der Hierarchietabelle ausgef&uuml;llt wird, aber jeder Datensatz, der in der Nutzdatentabelle erfasst wird, gilt so lange als Wurzelelement, wie ihm in der Hierarchietabelle kein Elter zugeordnet wird.<\/p>\n<p>Sie m&uuml;ssen also den Benutzer in geeigneter Weise zwingen, neue Datens&auml;tze einem Elter zuzuordnen oder bewusst zu entscheiden, dass ein neues Wurzelelement vorliegt. Letztlich m&uuml;sste auch hier wieder ein Datenbanktrigger zum Einsatz kommen, den Sie in Access durch clientseitige Programmierung ersetzen m&uuml;ssen.<\/p>\n<p>Dabei m&uuml;ssen Sie sicherstellen, dass ein neuer Datensatz, wenn er nicht eine Wurzel darstellen soll, mit seinem Prim&auml;rschl&uuml;ssel in das Prim&auml;rschl&uuml;sselfeld der Hierarchietabelle &uuml;bernommen wird. Die Angabe eines Elters erzwingt dann die Eingabepflicht im Fremdschl&uuml;sselfeld.<\/p>\n<p>Die reine Struktur-Hierarchie ist ein gelegentlicher Spezialfall der reflexiven Hierarchie. Hier reduzieren sich die Nutzdaten oft gerade mal auf einen Namen. Die Knoten der Hierarchie als solche sind, von ihrer ordnenden Eigenschaft abgesehen, eigentlich v&ouml;llig uninteressant. Sie dienen nur als eine Art Registratur f&uuml;r die interessierenden Objekte, die 1:n den Endknoten untergeordnet sind und erheblich andere &#8211; meist auch mehr &#8211; Eigenschaften als die Knoten haben.<\/p>\n<p>Kommt Ihnen dies bekannt vor Ja, die Ordnerhierarchie von Windows. Die Ordner selbst sind ziemlich uninteressant und haben nur den Zweck, die Ablage der eigentlich wichtigen Objekte, der Dateien, zu strukturieren.<\/p>\n<p>Ein anderes Beispiel k&ouml;nnen Kontenhierarchien sein, die dazu dienen, Budgets von Kostenstellen nach einem bestimmten Begriffsraster zu gruppieren. Es gibt F&auml;lle, da haben solche Konten gerade mal einen Namen und eine dynamisch zu berechnende Knotensumme und dienen ansonsten nur der B&uuml;ndelung von Kostenstellen.<\/p>\n<p>Die Modellierung dieser Hierarchieart setzt sich aus den zuvor vorgestellten Hierarchiearten zusammen: Einer offenen reflexiven Hierarchie, an die eine geschlossene irreflexive Hierarchie angeh&auml;ngt ist (siehe Bild 8).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2008_01\/Hierarchien-web-images\/r2b_opt.jpeg\" alt=\"r2b.tif\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 8: Strukturhierarchie<\/span><\/b><\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Komplexe Hierarchien<\/p>\n<p>Die bisher gezeigten Strukturen k&ouml;nnen Sie nat&uuml;rlich beliebig kombinieren. Beginnen Sie mit Rechnern, die Festplatten enthalten. Diese wiederum enthalten Partitionen. Sie haben also zun&auml;chst eine fixe dreistufige Hierarchie aus unterschiedlichen Objekttypen. Auf den Partitionen haben Sie eine offene Ordnerhierarchie, an die sich noch einmal eine feste Minihierarchie mit Dateien anh&auml;ngt. Da zwar alle Dateien gemeinsame Eigenschaften haben, aber es auch typspezifische Eigenschaften gibt, kommt an das Ende der allgemeinen Dateitabelle noch einmal ein B&uuml;ndel Spezialisierungstabellen einer Begriffshierarchie.<\/p>\n<h2>Keine Hierarchie<\/h2>\n<p>Nach dem bisher Gesagten k&ouml;nnte man fast glauben, es sei sowieso alles hierarchisch. Das ist aber keineswegs so. Eine Struktur, die gerne als Beispiel f&uuml;r eine Hierarchie herangezogen wird, die St&uuml;ckliste, ist gar keine. Da St&uuml;cklisten in der Regel auf Objektklassen (zum Beispiel Normteile; es gibt viele Schrauben M8) aufbauen, handelt es sich nicht um eine Baumstruktur, sondern um eine reflexive Netzstruktur. Typischerweise entstehen St&uuml;cklisten dann auch aus m:n-Beziehungen und nicht aus 1:n-Beziehungen.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Sie haben nun gesehen, wie Sie die verschiedenen Arten von Hierarchien unterscheiden und modellieren k&ouml;nnen. Im n&auml;chsten Beitrag der Reihe wird es um Abfragetechniken und die erforderliche Programmierung gehen. Danach lernen Sie verschiedene M&ouml;glichkeiten kennen, Ihren Benutzern die hierarchischen Daten zu pr&auml;sentieren.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hierarchieartige Strukturen spielen im Datenbankentwurf immer wieder eine gro&szlig;e Rolle. Bereits eine schlichte 1:n-Beziehung stellt eine Hierarchie dar. Um in der Dateneingabe einerseits flexibel zu bleiben, aber dennoch Benutzerfehler schon durch den Entwurf zu verhindern, muss man einige Dinge beachten. In diesem Beitrag zeigen wir die Fallstricke beim Entwurf hierarchischer Datenstrukturen auf.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66012008,662008,44000021],"tags":[],"class_list":["post-55000555","post","type-post","status-publish","format-standard","hentry","category-66012008","category-662008","category-Tabellen_und_Datenmodellierung"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Datenhierarchien in Access - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Datenhierarchien_in_Access\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Datenhierarchien in Access\" \/>\n<meta property=\"og:description\" content=\"Hierarchieartige Strukturen spielen im Datenbankentwurf immer wieder eine gro&szlig;e Rolle. Bereits eine schlichte 1:n-Beziehung stellt eine Hierarchie dar. Um in der Dateneingabe einerseits flexibel zu bleiben, aber dennoch Benutzerfehler schon durch den Entwurf zu verhindern, muss man einige Dinge beachten. In diesem Beitrag zeigen wir die Fallstricke beim Entwurf hierarchischer Datenstrukturen auf.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Datenhierarchien_in_Access\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-06T15:18:56+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg01.met.vgwort.de\/na\/2178ad37b655415c928149c0ab0afe1d\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"20\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenhierarchien_in_Access\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenhierarchien_in_Access\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Datenhierarchien in Access\",\"datePublished\":\"2020-05-06T15:18:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenhierarchien_in_Access\\\/\"},\"wordCount\":4025,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenhierarchien_in_Access\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/2178ad37b655415c928149c0ab0afe1d\",\"articleSection\":[\"1\\\/2008\",\"2008\",\"Tabellen und Datenmodellierung\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenhierarchien_in_Access\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenhierarchien_in_Access\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenhierarchien_in_Access\\\/\",\"name\":\"Datenhierarchien in Access - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenhierarchien_in_Access\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenhierarchien_in_Access\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/2178ad37b655415c928149c0ab0afe1d\",\"datePublished\":\"2020-05-06T15:18:56+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenhierarchien_in_Access\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenhierarchien_in_Access\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenhierarchien_in_Access\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/2178ad37b655415c928149c0ab0afe1d\",\"contentUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/2178ad37b655415c928149c0ab0afe1d\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Datenhierarchien_in_Access\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Datenhierarchien in Access\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Datenhierarchien in Access - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Datenhierarchien_in_Access\/","og_locale":"de_DE","og_type":"article","og_title":"Datenhierarchien in Access","og_description":"Hierarchieartige Strukturen spielen im Datenbankentwurf immer wieder eine gro&szlig;e Rolle. Bereits eine schlichte 1:n-Beziehung stellt eine Hierarchie dar. Um in der Dateneingabe einerseits flexibel zu bleiben, aber dennoch Benutzerfehler schon durch den Entwurf zu verhindern, muss man einige Dinge beachten. In diesem Beitrag zeigen wir die Fallstricke beim Entwurf hierarchischer Datenstrukturen auf.","og_url":"https:\/\/access-im-unternehmen.de\/Datenhierarchien_in_Access\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-06T15:18:56+00:00","og_image":[{"url":"http:\/\/vg01.met.vgwort.de\/na\/2178ad37b655415c928149c0ab0afe1d","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"20\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Datenhierarchien_in_Access\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Datenhierarchien_in_Access\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Datenhierarchien in Access","datePublished":"2020-05-06T15:18:56+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Datenhierarchien_in_Access\/"},"wordCount":4025,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Datenhierarchien_in_Access\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/2178ad37b655415c928149c0ab0afe1d","articleSection":["1\/2008","2008","Tabellen und Datenmodellierung"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Datenhierarchien_in_Access\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Datenhierarchien_in_Access\/","url":"https:\/\/access-im-unternehmen.de\/Datenhierarchien_in_Access\/","name":"Datenhierarchien in Access - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Datenhierarchien_in_Access\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Datenhierarchien_in_Access\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/2178ad37b655415c928149c0ab0afe1d","datePublished":"2020-05-06T15:18:56+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Datenhierarchien_in_Access\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Datenhierarchien_in_Access\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Datenhierarchien_in_Access\/#primaryimage","url":"http:\/\/vg01.met.vgwort.de\/na\/2178ad37b655415c928149c0ab0afe1d","contentUrl":"http:\/\/vg01.met.vgwort.de\/na\/2178ad37b655415c928149c0ab0afe1d"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Datenhierarchien_in_Access\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Datenhierarchien in Access"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000555","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000555"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000555\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000555"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000555"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000555"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}