Anwendungen von Äquijoins (Anwendungen von Äquijoins), Lektion, Seite 723361
https://www.purl.org/stefan_ram/pub/aequijoins_sql (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
SQL-Kurs

Normalisierung von Tabellen in SQL  (MySQL )

Vorbereitung

Skript (MySQL )

DROP SCHEMA S; CREATE SCHEMA S; USE S;

CREATE TABLE STADTLAND ( STADT VARCHAR ( 255 ), LAND VARCHAR ( 255 ), KONTINENT VARCHAR ( 255 ) );

INSERT INTO STADTLAND ( STADT, LAND, KONTINENT ) VALUES ( 'Paris', 'Frankreich', 'Europa' );
INSERT INTO STADTLAND ( STADT, LAND, KONTINENT ) VALUES ( 'Marseille', 'Frankreich', 'Europa' );
INSERT INTO STADTLAND ( STADT, LAND, KONTINENT ) VALUES ( 'Lyon', 'Frankreich', 'Europa' );
INSERT INTO STADTLAND ( STADT, LAND, KONTINENT ) VALUES ( 'Rom', 'Italien', 'Europa' );
INSERT INTO STADTLAND ( STADT, LAND, KONTINENT ) VALUES ( 'Mailand', 'Italien', 'Europa' );
INSERT INTO STADTLAND ( STADT, LAND, KONTINENT ) VALUES ( 'Neapel', 'Italien', 'Europa' );
INSERT INTO STADTLAND ( STADT, LAND, KONTINENT ) VALUES ( 'Tokio', 'Japan', 'Asien' );
INSERT INTO STADTLAND ( STADT, LAND, KONTINENT ) VALUES ( 'Yokohama', 'Japan', 'Asien' );
INSERT INTO STADTLAND ( STADT, LAND, KONTINENT ) VALUES ( 'Osaka', 'Japan', 'Asien' );

SELECT * FROM STADTLAND;

Normalisierung von Tabellen

Unter „Normalisierung“ einer Menge von Tabellen versteht man es, die Tabellenstruktur und -bedeutung so zu verändern oder zu gestalten, daß alle Regeln für relationale Datenbanken eingehalten werden. Es gibt viele verschiedene Arten der Normalisierung, je nachdem welche Regel dadurch berücksichtigt werden soll. In dieser Lektion zeigen wir ein prototypisches Beispiel einer Normalisierung: Die Aufteilung einer Tabelle in zwei kleinere Tabellen, von denen sie Join-abhängig ist.

Die folgende Tabelle zeigt zu einer Stadt an, in welchem Land und auf welchem Kontinent sie sich befindet.

+-----------+------------+-----------+
| STADT | LAND | KONTINENT |
+-----------+------------+-----------+
| Paris | Frankreich | Europa |
| Marseille | Frankreich | Europa |
| Lyon | Frankreich | Europa |
| Rom | Italien | Europa |
| Mailand | Italien | Europa |
| Neapel | Italien | Europa |
| Tokio | Japan | Asien |
| Yokohama | Japan | Asien |
| Osaka | Japan | Asien |
+-----------+------------+-----------+
Aussprachehinweis
Lyon /lijɔ̃/

Wenn wir einmal annehmen, daß jedes Land, das für diese Tabelle in Frage kommt, sich immer ganz auf einem Kontinent befindet. so enthält diese Tabelle die Information über den Kontinent eines Landes mehrfach. Informationen sollten jedoch nicht mehrfach abgespeichert werden.

Die Wiederholung eines Wortes, wie »Frankreich« alleine ist noch keine Redundanz (unnötige Wiederholung einer Information), denn ein einzelnes Wort ist keine Aussage. Die Wiederholung eines Paares, wie »Frankreich | Europa« ist schon Redundanz, denn dieses Paar soll aussagen, daß Frankreich sich in Europa befindet.

In einer Datenbank sollte jede Information nur einmal abgespeichert werden.

Um die Redundanz zu eliminieren und die Tabellen in das übliche Format zu bringen, können wir die Tabelle in zwei Tabellen aufteilen. Die eine Tabelle gibt an, in welchem Land sich eine Stadt befindet. Die andere Tabelle gibt an, auf welchem Kontinent sich ein Land befindet.

Skript (MySQL )

DROP SCHEMA S; CREATE SCHEMA S; USE S;

CREATE TABLE STADT ( STADT VARCHAR ( 255 ), LAND VARCHAR ( 255 ));

