Normalisierung

Previous  Next

Viele Anwender benutzen eine Tabellenkalkulation zur Speicherung ihrer Daten. Dieses Datenmodell ist deshalb so beliebt, weil die meisten Anwender sehr schnell mit einer Tabellenkalkulation zurecht kommen. Alle Daten lassen sich sehr einfach nacheinander eingeben und schon beim ersten Blick auf die Tabelle kann man sich einen recht guten Überblick über die Datenstruktur verschaffen. Durch die einfache, zweidimensionale Struktur kann man mit einer Tabellenkalkulation scheinbar keine schwerwiegenden Fehler bei der Verwaltung seiner Daten machen. Somit ist eine Tabellenkalkulation sicher eine akzeptable Lösung zur Speicherung kleiner Datenbestände. Auch für unsere Fahrzeug-Verwaltung beginnen wir mit der Auflistung von Beispiel-Datensätzen in einer Tabellenkalkulation. Die Tabelle nennen wir Fahrzeuge.

 

 

Fahrzeuge

clip0263

Fahrzeug-Verwaltung mit einer Tabellen-Kalkulation. Die Gesamtübersicht ist gerade noch akzeptabel. Eine Menge Werte kommen jedoch vielfach vor und vor allem das Aufführen von Extras ist sehr problematisch.

 

 

Bei wachsender Datenmenge vergrößert sich der Pflegeaufwand jedoch enorm und sobald man größere Datenbestände ändern muss, oder Daten ganz gezielt filtern möchte, stößt man plötzlich auf enorme Probleme. So lassen sich vor allem Spalten in denen sich Listen befinden, nur unter erheblichen Aufwand durchsuchen, abändern, löschen und erweitern. Denn dazu müssen eine Menge Zellen durchsucht, editiert und überprüft werden. Das dauert nicht nur unverhältnismäßig lange, sondern ist gleichzeitig ein gewaltiges Fehlerrisiko. Die damit verbunden Speicherverschwendung fällt heutzutage zwar nicht mehr so stark ins Gewicht wie früher, sollte aber vor allem bei großen Datenbeständen nicht außer Acht gelassen werden.

 

Um aus der Tabelle nun ein vernünftiges Datenmodell zu machen, müssen Sie zuerst alle Spalten zerlegen, in denen Zellen mit mehreren Werten, sprich Listen vorkommen. Im Beispiel sind das auf den ersten Blick die Spalte Extras, aber auch die Spalte Fahrzeug, in der Marken und Modelle vorkommen und sogar die Spalten EZ, HU und AU, da hier Monate und Jahreszahlen vorkommen. Dieser Arbeitsschritt wird als Atomisierung bezeichnet.

 

Atomisierung

Erklärung

Aufteilung

in Spalten

 

Sie müssen für jede Kategorie die in der Spalte vorkommt eine eigene Spalte anlegen, wenn

1. in der Liste Werte verschiedener Kategorien vorkommen 

2. auch zu einem späteren Zeitpunkt keine neuen Kategorien mehr dazu kommen.

 

Situation im Beispiel:

In der Spalte Fahrzeug werden Werte aufgeführt, die zu verschiedenen Kategorien gehören. Die Kategorien sind Marken und Modelle.

 

Die Kategorien Marken und Modelle müssen auch zu einem späteren Zeitpunkt voraussichtlich nicht mehr erweitert werden. In der Realität gibt es zwar auch Sondermodelle, diese werden aber von der Beispiel-Anwendung nicht berücksichtigt.

 

Die Spalte Fahrzeug wird somit in die Spalten Marken und Modelle zerlegt und alle Werte werden entsprechend übernommen. 

 

 

Fahrzeugeclip0266

Fahrzeuge

clip0267

Ausgangs-Situation

Die Spalte Fahrzeuge wurde aufgeteilt in die Spalten Marke und Modell.

 

Aufzählungen

in neue Tabelle

 

Sie müssen die komplette Spalte in eine neue Tabelle ausgliedern, wenn

1. in der Liste gleichwertige Werte vorkommen, die alle zu einer gemeinsamen Kategorie gehören

2. später im praktischen Einsatz jederzeit neue Werte dazu kommen können

 

Situation im Beispiel:

In der Spalte Extras werden Werte aufgeführt, die zu einer einzigen Kategorie gehören, denn alle Werte sind Sonderausstattungs-Merkmale, die alle zu der einen Kategorie Extras gehören.

 

Es ist abzusehen, dass die Kategorie Extras zu einem späteren Zeitpunkt erweitert werden muss, da jederzeit Modelle mit neuen Extras auf den Markt kommen können.

 

Die Spalte Extras muss somit in eine neue Tabelle ausgegliedert werden. Die Werte werden jedoch nicht mehr als Liste, sondern systematisch untereinander in die Spalte Extras eingetragen. Um nachvollziehen zu können, welches Extra zu welchem Fahrzeug gehört, müssen Sie eine weitere Spalte für die ID des dazugehörigen Fahrzeugs anlegen. Schließlich sollten Sie auch in dieser Tabelle eine Spalte für die Datensatz ID anlegen, sodass sich eine Tabelle mit insgesamt 3 Spalten ergibt, die wir Ausstattungen nennen. Die ID ist i.d.R. ein Autowert, der von der Datenbank automatisch festgelegt wird, sodass jeder einzelne Datensatz immer eindeutig ist.

 

 

Ausstattungen

clip0268

 

 

