banner.jpg
Web-Development und Tools Powered by WebSellerTM

 

Home

Praxis-Tips
  Umlaute/UTF-8
  Normalisierung
  OemToAnsi
  MySQL-Import
  Site-Suche
  City Desk
  DynDNS
  MXLookup
  SPAM

SDT

Support
  Downloads
  Kontakt

Impressum

Englisch

RSS Feed

Suche:

Web Search

Made with CityDesk


MySQL-Datenimport und Normalisierung

Von Antje Binas-Holz
Letzte Änderung: Samstag, 10. Januar, 2004

Die nachfolgend angegebenen Links verweisen auf Seiten mit detaillierteren Informationen zu den einzelnen Normalformen einer Datenbank:

Net-Lexikon
FH Stuttgart
InformIT


Eine Vielzahl von Artikeln im Web befaßt sich mit der Normalisierung von Datenbanken.  Die jeweiligen Informationen sind mitunter so komplex, daß sie den Leser eher abschrecken als ihm zu helfen. Ich möchte an dieser Stelle nicht noch einen theoretische Abhandlung zu den verschiedenen Normalformen hinzufügen. Dieser  Beitrag versucht statt dessen, ein in der Praxis oftmals vorkommendes Problem in den Griff zu bekommen:
Wie kann ich eine einzelne Excel-Tabelle, die alle möglichen Daten enthält, so in  mehrere MySQL-Tabellen konvertieren, daß sie der ersten Normalform entsprechen. Oder etwas anders ausgedrückt, eine typische Excel-Tabelle in eine "vernünftige" Datenbankform überführen.

 

Grundlagen der Normalisierung

Die Normalisierung einer Datenbank ist, einfach ausgedrückt,  der Versuch, die Daten so abzuspeichern, daß sie im Verlaufe der Zeit so einfach wie möglich gepflegt werden können. Dabei unterscheidet man in der Theorie meistens drei verschiedenen Normalformen mit entsprechenden Regeln:

  • Erste Normalform: Eliminiere alle wiederholt vorkommenden Informationen und erzeuge separate Tabellen für die entsprechenden Daten.
  • Zweite Normalform:  Alle Werte, die selbst keinen Schlüssel (oder Verweis) darstellen, sind abhängig vom Primärschlüssel der Tabelle.
  • Dritte Normalform: Kein Attribute hängt von anderen ab, die keinen Schlüssel darstellen. Mit anderen Worten, suche nach weiteren Feldern, die nicht von einem Schlüssel abhängig sind und in extra Tabellen abgespeichert werden können.

Soweit zur Theorie. Im weiteren Text wird nur die erste Normalform betrachtet. Datenbank-Puristen, oder soll ich sagen "Nerds",  versuchen natürlich stets, die höchst mögliche Normalform zu erreichen. Das ist zwar schön, hat aber oftmals wenig mit der Praxis zu tun. Denn da gibt es eine Gruppe von Computerbenutzern, die ihnen das Leben ziemlich scher machen:
 

Spreadsheet-Gurus

Die meisten von ihnen sind Excel-Experten. Sie versuchen,  jedes erdenkliche Problem mit ihrer beliebten Microsoft-Tabellenkalkulation  zu lösen, was die Datenpflege selbstverständlich einschließt. 
Ich muß zugeben, daß Excel mit der Zeit zu einer mächtigen Software gereift ist, die viele Bereiche der täglichen Arbeit abdecken kann. Das große Dilemma von Leuten, die fast ausschließlich mit Excel arbeiten aber ist, daß sie versuchen, alle Daten in eine einzige Excel-Tabelle hineinzustopfen.

 

Das Problem

Eigentlich ist es bereits gesagt. Viele Applikationsentwickler erhalten von ihren Kunden folgende Antwort auf die Frage, wo denn die Daten für das entsprechende Programm herkommen oder wie diese erfaßt werden:

"Kein Problem, wir erfassen alles mit Excel, hier ist die Tabelle!".

Nun gut, ich gebe zu, das ist nicht gerade eine ideale Situation, aber sie kann gelöst werden (sonst wäre dieser Beitrag ja auch überflüssig).

 

Die Lösung

Excel besitzt die eingebaute Fähigkeit, Tabellen als CSV-Datei abzuspeichern. Das ist der erste wichtige Schritt der Lösung. Alle gängigen Datenbanken, einschließlich MySQL, bieten die Möglichkeit, CSV-Dateien zu importieren. Sie können dazu PhpMyAdmnin, SqlDBU oder ImpSql (MySQL-Datenimport) benutzen. Allerdings erhalten Sie damit eine identische Abbildung der ursprünglichen Excel-Tabelle in MySQL. Die meisten Applikationen aber benötigen die Daten zumindest in der ersten Normalform. Diese ist nach dem Import nur mit genauen SQL-Kenntnissen erreichbar. Aber es gibt, wie so oft, eine Alternative:

ImpSQL besitzt unter anderem die Fähigkeit, eine Master- und mehrere Kindtabellen auf der Basis der importierten CSV-Daten automatisch zu erzeugen. Falls Sie eine entsprechende CSV-Datei haben, die nach MySQL in die erste Normalform überführt werden soll, dann können Sie das direkt hier ausprobieren. Geben Sie dazu die entsprechende Datei für den Upload und die Liste der Spalten, die in Kindtabellen abgespeichert werden sollen, an. Im Gegenzug erhalten Sie das Ergebnis als Datei-Download:

CSV-Datei:
Kind-Spalten(Komma als Trennzeichen):
Textfelder als UTF-8:

Hinweis: Die Daten werden auf dem Server nicht gespeichert sondern lediglich konvertiert. Alle dabei entstehenden temporären Dateien werden noch während der Verarbeitung des Requests wieder gelöscht.

 