INSERT INTO STADT ( STADT, LAND ) VALUES ( 'Paris', 'Frankreich' );
INSERT INTO STADT ( STADT, LAND ) VALUES ( 'Marseille', 'Frankreich' );
INSERT INTO STADT ( STADT, LAND ) VALUES ( 'Lyon', 'Frankreich' );
INSERT INTO STADT ( STADT, LAND ) VALUES ( 'Rom', 'Italien' );
INSERT INTO STADT ( STADT, LAND ) VALUES ( 'Mailand', 'Italien' );
INSERT INTO STADT ( STADT, LAND ) VALUES ( 'Neapel', 'Italien' );
INSERT INTO STADT ( STADT, LAND ) VALUES ( 'Tokio', 'Japan' );
INSERT INTO STADT ( STADT, LAND ) VALUES ( 'Yokohama', 'Japan' );
INSERT INTO STADT ( STADT, LAND ) VALUES ( 'Osaka', 'Japan' );

CREATE TABLE LAND ( LAND VARCHAR ( 255 ), KONTINENT VARCHAR ( 255 ) );

INSERT INTO LAND ( LAND, KONTINENT ) VALUES ( 'Frankreich', 'Europa' );
INSERT INTO LAND ( LAND, KONTINENT ) VALUES ( 'Italien', 'Europa' );
INSERT INTO LAND ( LAND, KONTINENT ) VALUES ( 'Japan', 'Asien' );

Konsole
SELECT * FROM STADT;
+-----------+------------+
| STADT | LAND |
+-----------+------------+
| Paris | Frankreich |
| Marseille | Frankreich |
| Lyon | Frankreich |
| Rom | Italien |
| Mailand | Italien |
| Neapel | Italien |
| Tokio | Japan |
| Yokohama | Japan |
| Osaka | Japan |
+-----------+------------+
Konsole
SELECT * FROM LAND;
+------------+-----------+
| LAND | KONTINENT |
+------------+-----------+
| Frankreich | Europa |
| Italien | Europa |
| Japan | Asien |
+------------+-----------+

Mehrere („n“) Städte können zu einem („1“) Land gehören. Deswegen spricht man hier auch von einer n:1-Beziehung  zwischen den beiden Tabellen.

Vorgestellte n:1-Beziehungen zwischen den beiden Tabellen
+-----------+------------+                          +------------+-----------+
| STADT | LAND | | LAND | KONTINENT |
+-----------+------------+ +------------+-----------+
| Paris | Frankreich ------------.--------------> Frankreich | Europa |
| Marseille | Frankreich ------------| .-----------> Italien | Europa |
| Lyon | Frankreich ------------' | .--------> Japan | Asien |
| Rom | Italien ------------------| | +------------+-----------+
| Mailand | Italien ------------------| |
| Neapel | Italien ------------------' |
| Tokio | Japan -----------------------|
| Yokohama | Japan -----------------------|
| Osaka | Japan -----------------------'
+-----------+------------+

Würden die Kontinente in der Basistabelle »LAND« alle in »Eurasien« umbenannt werden, würde sich dies in den abgeleiteten Tabellen der folgenden Übungsaufgabe sofort in richtiger Weise bemerkbar machen.

Durch ein Äquijoin der beiden Tabellen, der Gleichheit der Ländernamen verlangt, kann die ursprüngliche Tabelle als abgeleitete Tabelle oder als View wieder hergestellt werden. Obwohl in der abgeleiteten Tabelle die Information über den Kontinent eines Landes dann wieder in mehreren Zeilen erscheint, ist dies kein Verstoß gegen die Regel, daß dieselbe Information nicht mehrfach abgespeichert werden soll, weil die Information ja nicht in den abgeleiteten Tabellen gespeichert wird, sondern nur in den Basistabellenspeichern, und dort  ist diese Information jeweils nur einmal  abgespeichert.

Konsole
SELECT STADT, STADT.LAND, KONTINENT FROM STADT INNER JOIN LAND ON STADT.LAND = LAND.LAND;
+-----------+------------+-----------+
| STADT | LAND | KONTINENT |
+-----------+------------+-----------+
| Paris | Frankreich | Europa |
| Marseille | Frankreich | Europa |
| Lyon | Frankreich | Europa |
| Rom | Italien | Europa |
| Mailand | Italien | Europa |
| Neapel | Italien | Europa |
| Tokio | Japan | Asien |
| Yokohama | Japan | Asien |
| Osaka | Japan | Asien |
+-----------+------------+-----------+

Zitate *

en.wikipedia.org/wiki/Single_source_of_truth
In information systems design and theory, single source of truth (SSOT), is the practice of structuring information models and associated schemata such that every data element is stored exactly once.

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram723361 stefan_ram:723361 Anwendungen von Äquijoins Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723361, slrprddef723361, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/aequijoins_sql