Normalisieren der Daten¶
Unter Normalisierung wird die Aufteilung von Attributen oder Tabellenspalten in mehrere Relationen oder Tabellen verstanden, sodass keine Redundanzen mehr enthalten sind.
Beispiel¶
Im folgenden Beispiel normalisieren wir die Sprache, in der die Bücher veräffentlicht wurden.
Hierfür erstellen wir zunächst eine neue Tabelle
languages
mit den Spaltenid
undlanguage_code
anlegen:6cursor.execute( 7 """CREATE TABLE languages 8 (id INTEGER PRIMARY KEY AUTOINCREMENT, 9 language_code VARCHAR(2))"""
Anschließend legen wir die Werte
de
unden
in dieser Tabelle an:12cursor.execute( 13 """INSERT INTO languages (language_code) 14 VALUES ('de')""" 15) 16 17cursor.execute( 18 """INSERT INTO languages (language_code)
Da SQLite
MODIFY COLUMN
nicht unterstützt, legen wir nun eine temporäre Tabelletemp
an mit allen Spalten ausbooks
und einer Spaltelanguage_code
, die die Spalteid
aus der Tabellelanguages
als Fremdschlüssel verwendet:22cursor.execute( 23 """CREATE TABLE "temp" ( 24 "id" INTEGER, 25 "title" TEXT, 26 "language_code" INTEGER REFERENCES languages(id), 27 "language" TEXT, 28 "author" TEXT, 29 "license" TEXT, 30 "release_date" DATE, 31 PRIMARY KEY("id" AUTOINCREMENT) 32 )"""
Nun übernehmen wir die Werte aus der
books
-Tabelle in dietemp
-Tabelle:35cursor.execute( 36 """INSERT INTO temp (title,language,author,license,release_date) 37 SELECT title,language,author,license,release_date FROM books"""
Die Angabe der Sprache in
books
alsid
der Datensätze aus derlanguages
-Tabelle intemp
übernehmen.40cursor.execute( 41 """UPDATE temp 42 SET language_code = 1 43 WHERE language = 'de'""" 44)
Nun können wir die Spalte
languages
in der Tabelletemp
löschen:55cursor.execute("""ALTER TABLE temp DROP COLUMN language""")
Bemerkung
Erst ab Python-Versionen ab 3.8, die nach dem 27. April 2021 veröffentlicht wurden, kann
DROP COLUMN
verwendet werden.Bei älteren Python-Versionen müsste eine weitere Tabelle angelegt werden, die nicht mehr die Spalte
languages
enthält und anschließend die Datensätze austempl
in diese Tabelle eingefügt werden.Auch die
books
-Tabelle kann nun gelöscht werden:57cursor.execute("""DROP TABLE books""")
Und schließlich kann die
temp
-Tabelle umbenannt werden inbooks
:59cursor.execute("""ALTER TABLE temp RENAME TO books""")