Beispiel

Angenommen, die Excel-Tabelle enthält verschiedene Hardware-Artikel einer Warenwirtschaft  mit den Spalten Group1, Group2, Prod_ID, Caption, OS und Price.

 

 

Es ist ziemlich offensichtlich, daß die Spalten Group1, Group2 und OS Kandidaten für separate Tabellen sind, weil sie sich wiederholende Daten enthalten. In der Haupttabelle sollten dabei lediglich Verweise (Schlüssel, Ids) in die entsprechende Kindtabelle verbleiben.
Zunächst jedoch muss wird die Excel-Tabelle test.xls als CSV test.csv abgespeichert werden. Das Ergebnis ist folgende flache Datei:

Group1;Group2;Prod_ID;Caption;OS;Price
Komponenten;Grafikkarten;N350018;PINE SIS 315E;Win 98/200;29,00
Komponenten;Grafikkarten;N35Z018;XFX GF FX5600 AGP8X;Win 98/NT/;189,00
Komponenten;Grafikkarten;N35Z020;XFX GF FX5200 AGP8X;Win 9x/NT/;79,00
Komponenten;Grafikkarten;N35Z021;XFX GF FX5200 AGP8X;Win 98/200;89,00
Komponenten;Grafikkarten;N35Z026;XFX GEFORCE4 MX440SE AGP-4X;Win 98/200;59,00
Peripherie;Projektoren;M35Z183;PB8220 DLP-PROJECTOR;WIN/MAC;2449,00
Peripherie;Scanner;M35Z200;S2W 5450U;;89,00
Peripherie;Monitore;M35Z203;FP991;WIN/MAC;749,00
Peripherie;Projektoren;M35Z218;PB8230 DLP-Projektor;WIN/MAC;2809,00
Peripherie;Projektoren;M35Z219;PB7200 DLP-PROJECTOR;;2939,00
Peripherie;Projektoren;M35Z220;PB7220 DLP-PROJECTOR;;3339,00
Peripherie;Projektoren;M35Z221;PB2120 DLP-PROJECTOR;;1539,00
Peripherie;Projektoren;M35Z222;PB8120 DLP-PROJECTOR;WIN/MAC;1739,00
Peripherie;Projektoren;M350061;SL705S DLP-PROJECTOR;WIN/MAC;1329,00
Peripherie;Projektoren;M350062;7765PA DLP-PROJECTOR;WIN/MAC;1829,00
Peripherie;Projektoren;M350063;DX550 DLP-PROJECTOR;WIN/MAC;2339,00
Peripherie;Scanner;M350073;S2W 7400UT;Win 98/200;209,00
...

Diese Datei kann nun nach MySQL mit der oben dargestellten Eingabeform importiert werden. Dazu muß sie mit dem Browse-Button lokalisiert werden. Bevor der Upload gestartet wird, muß die Liste der Kindtabellen im zweiten Eingabefeld angegeben werden. Für das Beispiel sieht sie wie folgt aus:

Das Ergebnis (Datei-Download) kann z.B. als test.txt abgespeichert werden und hat folgenden Inhalt:


# MySQL-Dump created by SQL Database Import Utility
# HTTP-Host: www.sqldbu.com
# Date: 2004-01-10 15:43:08
# --------------------------------------------------------


CREATE TABLE test (Group1 INT(10) NOT NULL, Group2 INT(10) ...
INSERT INTO test SET Group1=1,Group2=1,Prod_ID='N350018', ...
INSERT INTO test SET Group1=1,Group2=1,Prod_ID='N35Z018', ...
...

# Structure Definition for Child Table 'Group1'

CREATE TABLE Group1 (Group1 INT(10) unsigned NOT NULL, ...

# Data for Child Table 'Group1'

INSERT INTO Group1 SET Group1=1, CAPTION='Komponenten';
INSERT INTO Group1 SET Group1=2, CAPTION='Peripherie';

# Structure Definition for Child Table 'Group2'

CREATE TABLE Group2 (Group2 INT(10) unsigned NOT NULL, ...

# Data for Child Table 'Group2'

INSERT INTO Group2 SET Group2=1, CAPTION='Grafikkarten';
INSERT INTO Group2 SET Group2=2, CAPTION='Projektoren';
INSERT INTO Group2 SET Group2=3, CAPTION='Scanner';
INSERT INTO Group2 SET Group2=4, CAPTION='Monitore';

# Structure Definition for Child Table 'OS'

CREATE TABLE OS (OS INT(10) unsigned NOT NULL, ...

# Data for Child Table 'OS'

INSERT INTO OS SET OS=1, CAPTION='Win98/2000';
INSERT INTO OS SET OS=2, CAPTION='Win98/NT';
INSERT INTO OS SET OS=3, CAPTION='Win98/NT/XP';
INSERT INTO OS SET OS=4, CAPTION='WIN/MAC';
INSERT INTO OS SET OS=5, CAPTION='N/A';
INSERT INTO OS SET OS=6, CAPTION='Win98/ME/XP';
INSERT INTO OS SET OS=7, CAPTION='Win98/2000/XP';

Die Datei  test.txt kann jetzt mit jedem gängigen MySQL-Tool importiert werden und der Job ist getan, die erste Normalform ist erzeugt worden.

 

Import mit bestehender MySQL-Verbindung

Dieser Modus des Tools kann zwar online demonstriert werden, allerdings ist dann die Frage, wie Sie an Ihre Daten kommen sollen. Besser ist es, das Archiv impsql-10.zip herunterzuladen, auszupacken und das Programm  lokal laufen zu lassen. Mehr Informationen dazu finden Sie im Beitrag MySQL-Datenimport.