Die Tabelle Ausstattungen ist nun mit der Tabelle Fahrzeuge über die ID des Fahrzeugs miteinander verknüpft. In der Tabelle Fahrzeuge wird die ID als Primärschlüssel bezeichnet, während dieselbe ID in der Tabelle Ausstattungen bei Fahrzeug_ID der  als Fremdschlüssel bezeichnet wird.

 

Formatierungen

entfernen

Zahlen sollten Sie nicht zusammen mit Formatierungszeichen wie EUR, , kw oder Tausender-Trennzeichen speichern, da Sie Ihre Werte in dieser Form nicht als Zahl, sondern als Zeichenkette abspeichern müssen. Zeichenketten brauchen jedoch deutlich mehr Speicher als Zahlen und zudem lässt sich gezieltes Suchen nur mit völlig unverhältnismäßig hohem Programmieraufwand realisieren. Im Daten-Editor können Sie für jedes Datenfeld individuelle Formatierungen hinterlegen, die später bei der Daten-Ausgabe automatisch angewendet werden. Entfernen Sie deshalb schon bei der Planung alle Formatierungszeichen aus Ihren Beispiel-Datensätzen.

 

Jahreszahlen

als Datum

In vielen Fällen kann es vorteilhaft sein, Jahreszahlen als Datums-Typ zu speichern. Im Beispiel ließen sich dadurch die Werte Monat/Jahr zu einem Datum verschmelzen. Als Timestamp (Zeitstempel)  abgespeichert ist sogar jedes Datum eindeutig. Wenn das Datum jedoch bei der Ausgabe wieder aufgesplittet werden muss, z.B. um Monat und Jahr in einem Formular aus einer Combobox auswählen zu können, dann müssen Sie dafür die entsprechenden Funktionen anwenden, was sicherlich mehr Aufwand bedeutet, als die Datums-Werte als Zahlen zu speichern. Es kommt also immer auf den Einzelfall an. Im Beispiel wählen wir den einfachsten Weg und teilen die Werte Monat/Jahr jeweils in 2 Spalten auf. Daraus ergeben sich die Spalten EZMonat, EZJahr, HUMonat, AUJahr, AUMonat, AUJahr.

 

Hinweis: Bei den Werten in der Spalte Tueren handelt es sich nicht um 2 Werte, sondern um eine reale Bezeichnung, die später als Zeichenkette abgespeichert werden muss.

 

 

Fahrzeuge

clip0272

Die neue Situation.

 

 

 

Das Speichern aller Datensätze in einer einzigen Tabelle führt auch dazu, dass sich in vielen Spalten immer wieder Werte wiederholen. Diese Wiederholungen werden als Redundanzen bezeichnet, die Sie im nächsten Schritt beseitigen müssen. Dazu müssen Sie für jede Spalte, in der sich Einträge wiederholen können, eine eigene Tabelle anlegen. Jede dieser Tabellen erhält zudem eine Spalte ID, um jeden Datensatz eindeutig kennzeichnen zu können. In die neuen Tabellen übernehmen Sie dann die entsprechenden Werte aus der Haupt-Tabelle. Anders als bisher in der Haupt-Tabelle wird in der neuen Tabelle jeder Wert nur noch 1 Mal aufgeführt. Im Gegenzug ersetzen Sie die Werte in der Haupt-Tabelle mit den dazugehörigen ID der neuen Tabellen. Die Tabellen sind somit über die verwendeten IDs miteinander verknüpft und stehen zueinander in Relation. Die entsprechenden IDs werden nun als Schlüssel bezeichnet. Die Namen der neuen Tabellen können Sie aus den Spaltennamen der Tabelle Fahrzeuge ableiten

 

Bei einem Blick auf die Beispieldaten fällt auf, dass in allen Spalten außer bei ID Redundanzen auftreten oder später im praktischen Einsatz auftreten können. Spalten, in denen ausschließlich Zahlen vorkommen, müssen Sie jedoch genauer prüfen. Ganzzahlen verbrauchen so wenig Speicherplatz, dass es in der Praxis meistens wenig Sinn macht, diese in eine eigene Tabelle auszulagern. Somit sind von der Maßnahme die Spalten Marke, Modell, Fahrzeugart, Kategorie, Farbe, Kraftstoff, Getriebe, Tueren und Schadstoffklassen betroffen, deren Daten Sie in eigene Tabellen auslagern müssen.

 

Hinweis: Da die IDs in der Tabelle Fahrzeuge aus einer fremden Tabelle stammen, werden diese als Fremdschlüssel bezeichnet, während die selben IDs in den neuen Tabellen als Primärschlüssel bezeichnet werden.

 

 

Marken

clip0274

Modelleclip0282

 

Fahrzeugarten

clip0275

Kategorienclip0276

Farben

clip0281

Kraftstoffe clip0277

Getriebe

clip0278

Tueren

clip0279

Schadstoffklassen

clip0280

 

 

 

Fahrzeuge

clip0283

Die neue Situation.

 

Tipp Objektorientierte Datenbank Caché: Neben Relationalen Datenbanken unterstützt XDEV 2  zudem die vom Hersteller InterSystems als postrelationale Datenbank bezeichnete Caché Datenbank. Anstatt verknüpfte Daten in Tabellen zu speichern, werden die Daten in Caché in Form von Objekten gespeichert. Für Entwickler die objektorientiert arbeiten ist es sehr viel komfortabler, direkt auf Objekte in der Datenbank zugreifen zu können, als auf Daten in verknüpften Tabellen. Caché besitzt jedoch auch eine SQL-Schnittstelle und zählt auch bei SQL-Zugriffen zu den performantesten Datenbanken.