Sie sind auf Seite 1von 358

Traducido del inglés al español - www.onlinedoctranslator.

com

Edwin Schicker

Bancos de datos y SQL

Una práctica orientada a la configuración


con ajustes en Oracle, SQL Server y MySQL

5., actualizado y actualizado


Edwin Schicker
Fakultät Informatik und Mathematik
OTH Ratisbona
Ratisbona, Alemania

ISSN 1615-8245
Informática y Práctica
ISBN 978-3-658-16128-6 ISBN 978-3-658-16129-3 (libro electrónico)
DOI 10.1007/978-3-658-16129-3
Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; Datos
bibliográficos detallados en Internet a través de http://dnb.d-nb.de abrufbar.

Springer Vieweg

© Springer Fachmedien Wiesbaden GmbH 1996, 1999, 2000, 2014, 2017

Springer Vieweg es la parte de Springer Nature


La empresa eingetragene Gesellschaft es Springer Fachmedien Wiesbaden GmbH
Die Anschrift der Gesellschaft es: Abraham-Lincoln-Strasse 46, 65189 Wiesbaden, Alemania
Vorwort

Datenbanken entstanden ab etwa 1960 aus der Notwendigkeit, die logischen Zugriffe auf die
immer größer werdenden Datenmengen der Großrechner zu vereinfachen und zu normieren.
Inzwischen haben Datenbanken längst ihren Siegeszug in nahezu allen Anwendungsbereichen
angetreten. Für diese rasante Entwicklung zeichnen vor allem drei Gründe verantwortlich:
Erstens stieg die Rechnerleistung in den letzten Jahrzehnten extrem an. Zweitens ermöglichen
die nach 1970 entwickelten relacionaalen Datenbanken ein intuitivas Erstellen von
Datenbanken mit einfachen Zugriffen. Und drittens unterstützen grafische Oberflächen den
Anwender und Datenbankdesigner dank einer intuitiva Benutzerführung.

Damit wird das Erstellen einer kleinen Datenbank fast zum Kinderspiel. Doch nur ein
korrektes Design gepaart mit wohlüberlegten strukturierten Zugriffen garantieren
Flexibilität, Zuverlässigkeit und eine problemlose spätere Erweiterung der Datenbank.
Primero un diseño optimizado basado en fundamentos teóricos y prácticos para la
coherencia y la integridad de un banco de datos. Nur so erhalten wir fehlerfreie
undwidespruchsfreie Datenbestände, die stets zugreifbar sind.
Dieses Buch entstand aus Vorlesungen zu Datenbanken, die ich für Informatiker und
Mathematiker an der Technischen Hochschule Regensburg seit vielen Jahren lese. Ich
möchte mit diesem Buch aber auch alle interessierten Laien und Nicht-Informatiker
bewusst ansprechen. Der theoretische Stoff wird mittels zahlreicher Beispiele sofort
praktisch angewendet. Regelmäßige Zusammenfassungen erleichtern die Wiederholung
und Reflexion des behandelten Stoffes. Zur Lernzielkontrolle dienen dem Autodidakten
die zahlreichen Übungsaufgaben. Der Praxisbezug wird unterstützt durch eine im Buch
fortlaufend verwendete Beispieldatenbank, die im Anhang ausführlich vorgestellt wird.
Este libro es para todos los programadores, con la ayuda de SQL en los bancos de
datos ampliados, y todos, los pequeños bancos de datos pequeños se envuelven, se
elevan y se mueven entre sí. Da viele Kapitel voneinander unabhängig sind, empfehle ich
dieses Buch ausdrücklich auch als Nachschlagewerk. Ein umfangreiches Kapitel zur
Datenbankprogrammierung erschließt zusätzlich die Welt des Internets und der
grafischen Oberflächen.
Ganz grob lässt sich dieses Buch in drei Teile gliedern. Muere Kap. 1 a 3 geben zunächst
einen Überblick über Datenbanken und beschäftigen sich dann intensiv mit Aufbau und
Diseño de bancos de datos relacionales. Estas cosas más teóricas se convertirán en dos piezas
durante la muerte en el Kap. 4 y 5 behandelte Datenbanksprache SQL intensiv angewendet und
dabei zusätzlich erheblich vertieft. El programa de Internet en Kap. 6 schließen diesen zweiten
Teil ab. Estoy dritten Teil ab Kap. 7 werden weiterführende Themen vorgestellt. Es finden sich
Kapitel zur Performance, zur Korrektheit der gespeicherten Daten, zu Möglichkeiten des
paraleloen Datenzugriffs, zum Schutz vor Datenverlusten oder unberechtigten Zugriffen und zu
verteilten und objektrelationalen Datenbanken.
Kapitel 1 bepricht die Vorzüge von Datenbanken gegenüber selbst verwalteten
Datenbeständen, erklärt die wichtigsten Datenbankbegriffe und gibt einen kleinen Überblick
über die Leistungsfähigkeit und Möglichkeiten von Datenbanken. Dieses Kapitel dient zur
Übersicht und Motivation und ist vor allem für den Anfänger empfehlenswert.
Los capítulos 2 y 3 se conectan con bancos de datos relacionales. Sie sind zusammen mit der
Sprache SQL ab Kap. 4 die zentralen Kapitel dieses Buches. Heer liegt der Fokus auf den
Methoden zum Erstellen einer Relationsalen Datenbank im Detail. Der Aufbau von Relationen
zusammen mit den beiden Integritätsregeln wird vorgestellt. Die Normalformen von
Relationen und das Entity-Relation-Modell como Basiswerkzeuge zum Design von Datenbanken
werden ausführlich behandelt.
Muere Kap. 4 y 5 führen praxisorientiert und umfassend in die Datenbankzugriffssprache
SQL ein, wobei an Hand von Beispielen der Stoff der Kap. 2 y 3 en posición vertical. Kapitel 4
befasst sich intensiv mit den Zugriffsmöglichkeiten auf Datenbanken mittels SQL. En Kap. 5
gehen wir einen Schritt weiter and erzeugen Datenbanken mit geeigneten SQL-Befehlen and
beschäftigen uns zusätzlich mit der Vergabe von Zugriffsrechten in SQL. Aquí también hay
temas relacionados con la seguridad y la integridad. En Kap. 6 Wird der SQL-Teil mit
umfangreichen Programmen abgeschlossen. Aquí encontrarás HTML y PHP directamente
desde Internet directamente a los bancos de datos.
Der dritte Teil dient der Weiterführung und Vertiefung. Comenzó en Kap. 7 mit einer Einer
Einführung in die Performance. En Kap. 8 folgen die im produktiven Einsatz sehr wichtigen
Themes Recovery und Concurrency. Es werden ausführlich die erforderlichen Maßnahmen
beschrieben, um einem plötzlichen Rechnerabsturz ruhig entgegenzusehen und um
Parallelzugriffe zu ermöglichen.
En Kap. 9 werden die Grundideen verteilter und objektrelationaler Datenbanken vorgestellt.
Dies beinhaltet die Grundregeln der Verteilten Datenbanken und erste Gehversuche mit der
objektrelationalen Erweiterung der Sprache SQL.
Esto se hace mediante Oracle, MySQL y SQL Server. Dank der normierten Sprache
SQL sind die meisten Beispiele dieseses Buches auch auf andere Datenbanken
directamente anwendbar. Todas las conexiones entre Oracle, SQL Server y MySQL se
encuentran en bisagras explícitas. El BeispieldatenbankBicicletaWird durchgängig
verwendet, besenders intensiv in den SQL-Kapiteln. Este banco de datosBicicletawird
im Anhang ausführlich vorgestellt und ist Basis für alle praktischen Übungen dieses
Buches. Programas de instalación automáticos para este banco de datos para
Oracle, SQL Server y MySQL en Internet de forma gratuita
Verfügung. Entsprechende Hinweise werden ebenfalls im Anhang gegeben. Jedes Kapitel endet
mit einer Zusammenfassung, Übungsaufgaben und Literaturhinweisen.
Los temas actuales como la inyección SQL se activan y se corrigen los errores.
Anpassungen sind auch auf Anregungen von Lesern zurückzuführen. Dafür
bedanke ich mich besonders.
Mein besonderer Dank gilt meiner Familie, deren Rücksicht und Verständnis dieses
Buch erst ermöglichten.

Ratisbona, en octubre de 2016


inhalar

1 Übersicht über Datenbanken. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1


1.1 Definición de un banco de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Anforderungen an eine Datenbank. . . . . . . . . . . . . . . . . . . . . . . . 6
1.3 El administrador del Datenbank. . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.4 Modelo de banco de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.4.1 Bancos de datos relacionales. . . . . . . . . . . . . . . . . . . . . . . . . 12
1.4.2 Bancos de datos orientados a objetos. . . . . . . . . . . . . . . . . . . . . . 13
1.4.3 Bancos de datos jerárquicos y netos. . . . . . . . . . . 14
1.4.4 Instalaciones modernas. . . . . . . . . . . . . . . . . . . . . . . . . 15
1.5 Transacciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . dieciséis

1.6 El modelo de consistencia ACID. . . . . . . . . . . . . . . . . . . . . . . . . . . 18


1.7 Übungsaufgaben. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Literatura 19
........................................ 21

2 El modelo de relación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.1 Beispiel zu relacionaalen Datenbanken. . . . . . . . . . . . . . . . . . . . . . 24
2.2 Estructuras de datos relacionales. . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.3 Primärschlüssel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.4 Integridades relacionales. . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.4.1 Registro de integridad de entidades .......................... 36
2.4.2 Registro de integración de referencia ......................... 37
2.5 Álgebra relacional. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.5.1 Operadores relacionales. . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.5.2 Vereinigung, Schnitt y Differenz. . . . . . . . . . . . . . . . . . . 46
2.5.3 Proyección y restricción. . . . . . . . . . . . . . . . . . . . . . . . 47
2.5.4 Kreuzprodukt, Verbund und Division. . . . . . . . . . . . . . . . . . 47
2.5.5 Eigenschaften der relacional Operadores. . . . . . . . . . . . . . 51
2.6 Fassammenfassung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
2.7 Übungsaufgaben. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Literatura 55
........................................ 56
3 Diseño de banco de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
3.1 Formas normales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
3.1.1 Primera forma normal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3.1.2 Abhängigkeit funcional. . . . . . . . . . . . . . . . . . . . . . . . . 59
3.1.3 Forma normal de Zweite. . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.1.4 Dritte Normalform nach Boyce und Codd. . . . . . . . . . . . . . . sesenta y cinco

3.1.5 Dritte Normalform nach Codd. . . . . . . . . . . . . . . . . . . . . . 67


3.1.6 Vuelta en forma normal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
3.1.7 Función de forma normal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
3.1.8 Cierre de cuentas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.2 Modelo Entidad-Relación. . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.2.1 Entidades. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
3.2.2 Cambios de posición. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
3.2.3 Relaciones de dependencia. . . . . . . . . . . . . . . . . . . . . . . . . . . 86
3.2.4 Fremdschlüsseligenschaften. . . . . . . . . . . . . . . . . . . . . . . 90
3.2.5 Schwache Entitäten y Subtypen. . . . . . . . . . . . . . . . . . . . 93
3.2.6 Cierre de cuentas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
3.3 Übungsaufgaben. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Literatura 96
........................................ 97

4 Die Zugriffssprache SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .99 4.1 Der


Abfragebefehl Seleccionar. . . . . . . . . . . . . . . . . . . . . . . . . . . . .100
4.1.1 Der Aufbau des Select-Befehls. . . . . . . . . . . . . . . . . . . . . .102
4.1.2 Morir de Klausel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .104
4.1.3 Die Select-Klausel. . . . . . . . . . . . . . . . . . . . . . . . . . . . .106
4.1.4 Muere donde-Klausel. . . . . . . . . . . . . . . . . . . . . . . . . . . . .111
4.1.5 El grupo por grupo y por tener Klausel. . . . . . . . . . . . . . . . . .119
4.1.6 Unión, excepto e intersección. . . . . . . . . . . . . . . . . . . . . . .122
4.1.7 Der Verbund (Unirse). . . . . . . . . . . . . . . . . . . . . . . . . . . . .123
4.1.8 Der äußere Verbund (Unión exterior). . . . . . . . . . . . . . . . . . . .126
4.1.9 Orden por Klausel. . . . . . . . . . . . . . . . . . . . . . . . . . .129
4.1.10 Función nula y fusión. . . . . . . . . . . . . . . . .130
4.1.11 Arbeitsweise des Select-Befehls. . . . . . . . . . . . . . . . . . . . .132
4.2 Mutaciones befehle en SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . .133
4.3 Transacciones con SQL. . . . . . . . . . . . . . . . . . . . . . . . . . .136
4.4 Álgebra relacional y SQL. . . . . . . . . . . . . . . . . . . . . . . . . . .137
4.5 Fassammenfassung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .139
4.6 Übungsaufgaben. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .140 literatura
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .141
5 La descripción general de SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . .143 5.1
Relaciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .144
5.1.1 Tipos de fecha. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .145
5.1.2 Spalten- und Tabellenbedingungen. . . . . . . . . . . . . . . . . . .147
5.2 Relaciones entre ellos y las personas. . . . . . . . . . . . . . . . . . . . . . . . . .150
5.3 Relaciones temporales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .151
5.4 Sichten (Vistas). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .152
5.5 Zusicherungen (Afirmaciones). . . . . . . . . . . . . . . . . . . . . . . . . . . .157
5.6 Gebiete. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .158
5.7 Activador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .159
5.8 Secuencia. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .162
5.9 Zugriffsrechte. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .163
5.10 Zugriffsschutz. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .167
5.11 Integridad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .169
5.12 Aufbau un Datenbank. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .172
5.12.1 Esquema de información. . . . . . . . . . . . . . . . . . . . . . . . . . . .173
5.12.2 Bancos de datos y Oracle. . . . . . . . . . . . . . . . . . . . . . . . .174
5.12.3 Bancos de datos y SQL Server. . . . . . . . . . . . . . . . . . . . . .176
5.12.4 Bancos de datos y MySQL. . . . . . . . . . . . . . . . . . . . . . . .176
5.13 Einrichten und Verwalten von Datenbanken. . . . . . . . . . . . . . . . . .177
5.13.1 Bancos de datos de Oracle. . . . . . . . . . . . . . . . . . . . . . . . . . . .177
5.13.2 Bancos de datos de SQL Server. . . . . . . . . . . . . . . . . . . . . . . . .178
5.13.3 Bancos de datos MySQL. . . . . . . . . . . . . . . . . . . . . . . . . . .179
5.14 Aviso legal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .180
5.15 Übungsaufgaben. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .181 Literatura
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .183

6 Programación de banco de datos con PHP. . . . . . . . . . . . . . . . . . . . . . . .185


6.1 Arbeiten con PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .186
6.2 Acceso directo al servidor web, HTML y PHP. . . . . . . . . . . . . . . . . . .187
6.2.1 Internet y servidor web. . . . . . . . . . . . . . . . . . . . . . . . . .187
6.2.2 Lenguaje de marcado de hipertexto (HTML). . . . . . . . . . . . . . . . .188
6.2.3 PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .191
6.2.4 Campo en PHP: una descripción general. . . . . . . . . . . . . . . . . .194
6.3 Erste Datenbankzugriffe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .195
6.3.1 Registro de datos con PHP. . . . . . . . . . . . . . . . . . . . . . . .195
6.3.2 Los Datenbankschnittstelle DOP. . . . . . . . . . . . . . . . . . . . .197
6.3.3 Nuevo PHP-Zugriff auf Datenbanken. . . . . . . . . . . . . . . . . .197
6.3.4 Einführung in die Fehlerbehandlung. . . . . . . . . . . . . . . . . .201
6.3.5 Auslesen mehrerer Datenzeilen. . . . . . . . . . . . . . . . . . . . .203
6.4 Komplexere Datenbankzugriffe. . . . . . . . . . . . . . . . . . . . . . . . . .208
6.4.1 Variable de sesión. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .208
6.4.2 Mehrfache Lesezugriffe auf Datenbanken. . . . . . . . . . . . . . .210
6.4.3 Una GUI para la configuración de SQL-Befehlen. . . . . . . . . . . . . . .213
6.4.4 Inyección SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .215
6.4.5 Excepción PDO de clase. . . . . . . . . . . . . . . . . . . . . . . .219
6.4.6 Transacciones con PHP. . . . . . . . . . . . . . . . . . . . . . .221
6.5 Arbeiten mit großen Binärdaten. . . . . . . . . . . . . . . . . . . . . . . . .225
6.5.1 Verificación de tipos de datos BLOB. . . . . . . . . . . . . . . . . . .227
6.5.2 Speichern von Binärdaten en un banco de datos. . . . . . . . . . . .227
6.5.3 Auslesen von Binärdaten aus un Datenbank. . . . . . . . . . . .231
6.6 Fassammenfassung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .233
6.7 Übungsaufgaben. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .235 literatura
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .236

7 Actuación en Datenbanken. . . . . . . . . . . . . . . . . . . . . . . . . . . . .239 7.1


Optimizador y plan de actualización. . . . . . . . . . . . . . . . . . . . . . . . .240
7.1.1 Optimización en Oracle. . . . . . . . . . . . . . . . . . . . . . . . . . .243
7.1.2 Optimización en SQL Server. . . . . . . . . . . . . . . . . . . . . . . .245
7.1.3 Optimización en MySQL. . . . . . . . . . . . . . . . . . . . . . . . . .247
7.2 Índice. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .247
7.3 Partición. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .250
7.4 Información materializada. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .254
7.5 Optimierung des Select-Befehls. . . . . . . . . . . . . . . . . . . . . . . . .257
7.6 Procedimiento almacenado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .263
7.7 Otras mejoras. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .267
7.8 Fassammenfassung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .268
7.9 Übungsaufgaben. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .269 Literatura
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .270

8 Concurrencia y recuperación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .271 8.1


Transacciones en bancos de datos. . . . . . . . . . . . . . . . . . . . . . . . . .272
8.2 Recuperación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .274
8.2.1 Recuperación y registro. . . . . . . . . . . . . . . . . . . . . . . . .275
8.2.2 Aufbau der Logdateien. . . . . . . . . . . . . . . . . . . . . . . . . .278
8.2.3 Recuperación y puntos de control. . . . . . . . . . . . . . . . . . . . . . . .281
8.3 Concurrencia. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .286
8.4 Espermecanismos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .290
8.5 Puntos muertos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .296
8.6 Concurrencia y SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .299
8.7 Concurrencia en la práctica. . . . . . . . . . . . . . . . . . . . . . . . . . . . .302
8.7.1 Concurrencia en Oracle. . . . . . . . . . . . . . . . . . . . . . . . . . .302
8.7.2 Concurrencia en MS SQL Server. . . . . . . . . . . . . . . . . . . . .303
8.7.3 Concurrencia en MySQL. . . . . . . . . . . . . . . . . . . . . . . . . .303
8.8 Fassammenfassung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .304
8.9 Übungsaufgaben. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .305 Literatura
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .306

9 Moderne Datenbankkonzepte. . . . . . . . . . . . . . . . . . . . . . . . . . . . .307 9.1


Bancos de datos Verteilte. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .308
9.1.1 Vorteile der verteilten Datenhaltung. . . . . . . . . . . . . . . . . . .308
9.1.2 Die zwölf Regeln zur verteilten Datenhaltung. . . . . . . . . . . .309
9.1.3 Teorema de Das CAP. . . . . . . . . . . . . . . . . . . . . . . . . . . . .312
9.1.4 El modelo de consistencia BASE. . . . . . . . . . . . . . . . . . . . . . .314
9.1.5 Überblick über moderne Datenbanksysteme. . . . . . . . . . . . .315
9.1.6 Compromiso Zwei-Phasen. . . . . . . . . . . . . . . . . . . . . . . . . . .316
9.2 Bancos de datos orientados a objetos. . . . . . . . . . . . . . . . . . . . . . . . . .319
9.2.1 Definición objektorientierter Datenbanken. . . . . . . . . . . . . . .319
9.2.2 Bancos de datos objetivos. . . . . . . . . . . . . . . . . . . . .322
9.2.3 Erweiterungen de objetos en Oracle. . . . . . . . . . . . . .323
9.2.4 Relaciones adicionales en Oracle. . . . . . . . . . . . . . . . . . . .329
9.3 Fassammenfassung. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .334
9.4 Übungsaufgaben. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .335 Literatura
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .336

10 Anhang. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .339

Sachverzeichnis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .349
Übersicht über Datenbanken
1

Supervisión
Aller Anfang es negro. Dieses Kapitel soll diesen Anfang erleichtern und führt in diese
ganz neue Welt der Datenbanken mit all ihren Begriffen und Besonderheiten ein.
Comenzamos con la definición de un Datenbank und stellen anschließend einen Katalog
über Wünsche und Erwartungen an Datenbanken zusammen. Es überrascht nicht, dasser
ziemlich umfangreiche Katalog heute von Datenbanken fast vollständig erfüllt wird. Und
schon comenzamos con la erahnen, wie mächtig und komplex moderne
Datenbanksysteme sind. In den folgenden Abschnitten definieren wir die Aufgaben eines
Datenbank-Administrators, lernen grob die einzelnen Datenbankmodelle kennen,
gewinnen einen Überblick über Datenbankzugriffe und stoßen schließlich auf den enorm
wichtigen Transaktionsbegriff. Der Leser, der bereits Grundkenntnisse in Datenbanken
besitzt, kann dieses Kapitel gerne überspringen. Einen sehr schönen knappen Überblick
über Datenbanken finden wir auch in Eirund und Kohl (2010).

1.1 Definición de un banco de datos

Daten können äußerst effizient verwaltet werden, um extrem schnelle Zugriffe auf Daten zu
ermöglichen. Es stellt sich daher fast automatisch die Frage: „Benötigen wir überhaupt
Datenbanken?“ Und wir neigen dazu,neínzu sagen, da auch auf auf größte Datenmengen bei
entsprechender Optimierung hochperformant zugegriffen werden kann. Um diese Frage
letztendlich doch mit einem klarenJazu beantworten, müssen wir zunächst den Begriff
Datenbanken exactamente definido. Anschließend werden wir die wichtigen Unterschiede
zwischen Datenbanken einerseits und un komplexen Dateiverwaltung andererseits
herausarbeiten.
2 1 Übersicht über Datenbanken

Comenzamos con un Beispiel: Wir betrachten einen Mehrbenutzerbetrieb (Multi-User-


Betrieb): Auf einen großen Datenbestand greifen Benutzer von vielen Rechnern aus mehr oder
weniger gleichzeitig zu. Nehmen wir als Beispiel das Buchen einer Flugreise. Von vielen
Reisebüros aus wird nach freien Plätzen in Flugzeugen gesucht, um diese, falls vorhanden, zu
reservieren. Mit this Buchung sind this Plätze für alle other Kunden sofort als belegt markiert.
Estas fechas deben ser recomendadas para todos los tiempos de espera y de control en el
momento actual.
Die Situation ist in diesem Beispiel also die folgende (siehe auch Abb.1.1): Mehrere Benutzer
greifen auf die gleichen Datenbestände lesend und schreibend zu. Anwendungsprogramme
mit einer komfortablen Benutzeroberfläche übernehmen die meist doch recht komplexen
Zugriffsbefehle, da este der Endbenutzer in der Regel nicht kennt.
Analysieren wir diese Zugriffsweise. Das Anwendungsprogramm (und damit der
Programmierer dieser Anwendung) muss die physische Struktur aller verwendeten Daten
exakt kennen. Leader sind dieten auf verschiedenen Hardware-Plattformen in der Regel
unterschiedlich abgespeichert. Das Anwendungsprogramm muss daher immer an die
jeweilige Hardware angepasst sein. Soll ein unter Unix laufendes Zugriffsprogramm auf
Windows portiert werden, soll genügt nur ein erneutes Übersetzen, es muss vielmehr
aufwendig umgeschrieben werden.
Auch wenn gar kein Umstieg auf ein other System geplant ist, treten früher oder später
Probleme auf; denn die riesigen Datenmengen haben sich meist über viele Jahre oder gar
Jahrzehnte angesammelt. Denken wir nur an Lebensversicherungen mit vertraglichen
Laufzeiten von 25 oder mehr Jahren. In diesem Zeitraum haven sich die Computer und
Speichermedien und damit auch die Schnittstellen zu den Daten erheblich geändert. Jede
dieser Änderungen erfordert Korrekturen in all den Programmen, diese Schnittstellen
verwenden. Aus Abb.1.1erkennen wir ganz klar:Todos Anwendungsprogramme müssen bei
Datenstrukturänderungen angepasst werden!

seltene Direktzugriffe

Anwendungs-
programa 1 Fechai
1
Anwendungs- Fechai
3
Fin b e n u t z e r

programa 2
Dateien mit
Anwendungs- Fechai
complejo
... programa 3 2
Estructuras de grifo

... ...
Fechai
Anwendungs-
metro
programa sustantivo, masculino—

Tejido. 1.1Mehrbenutzerbetrieb mit Datenorganisation


1.1 Definición de un banco de datos 3

Aber schon allein die Tatsache, dass jeder Anwendungsprogrammierer die physische
Struktur aller Daten kennen muss, ist unbefriedigend. Hohe Kosten wegen der
aufwendigen Einarbeitung neuer Mitarbeiter und eine hohe Fehleranfälligkeit wegen der
vielen unterschiedlichen und komplexen Strukturen sind die Folge. Erst Datenbanken
versprechen hier Abhilfe.

IDefinición: banco de datosunobanco de datos ist eine Sammlung von Daten, die untereinander
in einer logischen Beziehung stehen und von einem eigenen Datenbankverwaltungssystem
(Sistema de gestión de bases de datos, DBMS) verwaltet werden.

Der erste Teil der Definición sollte klar und selbstverständlich sein: Daten, die nicht
zusammengehören, werden getrennt verwaltet, etwa in separan Datenbanken. Eine
große Versicherungsgesellschaft wird beispielsweise seine Daten zur Lebensversicherung
und zur KFZ-Versicherung gesondert in eigenen Datenbanken halten, was auch der
Übersicht zu Gute kommt. Ein besonderes Gewicht besitzt der zweite Teil der Definición:
Eine Datenbank impliziert eine Datenhaltungy eine dazugehörige Verwaltung dieser
Daten. Wir können diese Neuerung deutlich aus Abb.1.2ablesen.
Neu gegenüber Abb.1.1ist die Abschottung der physischen Daten durch das
Datenbankverwaltungssystem. Este DBMS es gratuitologístico Schnittstelle nach außen. Jeder
Benutzer und damit auch jedes Anwendungsprogramm greift ausschließlich über diese
Schnittstelle auf die Daten zu. Das DBMS selbst setzt diese logischen Zugriffe in physische um
und liest und schreibt letztlich die Daten auf das Speichermedium. Da die logische Schnittstelle
eine exakt festgelegte und nicht allzu komplex Zugriffsschnittstelle ist, kann auch ein
Endbenutzer gegebenenfalls directamente auf die Datenbank zugreifen. Insbesondere werden
die Anwendungsprogramme einfacher und damit auch weniger feh-

Sistema Datenbankverwaltungs

Anwendungs-
programa 1
Fechai
Fin b e n u t z e r

Anwendungs- Fechai
programa 2

Anwendungs- Fechai
... programa 3

... ...

Anwendungs- Fechai
programa sustantivo, masculino—

Fechas del banco de datos

Tejido. 1.2Schematischer Zugriff en Datenbanken


4 1 Übersicht über Datenbanken

leeranfällig. Und der Leser dieses Buches wird sich darüber freuen, dass er nur am Rande von
der physischen Datenorganisation “belästigt” wird.
Zu der mit Abstand wichtigsten internationalen Datenbankschnittstelle hat sich in
den letzten 25 Jahren SQL entwickelt.SQLEsto para el lenguaje de consulta
estructurado y su programa de programación, con sus herramientas en los bancos
de datos relacionales, pueden usarse. Fue fundada por E. F. Codd en 1970 en IBM,
fundada por SEQEL (también llamada versión inglesa para SQL), y en 1979 por Oracle
bajo los nombres SQL. Ihre Bedeutung gewann sie durch die Normierung im Jahr
1986 (wir sprechen hier von SQL1). Seitdem wurde diese Sprache ständig
weiterentwickelt. 1992 kam der wichtige Schritt zu SQL2, eine Norm, die heute
durchgängig unterstützt wird. Otras normas establecidas en SQL. Así que en el año
1999 objektorientierte Konzepte und Rekursion mit der SQL3-Norm eingeführt. En
los años 2003 y 2006, kam die XML-Unterstützung hinzu. Weitere Ergänzungen
folgten 2008 y 2011. Werden auf SQL2 konzentrieren, da esta norma práctica de
todos los bancos de datos modernos unterstützt wird, entre otros de Oracle, DB2,
MS SQL Server, MySQL y PostgreSQL.
SQL no es un procedimiento de programación con una respuesta al sistema de
datos bancarios,welche Daten er benötigt, und nicht,como er zu diesen Daten
gelangt. Dies vereinfacht die Programmierung erheblich. Werden bereits im
Folgenden einfache SQL-Befehle kennen lernen. Sehr ausführlich werden wir in den
Kap.4Bis 6en SQL.
Die Vorteile einer Datenbank wurden bereits deutlich herausgestellt. Sie seien hier
zusammengefasst nochmals: Der Anwendungsprogrammierer und der Endbenutzer können
über eine komfortable, mächtige und normierte Schnittstelle des DBMS (zum Beispiel SQL) auf
dieten der Datenbank zugreifen. Kenntnisse über die internale physische Struktur der Daten in
der Datenbank sind nicht erforderlich. Die Umsetzung der logischen in physische Zugriffe
übernimmt das DBMS.
Beginnen wir mit einem ersten Beispiel. Gegeben sei ein Händler, der in seinem
Getränkelager unterschiedliche Biersorten vorrätig hat. Ein Ausschnitt über den Inhalt
dieses Lagers enthält Tab.1.1. In dieser Tabelle mit dem NamenBierdepotsind die Spalten
nº, ordenar,Hersteller,tipoyAnzahldefinido. Wie diese Daten physisch abgespeichert sind,
interessiert den Anwender nicht, solange der Datenbankhersteller dafür sorgt, dass die
Daten sicher gespeichert und schnell gefunden und geändert werden können. Sowohl die
Suche (Recuperación) también se logra con un lenguaje normalizado. En SQL stehen dazu
die BefehleSeleccionar,Actualizar,InsertaryBorrarzur Verfügung.
En SQL todas las fechas tabellarisch gespeichert. Eine Zeile einer solchen Datenbanktabelle
heißtSatz (en inglés: grabar) oderTupel , ein Spaltenelement wird meist también campo oder
Atributo bezeichnet. Wir gehen bei der Behandlung der einzelnen Datenbankmodelle (Abschn.
1.4) und insbesondere bei den relacionalen Datenbanken (Abschn.2.2) ausführlich darauf ein.

Selbstverständlich wäre für die weigen Einträge in Tab.1.1keine Datenbank


erforderlich. Handelt es sich hier Hingegen nur um einen kleinen Ausschnitt aus dem um-
1.1 Definición de un banco de datos 5

Pestaña. 1.1Bierdepot

nº ordenar Hersteller tipo Anzahl


1 Exportar Schultheiss castillo 12
3 Roggen Thurn y Taxis castillo 10
4 Pils Löwenbräu castillo 22
8 Exportar Löwenbräu Fass 6
11 cerveza blanca Paulaner castillo 7
dieciséis Infierno espátula Paquete de 6 5
20 Infierno espátula castillo 12
23 Infierno EKU Fass 4
24 cerveza stark Paulaner castillo 4
26 Dunkel Kneitinger castillo 8
28 marzen Hofbräu Fass 3
33 Pils Jever Paquete de 6 6
36 Pils sin alcohol Löwenbräu Paquete de 6 5
39 cerveza blanca Erdinger castillo 9
47 Pils sin alcohol Clausthaler castillo 1

Pestaña. 1.2Weißbiere im Bierdepot

ordenar Hersteller Anzahl


cerveza blanca Paulaner 7
cerveza blanca Erdinger 9

fangreichen Sortiment eines Getränkehändlers, so kann bei jeder Bestellung nachgesehen


werden, ob die entsprechende Biersorte vorrätig ist; und wenn ja, kann vom Bestand die
bestellte Ware direkt abgezogen werden. Dies wäre auch mit Papier und Bleistift möglich, aber
zeitintensiv und Fehler anfällig. Hat sich unser Getränkehändler für eine SQL-Datenbank
entschieden, so wird ihm beispielsweise sogar dierekte Anfrage nach einem guten Weißbier
relativ leicht fallen. Esto es lo que escribe en SQL:

SELECCIONAR Sorte, Hersteller, Anzahl


DE Bierdepot
DÓNDE Ordenar = 'Weißbier';

Als Ergebnis wird in unserem Beispiel Tab.1.2ausgegeben.


Auch das Einfügen einer weiteren Pils-Sorte, das Hinzufügen dos Kästen Paulaner
Weißbier oder das Löschen des Jever Pils sind einfach auszuführen:

INSERTAR EN Bierdepot
VALORES (43, 'Pils', 'Unión de Dortmund', 'Kasten', 6);

ACTUALIZAR Bierdepot
COLOCAR Anzahl = Anzahl + 2 Nr =
DÓNDE 11 ;

BORRAR DE Bierdepot
DÓNDE Número = 47 ;
6 1 Übersicht über Datenbanken

Con estas tres opciones SQL, hay joyas en la tablaBierdepoteine Änderung vorgenommen
(zur genauen Syntax and Wirkungsweise this SQL-Befehle sei auf Kap.4 verwiesen). Genauso
einfach sind auch die Zugriffe auf große und größte Datenbestände. Immer liefert SQL die
Abfrageergebnisse in Tabellenform zurück, und Änderungen werden direkt in die Datenbank
geschrieben. Este pequeño Beispiel zeigt bereits, wie einfach und übersichtlich
Anwendungsprogramme dank relacionaler Datenbanken werden.
Gehen wir nun in unserem Gedankenbeispiel weiter. Wegen guter Umsätze baut der
Getränkehändler sein Händlernetz aus. Jetzt benötigt er auch eine Kunden-, eine Personalund
eine Verkaufsdatei. Auch Rechnungen, Mahnungen, Statistiken, Finanz- und
Steuerabrechnungen wollen verwaltet werden. Schließlich sollen diese Daten auch von allen
Zweigstellen aus zugreifbar sein. Dies wiederum erfordert die Notwendigkeit paralelor Zugriffe
für einen eingeschränkten Personenkreis (Kennwortschutz). Wir erkennen die hohen
Anforderungen an Datenbanken, denn eine leistungsfähige Datenbank sollte selbstverständlich
alle diese Merkmale unterstützen.

1.2 Anforderungen an eine Datenbank

Nachdem wir im letzten Abschnitt am Beispiel des Getränkehändlers schon aufzeigten, welche
Anforderungen an eine Datenbank gestellt werden können, wollen wir in diesem Abschnitt
systematisch darauf eingehen. Wir überlegen dazu, welche Probleme und Wünsche in
Zusammenhang mit der Haltung und Verwaltung großer Datenbestände auftreten können,
und fordern, dass moderne Datenbanksysteme unsere Probleme lösen und unsere Wünsche
erfüllen. Wir wollen mit Erwartungen Beginnen, die wir bereits an komplex Datenstrukturen
stellen:

- Sammlung logisch verbundener Daten


- Speicherung der Daten mit möglichst wenig Redundanz
- Abfragemöglichkeit und Änderbarkeit von Daten

Die Anforderung, nur zusammengehörige Daten zu sammeln, ist fast schon trivial.
Diese Anforderung unterstreicht aber nochmals, dass Daten, die nicht miteinander in
Verbindung stehen, auch getrennt verwaltet werden. Dies vereinfacht den Aufbau von
Datenbanken wesentlich.
unoreunión von Daten erlaubt umgekehrt, dass diese Daten nicht notwendigerweise an
einer Stelle gespeichert sind. Vielmehr können estas fechas auf mehreren Rechnern verteilt
sein, auch im Internet. Die Datenbank muss im Falle der Verteilung natürlich jederzeit alle
Speicherorte kennen, um bei einer Anfrage die gewünschten Daten sofort liefern zu können. Es
versteht sich von selbst, dass der Anfragende mit den Problemen der Verteilung nicht belästigt
wird.
debajoRedundanciaverstehen wir das mehrfache Abspeichern gleicher Daten. Mehrfachhaltung
kostet Speicherplatz und zusätzlichen Verwaltungsaufwand ohne erkennbaren
1.2 Anforderungen an eine Datenbank 7

Nutzen und ist daher unerwünscht, lässt sich aber aus Laufzeitgründen und aus Gründen der
Datenverwaltung selten ganz vermeiden. Da diese Mehrfachhaltung zu Inkonsistenzen
(Widersprüche internalhalb des Datenbestands) führen kann, sollte eine Datenbank einen
möglichst redundanzarmen Aufbau der Daten durch entsprechende Datenstrukturen
unterstützen. Des Weiteren sollte das Datenbankverwaltungssystem die no vermeidbaren
Redundanzen kennen und bei Änderungen eines dieser redundanten Daten auch alle other
entsprechend automatisch mit anpassen.
Redundanz in der Datenhaltung ist beispielsweise gegeben, wenn der Getränkehändler
neben der Lagertabelle auch eine Einkaufs- und Verkaufstabelle führt. Allein aus der Differenz
der letzten beiden Tabellen lässt sich der Lagerbestand berechnen. Die Lagertabelle enthält
demnach ausschließlich redundante Daten, trotzdem wird diese Tabelle in der Regel
mitgeführt. Die Datenbank hat beim Einkauf für die ordentliche Buchung sowohl in der Lager-
als auch in der Einkaufstabelle zu sorgen. Analoges gilt für den Verkauf.
Dass wir Daten abfragen und ändern können, ist selbstverständlich und schließt ein,
dass diesesAbfragen ydetrás von Daten den Anforderungen entsprechend schnell
ausgeführt wird. Die erwartete Ausführungsgeschwindigkeit liegt in der Regel im Bereich
des menschlichen Reaktionsvermögens. Schon Antwortzeiten der Datenbank von mehr
als dos Sekunden sind unerwünscht. Da Abfragen sehr komplex sein können und sich
nicht selten über mehrere Tabellen, Dateien und Speicherorte erstrecken, wird eine große
Datenbank intern mit komplexen und extrem leistungsfähigen Datenstrukturen arbeiten.
También es el complemento de DBMS, para una expresión física óptima. Der Benutzer
und Anwender wird mit diesen Detalles selbstverständlich nicht belästigt.
Die bisher aufgeführten Punkte werden auch von komplexen Datenstrukturen mit
entsprechenden Zugriffsmethoden erfüllt. Der wahre Vorteil eines DBMS ist seine genau
definidoerte und im Falle von SQL auch normierte Schnittstelle, diese stas physischen
Strukturen dem Benutzer gegenüber gegenüber verbirgt. Damit bleiben Datenbankzugriffe
relativ einfach. Doch ein Datenbanksystem sollte noch wesentlich mehr leisten, und wir setzen
unsere Wunschliste fort:

- Logische Unabhängigkeit der Daten von ihrer physischen Struktur


- Zugriffschutz
- integridad
- Mehrfachzugriff (Concurrencia)

Wir gehen auf diese vier Punkte im Einzelnen ein. Die Datenbank sorgt nicht nur für die
optima Speicherung der Daten, sondern verbirgt zusätzlich die physische Datenstruktur vor
dem Benutzer. Natürlich muss der Benutzer die Daten kennen, aber es genügt, wenn er über
denlogístico Aufbau dieser Daten Bescheid weiß. Der Benutzer greift auf die „logischen“ Daten
zu, und die Datenbank wandelt diese logische Anforderung selbstständig in den
entsprechenden physischen Zugriffsbefehl um und führt ihn aus.
Veranschaulichen wir dies am Beispiel unseres Bierdepots. Der Benutzer der
Datenbank kennt nur die Tabellenstruktur. Wird in this Tabelle die Herstellerspalte zwecks
8 1 Übersicht über Datenbanken

schnelleren Zugriffs mit einem Index (siehe Abschn.7.1) versehen, so darf sich dies an der
Benutzerschnittstelle grundsätzlich nicht bemerkbar machen! Über die verbesserte Antwortzeit
darf sich der Anwender aber natürlich dennoch freuen.
Este forderung entspricht in ihrer Bedeutung etwa dem Übergang von Assembler zu einer
strukturierten Hochsprache wie C++ o Java. Sie ermöglicht zum einen ein schnelles und
einfaches Programmieren, zum otros eröffnet es große Freiheiten in der Verwaltung der
Datenbank. Los DBMS pueden optimizarse internamente, sin necesidad de pasar los
controladores de software. Die Daten können jederzeit umorganisiert und performant
gespeichert werden, sei es in Verknüpfung mit internen Strukturen, sei es auf Band, Festplatte
oder anderen Medien. Entre otros, el hardware, el sistema operativo y el formato de bloque
modificado de la plataforma festiva se pueden usar, ohne dass dies an der Schnittstelle zum
Anwendungsprogramm sichtbar wird.
ZumZugriffschutz ist zu sagen, dass Betriebssysteme zwar den Schutz von Dateien kennen,
nicht aber den Schutz einzelner Daten Innerhalb einer Datei. Estas protecciones internas son
válidas según las fechas sensibles y las fechas personales. Einerseits soll die Lohnbuchhaltung
auf die Adresse und die Kontonummer von Mitarbeitern zugreifen können, andererseits soll es
der Firmenleitung vorbehalten sein, Einblicke in die Gehaltsund Beurteilungsdaten einzelner
Personen zu bekommen, ganz zu schweigen vom Ändern dieser sensiblen Daten.

Die Datenbanken haben daher für den Zugriffsschutz zu sorgen, sie verwalten die
Kennungen und Passwörter zum Zugang zur Datenbank und geben je nach Autorisierung nur
die entsprechend erlaubten Teile (Sichten, siehe Abschn.5.4) der Datenbank frei. Das DBMS
ermöglicht darüber hinaus, diese Zugangsberechtigungen jederzeit zu broadrufen oder neu
festzulegen.
integridad ist eine ganz wesentliche Forderung. Integración kommt vonenteround bedeutet,
dass alle gespeicherten Daten korrekt sein sollten. Integrität ist eine der Forderungen, die
selbstverständlich ist, in der Praxis jedoch nur sehr schwer umfassend zu erfüllen ist. Natürlich
wäre es schön, wenn zum Beispiel dieses Buch frei von jeglichen Schreibfehlern wäre, was aber
trotz größter Sorgfalt kaum zutreffen wird. Integrität umfasst einen sehr weiten Bereich, Bei
der physischen über die logische zur semantischen Integrität. Zum einen müssen also die
Daten physisch korrekt gespeichert sein, einschließlich der kompletten Datenverwaltung.
Weiter müssen die Daten logisch richtig sein. Mehrfach vorhandene Daten müssen den
gleichen Wert besitzen, und Änderungen mussen sich auf alle redundanten Daten beziehen. Im
Detail gehen wir auf this Probleme im Abschn.2.4ein.
Auch wenn dies erfüllt ist, bleibt als Hauptschwachstelle die semantische Integrität, also die
Übereinstimmung der Daten in der Datenbank mit den Daten der realen Welt. Aquí está el
banco de datos auf die Eingabe durch den Menschen angewiesen. Der Mensch ist
glücklicherweise keine Maschine; beim Einlesen von Daten geschehen damit aber zwangsweise
früher oder später Fehler. Ein gutes DBMS sollte aber durch Plausibilitätskontrollen zumindest
offensichtliche Fehler erkennen. Die Eingabe einer wöchentlichen Arbeitszeit von versehentlich
400 en 40 Stunden sollte daher beispielsweise grundsätzlich abgewiesen werden.
1.2 Anforderungen an eine Datenbank 9

Bis heute werden Daten meist zentral in einem Rechner gehalten, wobei von other
Rechnern und „intelligenten“ Automaten (p. ej. B. Bankautomaten) aus zugegriffen wird.
Immer öfter werden aber Daten auch auf mehrere Rechner verteilt. Die einzelnen Daten
können dabei im einen Fall fix einem Rechner zugeordnet sein, oder im other Extremfall
irgendwo in der Cloud liegen. Das System kennt aber immer den augenblicklichen
Speicherplatz und kann jederzeit auf jedes dieser Daten zugreifen (siehe Abb.1.3, vea
también Kap.9).
Bei gleichzeitigen Mehrfachzugriffen können Konflikte auftreten. Beispielsweise dürfen die
letzten drei Kasten Märzen aus unserem Bierdepot aus Tab.1.1nicht gleichzeitig an dos Wei
Kunden verkauft werden. Wir fordern daher, dass die Datenbank dafür sorgt, Konflikte zu
verhindern. Mehr noch, wer fordern, dass sich die Datenbank aus der Sicht des Benutzers so
verhält, als sei er der einzige Benutzer! Die Lösung dieses Problems führt zum Begriff der
Transacción . Auf Transaktionen werden wir am Ende dieses Kapitels und insbesondere in Kap.
8ausführlich eingehen.
Mit den bisherigen Anforderungen ist unsere Wunschliste noch nicht abgeschlossen. Wir
fügen noch weitere Wünsche hinzu:

- Zuverlässigkeit
- Ausfallsicherheit
- control

Zuverlässigkeit bedeutet auch Sicherheit vor unerlaubten Zugriffen. Unerlaubte


Zugriffe müssen von der Datenbank verhindert werden. Doch auch dien Bank-Software ist
vermutlich nicht fehlerfrei. Sicherheitshalber sollten also zusätzlich alle Zugriffe auf die
Datenbank einschließlich den Angaben zum Benutzer protokolliert werden (Fachbegriff:
Auditoría, Nachverfolgung von Ereignissen). Dadurch wäre sowohl eine nachträgliche
Ermittlung unbefugter, meist krimineller Zugriffe möglich, als auch die Feststellung,
welche Daten manipuliert wurden.
Ausfallsicherheit bedeutet Sicherheit der Daten in allen nur denkbaren Fällen, angefangen
vom Rechnerausfall bis zur Zerstörung durch Feuer. Immer müssen wirklich wichtige

Rechner central
Verteilte
banco de datos

con zentralem
Fecha de vencimiento

Tejido. 1.3Zentrale und verteilte Datenbanken


10 1 Übersicht über Datenbanken

Daten rekonstruiert werden können, Inkonsistenzen dürfen dadurch nicht entstehen. Dies
erfordert die unbhängige Protokollierung aller geänderten Daten der Datenbank auf eigenen
Medien.
Kontrolle heißt, dass die Datenbank ständig Informationen über den augenblicklichen
Zustand führt, etwa die Anzahl der Benutzer, die Auslastung der Magnetplatten, die Auslastung
des DBMS, die Auslastung der Netze. Dies beinhaltet die Aufbereitung dieser Daten in
Statistiken und natürlich auch eine Abrechnung für die Benutzer der Datenbank. Kontrolle
heißt aber auch, dass das Systemverhalten mittels Einstellmöglichkeiten jederzeit gesteuert
und verbessert werden kann.
Mit diesen letzten drei Wünschen beenden wir unsere inzwischen doch recht lange
Wunschliste. Wir erkennen, dass eine Datenbank mehr ist als nur die Verwaltung von ein parar
Daten. Heutige professional Datenbanken besitzen einen Umfang von vielen Millionen Zeilen
Code. Estos bancos de datos profesionales se encuentran en grandes registros, Unix o
Windowsservvern y están llenos de todas las opciones disponibles.
Zusammenfassend können wir sagen, dass eine Datenbank eine komplex
Datenorganisation mit einem umfangreichen Angebot an Dienstleistungen verschmilzt mit
dem Ziel, dem Anwender eine möglichst einfache, logische und trotzdem mächtige und
leistungsfähige Schnittstelle anzubieten.

1.3 El administrador del Datenbank

Die zahlreichen Wünsche des letzten Abschnitts, insbesondere auch zum Zugriffsschutz und zur
Datenbankkontrolle, lassen erkennen, dass die Datenbank von uner autorisierten Person oder
Personengruppe verwaltet werden muss. Dieser Verwalter der Datenbank heißt Datenbank-
Administrator. Zu seinen Aufgaben zählen:

- Einrichten der Datenbank


- Control del banco de datos

Zum Einrichten gehören der vollständige Aufbau der Datenbank, das Erzeugen der
Datenbanktabellen und das Festlegen der internen Strukturen (por ejemplo, B. Indizes für
schnelle Zugriffe, Partitionierung, Verteilung von Daten). Dies geschieht in der Regel nach dem
Erzeugen einer Datenbank und vor der eigentlichen Freigabe für die Benutzer.
Die Kontrolle umfasst die Verwaltung, Überwachung und Steuerung der Datenbank im
laufenden Betrieb. Neue Benutzer werden zugelassen, Schutzwörter vergeben und Sichten
eingerichtet. Se reagiert auf Meldungen des DBMS. Im Fehlerfall werden die erforderlichen
Anweisungen an das DBMS gegeben. Im Bedarfsfall werden Maßnahmen zur Steigerung der
Performance durchgeführt.
El administrador del Datenbank se encarga de esta verificación de todos los derechos
del Datenbank. Er ist ein Datenbankspezialist und kennt die Schnittstelle des ver-
1.4 Modelo de banco de datos 11

wendeten Datenbanksystems genau. Auf Performance-Probleme cann er passend reagieren


and leistet gegenüber dem Anwender gegebenenfalls technische Unterstützung.
Demgegenüber besitzt der „normale“ Benutzer keine Rechte zum Aufbau oder Ändern
der internanen logischen Datenbankstruktur. Este klare Aufgabenteilung es sinnvoll und
zweckmäßig. Das Interesse des Anwenders liegt schließlich ausschließlich an der
Datenbank gespeicherten Daten und dem Zugriff auf diese Daten. Der Anwender besitzt
dazu Rechte zum Abfragen und Ändern dieser Daten, wobei diese Rechte vom
Datenbank-Administrator für jeden Anwender passend vergeben werden. Es liegt also
eine genau definierte Aufgabenteilung zwischen Anwender und Administrator vor. Diese
Aufgabenteilung tritt auch an der Datenbankschnittstelle deutlich hervor. Estos
Schnittstelle lässt sich nämlich in drei Teile zerlegen:

- DDL (D ataD descripciónl idioma)


- Kontrollsprache (a menudo en DDL integrado)
- DML (D ataMETRO anipulacionl idioma)

Die ersten beiden Teile betreffen den Administrator. Sie dienen zur Beschreibung und
Kontrolle der Datenbank. Mit Hilfe von DML-Befehlen werden Daten gespeichert, gelesen,
geändert und gelöscht. Die vier DML-Befehle von SQL haben bereits kurz kennen gelernt.
Sie heißen:

SELECCIONAR zum Abfragen,


ACTUALIZAR zum Además,
BORRAR zum Löschen y
INSERTAR zum Einfügen von Daten in eine Datenbank.

Intensiv werden wir auf this Zugriffsbefehle in Kap.4eingehen. Una configuración


DDL típica en SQL es:

CREAR MESA zum Erzeugen einer Tabelle, zum Löschen


MESA PLEGABLE einer Tabelle, zum Erzeugen einer Sicht, zum
CREAR VISTA Gewähren von Zugriffsrechten.
CONCEDER

Estos y otros DDL-Befehle werden wir in Kap.5im Detail kennen lernen.

1.4 Modelo de banco de datos

Wir unterscheiden heute im Wesentlichen vier Datenbankmodelle. Eines dieser Modelle haben
wir bereits kennen gelernt, dieBancos de datos relacionales. Hinzu kommen die
objektorientierten und die bereits in die Tage gekommenen jerarquischen und netzwerkartigen
Datenbanken. Die Unterschiede dieser vier Modelle liegen im logischen Aufbau
12 1 Übersicht über Datenbanken

der Datenbank. In den letzten 30 Jahren erlebten die relacionalen Datenbanken einen
enormen Aufschwung. Da aber ein immer noch erheblicher Teil der heutigen
Datenbanken älter as 30 Jahre ist, sind weiterhin viele Daten in jerarquischen oder
netzwerkartigen Datenbanken gespeichert. In den letzten 20 Jahren haben auch die
objektorientierten Datenbanken Fuß gefasst, eine wirklich große Bedeutung haben sie
aber bis heute nicht erlangt. Die konzeptuellen Unterschiede dieser vier Modelle wollen
wir im Folgenden kurz vorstellen.
Es sei nicht unerwähnt, dass in den letzten Jahren weitere neue Datenbankkonzepte
entstanden. Las mejores fechas en Internet deben estar bien preparadas. Heer spielt
Replikation eine enorme wichtige Rolle, aber auch neue Speichertechniken, wie etwa
spaltenorientierte Datenbanken. Meist werden diese Datenbanken unter dem Begriff
NoSQL zusammengefasst. Wir werden darauf hier und in Abschn.9.1kurz eingehen.

1.4.1 Bancos de datos relacionales

unobanco de datos relacional Besteht ausschließlich aus Tabellen, auch Relationen


genannt. Ein Zugriff erfolgt immer über diese Tabellen. Las nuevas tablas relativas a
las fechas de los bancos de datos logísticos pueden variar ligeramente. Weiter sind
Zugriffe auf Tabellen einfach zu programmieren, was zu der großen Beliebtheit this
Datenbankmodells führte: Fast alle new Datenbanken sind relacional.

Die Zusammenhänge zwischen den einzelnen Tabellen werden über Beziehungen


hergestellt. Estas publicaciones se encuentran en las tablas con una descripción detallada. Der
Aufbau von Datenbeständen über Tabellen und ihre Beziehungen zueinander sind
mathematisch fundiert, etwa im Relationenkalkül und in der relacionalen Algebra, siehe
Abschn.2.5y Fecha (2003) y Elmasri y Navathe (2009).
Los bancos de datos relacionales se besan también en las noches. Zugriffe erfordern oft das Lesen
und Zusammenfügen von Daten aus mehreren Tabellen, was die Laufzeit verlängert und zu vielen
Ein- und Ausgaben führt. Auch können einige Daten nur redundant in Tabellenform abgespeichert
werden. Estos números y fechas de los bancos de datos relacionales se encuentran en la pestaña.1.3
kurz zusammengefasst.

Pestaña. 1.3Zusammenfassung zu relacionalen Datenbanken

Bancos de datos relacionales

leichte Änderbarkeit des Datenbankaufbaus


vorteile matemático fundado
leicht programmierbar und zu verwalten
häufig viele Ein-/Ausgaben notwendig
Noche erfordern eine hohe Rechnerleistung
besitzen Redundanzen
1.4 Modelo de banco de datos 13

Los bancos de datos relacionales utilizados son Oracle, DB2 de IBM y SQL Server de
Microsoft. Se pueden utilizar bancos de datos de código abierto como MySQL y Postgre-
SQL.

1.4.2 Bancos de datos orientados a objetos

unobanco de datos orientado a objetos besteht ausschließlich aus Objekten. Ein Objekt kann
entweder eine Person, eine Abteilung einer Firma, ein realer Gegenstand (z. B. ein Buch) oder
ein abstrakter Gegenstand (z. B. eine Adresse oder eine Rechnung) sein.
Da viele Objekte auch in Tabellenform gespeichert werden können, werden
objektorientierte Datenbanken häufig als eine Erweiterung relacionaler Datenbanken
angesehen. Dies trifft allerdings nur teilweise zu. Schließlich gehören zu un objektorientierten
Datenbank auch objektorientierte Ansätze wie Klassen, Datenkapselung oder Vererbung –
Ansätze wie sie auch in der objektorientierten Programmierung Verwendung finden.
In der Praxis hat sich in den letzten Jahren eine Mischform zwischen objektorientierten und
relacionalen Datenbanken durchgesetzt: so genannteobjektrelationale Datenbanken . Estos bancos
de datos son una versión de los bancos de datos relacionales en la Richtung Objektorientierung, sin
tener en cuenta todas las ideas de la objektorientierung auszuschöpfen.
Objektorientierte und objektrelationale Datenbanken haben einen komplexeren Aufbau als
relacionaale Datenbanken (komplex Objekte statt einfacher Tabellen). Als Konsequenz müssen
Designer und Anwendungsprogrammierer einen höheren Aufwand in Entwurf und
Programmierung investieren. Auch die interne Verwaltung der Datenbank ist sehr aufwendig.
Als Vorteil erhalten wir einen Aufbau, der direkt der Realität entspricht, insbesondere bei
technischen und multimedialen Anwendungen. Komplexe Objekte müssen nicht mühevoll auf
einfache Strukturen (zum Beispiel auf Tabellen) abgebildet werden. Die Vor- und Nachteile sind
kurz in Tab.1.4zusammengefasst. Eine übersichtliche Einführung finden wir in Abschn.9.2y en
fecha (2003) y Elmasri y Navathe (2009).
Los principales bancos de datos relacionados con objetos son Oracle, DB2 y
PostgreSQL.

Pestaña. 1.4Bancos de datos orientados a objetos

Objektorientierte und -relationale Datenbanken


objektorientierter Aufbau
universell einsetzbar
vorteile
noch relativ einfach zu programmieren und zu verwalten
(teilweise) aufwärtskompatibel zu relaalen Datenbanken
relativ viele Ein-/Ausgaben notwendig
Noche erfordert eine relativ hohe Rechnerleistung
teilweise recht komplexer Aufbau
14 1 Übersicht über Datenbanken

1.4.3 Bancos de datos jerárquicos y netos

Die Dinosaurier unter den Datenbanken sindbancos de datos jerárquicos . Sie wurden ab etwa
1960 eingesetzt. Der logische Aufbau dieser Datenbanken entspricht einer Baumstruktur. Der
Zugriff erfolgt immer über die Wurzel (oberster Knoten) in Richtung des gewünschten Knotens.
Dies gewährleistet geringste Redundanz, da directamente über die Baumstruktur zugegriffen
wird, y garantiert kürzeste Zugriffszeiten. Der Nachteil ist eine eine extrema hohe Inflexibilität
gegenüber Änderungen in der Datenbankstruktur.
Aus diesem Grund wurde dieses Modell sehr schnell durch dienetzwerkartige
Datenbank ergänzt. Hier besteht der logische Aufbau aus Daten, die nicht mehr
hierarchisch, sondern über ein beliebig aufgebautes Netz miteinander in Verbindung
stehen. Dies erhöht die Flexibilität erheblich, allerdings auf Kosten der Komplexität des
Aufbaus (siehe Abb.1.4). Beide Modelle können aus heutiger Sicht no mehr befriedigen,
da Strukturänderungen aufwendig und Zugriffe komplex sind.
Los principales bancos de datos jerárquicos son IMS de IBM, bancos de datos netos
como IDMS (Computer Associates) y UDS (Fujitsu). Einzelheiten können en McGee (1977) y
UDS (1986) nachgelesen werden. Eine sehr schöne Darstellung finden wir auch in Date (
2003). Encontrará una pequeña información de uso en la pestaña.1.5.

Banco de datos jerárquico Netzwerkartige Datenbank

Tejido. 1.4 Hierarchische und netzwerkartige Datenbanken

Pestaña. 1.5 Hierarchische und netzwerkartige Datenbanken

jerárquico tarjeta de red


sehr kurze Zugriffszeiten kurze Zugriffszeiten
vorteile
minimale Redundanz geringe redundancia
Estructuras y programas Estructuras adicionales
Noche
combinados complejos programación adicional
1.4 Modelo de banco de datos 15

1.4.4 Instalaciones modernas

Das Verwalten riesiger Datenbestände im Internet wird immer wichtiger y auch


marktentscheidend. Google ist zur Zeit die mit Abstand bekannteste Suchmaschine.
Milliarden von Informationen werden intern verwaltet, und im Bruchteil einer Sekunde
wird jede Anfrage punktgenau beantwortet. También Amazon opera en Internet de forma
más popular. Hier kommt zusätzlich der Verkauf hinzu, so dass zu den vielen Anfragen
auch viele Buchungen pro Sekunde bewältigt werden müssen. Als drittes Beispiel sei
Facebook erwähnt. Weit über einhundert Millionen Menschen tummeln sich täglich in
diesem ebenfalls weltweit operierenden Portal.
Alle drei Firmen haben das gleiche Problem: „Normale“ Relationsale Datenbanken
können diese Fülle von Anfragen nicht mehr effizient bewältigen. Los bancos de datos
relacionales son una seguridad extrema, y el mecanismo de transacciones es un banco
de datos privado. Jede Datenänderung ist sofort sichtbar. Rechnerabstürze führen nicht
zu Inkonsistenzen. Dies alles kostet eine erhebliche Systemleistung. Bei Internetabfragen
spielt es aber meist keine Rolle, ob eine Information sekundengenau stimmt, oder ob der
Informationsstand bereits 10 Minuten alt ist. Indem wir also die Konsistenz der Daten
nicht sekundengenau garantieren, können wir Transaktionen vereinfachen und somit
schneller zugreifen. Una conexión paralela a un servidor puede funcionar correctamente.
Das eigene Verwaltungssystem sorgt dafür, dass die Daten in absehbarer Zeit
untereinander abgeglichen werden und damit auf Dauer konsistent werden. El tiempo de
espera se activará en el servidor no autorizado, pero cuando las fechas no estén activas.

Estos nuevos modelos son sus propios años en el ámbito profesional. Sie werden
meist unter dem Begriff NoSQL zusammengefasst. Esta descripción solo incluye la
documentación de SQL. Seit einigen Jahren gibt es jedoch eine deutliche Annäherung an
SQL, desde 2009 sprechen wir meist nicht mehr vonSin SQL, sondern vonNo sólo SQL.
Podemos usar los bancos de datos NoSQL en tres modelos de bancos de datos:

- Clave/Valor y modelo basado en documentación


- Modelo Spaltenorientierte
- Modelo de banco de datos orientado a grafeno

Clave/Valor-Speichermodelle und dokumentenbasierte Datenbanken sind Schemefreie


Systeme. Dies bedeutet, dass der Aufbau der Datensätze nicht schon beim Anlegen der
Datenbank vorgegeben wird. In relacionalen Datenbanken ist die Tabellenform
vorgeschrieben, in Key/Value-Modellen kann die Struktur noch bis direkt vor dem Ablegen
eines Datensatzes definiert werden. Tenemos una flexibilidad extrema, por lo que
tenemos documentos confiables y objetos codificados en el banco de datos. Los bancos
de datos clave/valor y los modelos documentados son muy largos, como DBM (Database
Manager) de Ken Thompson desde 1979, y también Lotus Notes de IBM es un banco de
datos documentado. Berkley-DB como Key/Value-Datenbank
dieciséis 1 Übersicht über Datenbanken

wird auch heute noch produktiv eingesetzt. Utilice bancos de datos documentales como
CouchDB y MongoDB (Boeker2010). Im Detail sei hier auf Edlich et al. (2010) verwiesen.

Die spaltenorientierten Datenbanken speichern Daten spaltenweise ab. In Relationsalen


Datenbanken werden alle Datensätze Zeile für Zeile abgelegt. Suchen wir jetzt immer nur ganz
gestimmte Eigenschaften, so kann der spaltenorientierte Ansatz gegenüber dem bisherigen
zeilenorientierten zu erheblichen Leistungssteigerungen führen. Vertreter estos bancos de
datos sind beispielsweise Googles BigTable (Chang et al.2006), Amazons SimpleDB y los
productos de código abierto HBase (Bangel und Weingärtner2011) y Cassandra (Spichale2011).

Graphen orientierte Datenbanken basieren auf der Graphentheorie. Insbesondere beim


Speichern von Geodaten sind estos Datenbanken von großem Vorteil. Das Traversieren,
también das Bestimmen einer Route, ist mit diesen Datenbanken deutlich performanter zu
lösen als mit herkömmlichen Systemen. In Navigationsgeräten und Smartphones halten diese
Datenbanken daher vermehrt Einzug. Die derzeit bekanntesten Vertreter sind Sones y Neo4j.
Einen guten Überblick über diese Techniken liefert wiederum Edlich et al. (2010). Einen guten
Gesamtüberblick über diese postrelationalen Datenbanken finden wir auch in Meier (2010).

1.5 Transacciones

Datenbanken wurden eingeführt, damit Anwender möglichst einfach auf Datenbestände


zugreifen können. Zugriffe auf eine Datenbank können lesend oder schreibend erfolgen.
Genaugenommen unterscheiden wir zwischen drei Zugriffsarten:

- Abfrage (consulta, recuperación)

- Mutación
- Transacción

Mit einer Abfrage wird ein Ausschnitt der Datenbank ausgewählt und abgegrenzt.
Anschließend wird der Inhalt dieses Ausschnitts gelesen. Die Datenbank selbst bleibt
unverändert.
En SQL erfolgen Abfragen mit demSeleccionar-Befehl. Beispiel:

SELECCIONE Spalten DE Tabellen DONDE Bedingungen ;

Aquí sind die Angabenespalten,tablasycamasAbgrenzungen der Datenbank. Als


Ergebnis erhalten wir einen Ausschnitt aus der Datenbank.
Con unoMutación wird ein Ausschnitt der Datenbank ausgewählt und abgegrenzt. Der
Inhalt dieses Ausschnitts wird geändert, gelöscht, oder neuer Inhalt wird hinzugefügt. El
Datenbankinhalt wird dadurch verändert. Las funciones SQL para la mutación están activas
Actualizar,BorraryInsertar.
1.5 Transacciones 17

unoTransacciónist eine Konsistenz erhaltende Operation auf einer Datenbank. Eine


Operation besteht aus eventuell mehreren Abfragen und Mutationen. Unter Konsistenz
erhaltenden Operationen verstehen wir Operationen, die, ausgehend von konsistenten
Datenbanken, diese Konsistenz beibehalten.
Die BegriffeabfragaryMutaciónsind selbsterklärend. Wir unterscheiden sie deshalb, da
Mutationen im Gegensatz zu Abfragen zusätzlich schreibend auf Teile der Datenbank
zugreifen. Nueva bisagra es el BegriffTransacción. Wir wollen die Notwendigkeit von
Transaktionen an einem einfachen Beispiel aufzeigen:
Betrachten wir eine Überweisung Innerhalb eines Geldinstituts. Este Institut speichert in
ihrer Datenbank in der Regel auch die Tagessalden, so zum Beispiel die Summe aller
Kontostände der Bank. Überweist nun Kunde A den Betrag von 1000 Euro auf das Konto des
Kunden B in der gleichen Bank, so besteht diese Überweisung aus dos Mutationen: Kunde A
wird mit 1000 Euro belastet, Kunde B erhält 1000 Euro. Jede dieser beiden Mutationen ist für
sich keine Transaktion: Beispielsweise wurde nach dem Abbuchen von 1000 Euro von Konto A
die Summe aller Kontostände der Bank um genau diesen Betrag reduziert, der in der
Datenbank gespeicherte Summenwert wurde aber nicht geändert! In diesem kurzen
Augenblick nach der ersten und vor der zweiten Buchungwidersprechen sich die Summe und
der gespeicherte Summenwert: Die Konsistenz ist verletzt! Antes de que se produzcan
mutaciones, se deben eliminar las consistencias:

Actualizar Kontotab Establecer Kontostand = Kontostand - 1000


Donde Konto = A
Actualizar Kontotab Establecer Kontostand = Kontostand + 1000
Donde Konto = B

War die Datenbank vor der Ausführung dieser beiden Befehle in sich schlüssig, so
bleibt sie dies auch danach. Es liegt somit insgesamt eine Transaktion vor.
consistencia Heißt die Freiheit von Widersprüchen Innerhalb einer Datenbank. Konsistenz
ist in Datenbanken von zentraler Bedeutung. Ist die Datenbank nach ihrer Erzeugung
konsistent, und werden als Zugriffe auf die Daten dieser Datenbank ausschließlich
Transaktionen zugelassen, so wird diese Datenbank nach Definición dauerhaft konsistent
bleiben.
Wir erkennen daraus zweierlei: Erstens ist die Konsistenz einer Datenbank umso
aufwendiger, je mehr Redundanz diese Datenbank enthält, da dadurch die logischen
Abhängigkeiten der Daten untereinander wachsen. dos veces sindtodos Zugriffe in einer
kommerziellen Datenbankanwendung zwingend Transaktionen.
Es sei noch angemerkt, dass eine Transaktion nicht nur im Normalbetrieb die Konsistenz
erhalten muss, sondern vor allem im Fehlerfall, etwa bei einem Rechnerabsturz. Eine
Datenbank hat folglich immer dafür zu sorgen, dass eine Transaktion komplett oder gar nicht
ausgeführt wird. ¡Eine Transaktion ist somit ein atomarer Zugriff! La garantía, dass una
transacción tatsächlich atomar abläuft, muss das DBMS übernehmen.
18 1 Übersicht über Datenbanken

Wegen der Wichtigkeit von Transaktionen in einem Datenbanksystem werden die Begriffesistema
de banco de datosysistema de transaccionessinónimo de meist verwendet:

Datenbankbetrieb Transacciones

In den nächsten Kapiteln werden wir zunächst den Aufbau von relacionalen
Datenbanken und die Abfragen und Mutationen auf Datenbanken kennen lernen.
Anschließend werden wir uns mit Transaktionen in den Kap.6y8ausführlich beschäftigen.

1.6 El modelo de consistencia ACID

Wir wollen das Transaktionsprinzip noch etwas vertiefen und darlegen, warum Transaktionen
in einer Datenbank so wichtig sind. Kommen wir daher zurück zu unseren wesentlichen
Erwartungen an eine Datenbank: Diese soll Daten dauerhaft, sicher und konsistent
abspeichern. Mehrere Benutzer sollen problemlos paralelos lesend und schreibend auf dien
zugreifen können. Estos Grunderwartungen han sido T. Härder y A. Reuter (1983) dazu
inspiriert, den Transaktionsbetrieb mit nur vier Begriffen zu charakterisieren und als
KonsistenzmodellÁCIDOzu bezeichnen. Este vier BuchstabenÁCIDOstehen para:

- Atomarität (Atomarität)
- Konsistenz (Consistencia)
- Aislamiento

- Dauerhaftigkeit (Durabilidad)

Diese vier Begriffe geben sehr genau wieder, was wir von einem Transaktionsbetrieb
erwarten. Jede Transaktion erfolgtatomar , también zusammenhängend. Entweder wird die
gesamte Transaktion vollständig ausgeführt, oder die Transaktion wird überhaupt nicht
vollzogen, auch nicht in Teilen. En relación con los datos de los bancos de datos es para las
transacciones con dos tipos de beneficios:

COMPROMETERSE ;

RETROCEDER ;

Mit dem BefehlComprometerseSe ha realizado una transacción. Jetzt kann der Benutzer
sicher sein, dass die Transaktion vollständig Bearbeitet wurde und alle Daten entsprechend in
der Datenbank gespeichert sind. Mit dem BefehlRetrocederLas bisagras no cambian los datos
del banco de datos, pero estas transacciones no se realizan correctamente. Wir erwarten
natürlich von der Datenbank, dass sie dazu auch jederzeit in der Lage ist.
Transaktionen sind konsistenzerhaltende Operationen. Der Anwendungsentwickler
muss bei Zugriffen genau wissen, wann Konsistenzpunkte erreicht sind. Estos punkten
darán joyas y una transacción se realizará y comenzará de nuevo. La atomaridad
1.7 Übungsaufgaben 19

garantiert, dass Transaktionen nur vollständig ausgeführt werden. Die Konsistenz der
Datenbank bleibt also gewährleistet.
Nach dem Beenden einer Transaktion darf ein einmal gespeichertes Datum
grundsätzlich nicht mehr verloren gehen. Auch nach einem Rechnerabsturz, ja sogar nach
einem Brand müssen diese möglicherweise verlorenen Daten wiederhergestellt werden
können. Das langfristige unddauerhaft sichere Ablegen der Daten ist die Basis jeder
Datenbank.
Im heute üblichen Mehrbenutzerbetrieb greifen paralelo hunderte Benutzer auf die Daten
der Datenbank zu. Ohne Interne Schutzmechanismen könnten hier gleichzeitige Änderungen
zu fehlerhaften und inkonsistenten Daten führen. Wir gehen darauf im Abschn.8.3 Soy un
detalle. Eine Datenbank muss daher die einzelnen Benutzer gegenseitig schützen undaislar .
Jede einzelne Transaktion debe ablaufen, als sei sie allein im System.
Keine Bank, keine Versicherung und kein anderes größeres Unternehmen könnten heute
ohne diese Grundforderungen erfolgreich ihre Daten verwalten. ACID ist nicht nur ein
Schlagwort, sondern fast immer ein absolutos Muss!

1.7 Übungsaufgaben

Aufgaben
1. Welche Vorteile bietet eine Datenbank gegenüber der direkten Verwaltung von
Daten? ¿Fue sind die Nachteile?
2. Beantworten Sie an Hand des Beispiels des Bierdepots folgende Fragen intuitiv: Hängt die
SQL-Datenabfrage von der Reihenfolge der Datensätze ab? ¿Hängt die Manipulation
von Daten von der Reihenfolge der Datensätze ab? ¿Spielt vielleicht die Reihenfolge der
Spalten beim Lesen oder Schreiben eine Rolle? Sind doppelte vollständig identische
Datensätze in irgendeiner Weise von Nutzen?
3. Geben Sie am Beispiel einer großen Datenbank (z. B. Datenbank einer Versicherung
oder eines Geldinstituts) an, wie wichtig die einzelnen Anforderungen aus Abschn.
1.2sind. Betrachten Sie dabei alle Anforderungen einzeln.
4. Warum ist die Trennung zwischen Administrator und Anwendern (Benutzer) in
Datenbanken so wichtig?
5. Wenn eine (kleinere) Datenbank im transaktionslosen Einbenutzerbetrieb verwendet wird,
so muss die Konsistenz der Daten vom Anwender selbst kontrolliert werden. Wie
könnte dies aussehen? ¿Diskutieren Sie den Aufwand? ¿Warum arbeiten einige kleine
Datenbanken auch heute noch ohne Transaktionsmechanismen?
6. ¿Era un banco de datos relacional? ¿Wie unterscheidet sie sich von nicht
relacionalen?
20 1 Übersicht über Datenbanken

7. Geben Sie die Ergebnisse folgender SQL-Abfrage-Operationen zum Bierdepot aus:

a) SELECCIONE Sorte, Hersteller DE Bierdepot


DONDE Tipo = 'Fass';
b) SELECCIONE Sorte, Hersteller, Anzahl DE Bierdepot
DONDE Anzahl < 4;
c) SELECCIONE Hersteller, Anzahl DE Bierdepot
DONDE Ordenar = 'Pils' Y
Tipo = 'Kasten';

8. Geben Sie die Ergebnisse folgender SQL-Änderungs-Operationen zum Bierdepot


aus:

a) INSERTAR EN Bierdepot
VALORES (18, 'Exportar', 'EKU', '6er Pack', 8);
b) BORRAR DESDE Bierdepot
DÓNDE Tipo = 'Kasten' AND Anzahl < 5;
c) ACTUALIZAR Bierdepot
COLOCAR Anzahl = Anzahl + 2 Nr =
DÓNDE 28 O Nr = 47;

9. Schreiben Sie die entsprechenden SQL-Anweisungen:


a) Geben Sie alle Sorten mit Hersteller an, die 6er-Packs vertreiben.
b) Geben Sie alle Sorten an, die vom Hersteller Löwenbräu im Depot vorrätig sind.

c) Entfernen Sie alle Sorten des Herstellers Kneitinger.


d) Entfernen Sie 10 Kasten Pils des Herstellers Löwenbräu.
e) Fügen Sie die BiersorteDunkles Weißbierder Firma Schneider mit der Nummer
10, dem Typcastillound der Anzahl 6 hinzu.
10. En NoSQL-Datenbanken wird der Transaktionsmechanismus aufgeweicht. In welchen
Einsatzbereichen ist dies hinnehmbar, wo nicht?
11. Warum ist Isolation (Aislamiento steht für den BuchstabenIen ÁCIDO) ¿Qué significa eso?
Geben Sie ein Beispiel an, warum fast gleichzeitige ungeschützte paralelole Zugriffe auf
Daten die Konsistenz verletzen können.
Literatura 21

Literatura

Bangel, D., & Weingärtner, K. (2011).Verificación de la realidad NoSQL. Espectro de


Java. Boeker, M. (2010).MongoDB – Sagja zu NoSQL. entwickler.press.
Chang, F., Dean, J., Ghemawat, S., & Hsieh, WC y col. (2006).Bigtable: un almacenamiento distribuido
Sistema de datos estructuradosSimposio Proc USENIX sobre diseño e implementación de sistemas
operativos.
Connolly, T., & Begg, C. (2015).Sistemas de bases de datos(6. Aufl.). Pearson.
Fecha, CJ (2003).Una introducción a los sistemas de bases de datos(8. Aufl., Bd. 1). Addison-Wesley.

Edlich, S., Friedland, A., Hampe, J., Brauer, B., & Brückner, M. (2010).NoSQL – Integrado en el modelo
Welt nichtrelationaler WEB 2.0 Datenbanken. Hanser.
Eirund, H., & Kohl, U. (2010).Datenbanken – leicht gemacht. Springer Vieweg. Elmasri, R., &
Navathe, S. (2009).Grundlagen von Datenbanksystemen(3. Aufl.). Pearson.
McGee, WC (1977). El Sistema de Gestión de la Información IMS/VS.Revista de sistemas IBM,dieciséis(2),
84–95.
Haerder, T., & Reuter, A. (1983). Principios de recuperación de bases de datos orientada a transacciones.Informática
Encuestas,15(4), 287–317.
Kemper, A., & Eickler, A. (2015).Datenbanksysteme – Eine Einführung. Oldenburgo.
Meier, A. (2003).Bancos de datos relacionales: Eine Einführung für die Praxis. Springer Taschenbuch.
Meier, A. (2010).Bancos de datos relacionales y postrelacionales. Saltador. Redmond, E., & Wilson, JR
(2012).Sieben Wochen, sieben Datenbanken. O'Reilly. Spichale, K. (2011). Casandra y Héctor.revista
java,8, 47.
UDS (1986).UDS: Universelles Datenbanksystem en BS2000. Siemens AG.
Unterstein, G., & Matthiessen, M. (2012).Bancos de datos relacionales y SQL en teoría y práctica.
Saltador.
Zehnder, CA (2005).Sistemas de información y bancos de datos. vdf Hochschulverlag.
El modelo de relación
2

Supervisión
Der logische Aufbau relacionaaler Datenbanken ist denkbar einfach: Eine relacionale
Datenbank besteht ausschließlich aus mit Daten gefüllten Tabellen. Der Zugriff auf die
Daten dieser Datenbank erfolgt grundsätzlich nur über diese Tabellen. Tabellen sind
geläufige Strukturen. Es ist daher sogar für den Laien einfach, eine relacionale
Datenbank zu erzeugen, darin Daten zu speichern und bei Bedarf abzurufen. Dies gilt
jedoch nur für sehr kleine Datenbanken! Schon Datenbanken mit 10 oder 20 Tabellen
erfordern einen sauberen und überlegten Aufbau. In der Praxis bestehen relacionale
Datenbanken aber häufig aus hunderten oder gar tausenden von Tabellen. Der
Datenbankaufbau ist dann von entscheidender Bedeutung für den späteren
problemlosen Betrieb dieser Datenbank. Wir dürfen nämlich folgende wichtigen
Forderungen beim Arbeiten mit Datenbanken nicht außer Acht lassen:

- Geringe Redundanz
- Gute Handhabbarkeit und einfache Erweiterbarkeit
- Einfache Zugriffe über möglichst wenige Tabellen
- Sicherstellung von Konsistenz und Integrität.

Redundanz, Handhabbarkeit, Konsistenz und Integrität haben wir bereits im Abschn.


1.2angesprochen: Wir wollen keine Mehrfachhaltung von Daten, diese kostet nur
Speicherplatz und führt schnell zu Inkonsistenzen. Nosotros tendremos un banco de
datos integrado y más amplio, auf die wir uns verlassen können. Natürlich sollte diese
Datenbank auch einfach handhabbar sein, was noch durch den Wunsch nach einfachen
Zugriffen verstärkt wird. Wir wollen aber auch pro Anforderung auf nur wenige Tabellen
zugreifen, um die Antwortzeiten klein zu halten.
24 2 El modelo de relación

Die vollständige Berücksichtigung dieser vier Anforderungen setzt fundierte


Kenntnisse über den logischen Aufbau und das Design von Tabellen voraus. Mit dem
logischen Aufbau einzelner Tabellen und ihrer Beziehungen zueinander werden wir uns in
diesem Kapitel im Detail beschäftigen. Das Design einzelner Tabellen und ganzer
Datenbanken ist Inhalt von Kap.3. Grob können wir sagen, dass wir in diesem Kapitel den
Pflichtteil behandeln. En Kap.3Siguiendo el Kür, el ebenfalls ungemein wichtig für das
einwandfreie Funktionieren einer Datenbank ist.
Comenzamos con un Beispieltabelle, die wir nicht zur Nachahmung empfehlen.
Erfahrungsgemäß motivieren Negativbeispiele dahingehend, es zukünftig besser zu
machen. Wir gehen anschließend ausführlich auf relacionale Datenstrukturen ein und
werden relacionale Datenbanken exactamente definido. Es folgt ein Abschnitt über die
dos Integritätsregeln, die zur Sicherstellung der Integrität in Datenbanken erfüllt sein
müssen, und die deshalb den Aufbau von Tabellen und die Beziehungen zwischen den
Tabellen entscheidend mitprägen. Wer beenden this Kapitel mit einem theoretischen
Abschnitt zur relacionale Algebra, der mathematischen Grundlage des Zugriffs auf
relacionale Datenbanken. Als zusätzliche und vertiefende Literatur sei auf Date (2003),
Jarosch (2016), Kemper y Eickler (2015), Maier (1983), Meier (2003) y Unterstein y
Matthiessen (2012) bisagras.

2.1 Beispiel zu relacionaalen Datenbanken

Relational Datenbanken gewähren dem Datenbankentwickler viele Freiheiten. Dies hat aber
nicht nur Vorteile, denn nur ein guter Aufbau der Tabellen ermöglicht dauerhaft zuverlässige
und performante Zugriffe. Umgekehrt führt ein schlechtes Design zu einer komplexen und
umständlichen Handhabung. Wir wollen den Satz „einmal schlechtes Design, immer schlechte
Anwendung“ an einem einfachen Negativbeispiel demonstrieren, der Datenbanktabelle
VerkaeuferProductoen la pestaña.2.1. Wie wir Tabellen besser, ja optima, gestalten, zeigen wir
dann im weiteren Verlauf auf.
Auf den ersten Blick wirkt die TabelleVerkaeuferProductounspektakulär. Sie enthält alle
wichtigen, benötigten Daten: die Daten des Verkäufers und die verkauften Produkte mit
Wertangaben. Herr Meier hat zum Beispiel Waschmaschinen im Wert von 11.000 Euro, Herde
im Wert von 5000 Euro und Kühlschränke im Wert von 1000 Euro verkauft.

Pestaña. 2.1VerkaeuferProducto

VerkNr VerkNombre Por favor VerkAdresse Nombre del producto umsatz


V1 Meier 80331 Múnich lavadora 11000
V1 Meier 80331 Múnich Rebaño 5000
V1 Meier 80331 Múnich Kühlschrank 1000
V2 Schneider 70173 Stuttgart Rebaño 4000
V2 Schneider 70173 Stuttgart Kühlschrank 3000
V3 Müller 50667 Colonia Staubsauger 1000
2.2 Estructuras de datos relacionales 25

Bei näherer Betrachtung fall allerdings sofort Redundanzen auf. Der Name, die Postleitzahl
und die Adresse der Verkäufer kommen mehrfach vor. Änderungen der Daten eines Verkäufers
müssen wir in allen Zeilen durchführen, in denen dieser aufgeführt ist. Aus einer einzigen
beabsichtigten Mutation (Änderung) entstehen mehrere. Um Inkonsistenzen zu vermeiden,
müssen diese Mutationen atomar, also insidehalb einer Transaktion, ausgeführt werden. Wir
erhalten daher mit this kompakten und sicherlich gut gemeinten Tabelle unnötige
Redundanzen. Redundanz birgt nicht nur in diesem Beispiel immer eine Gefahrenquelle für
Fehler und Inkonsistenzen und kostet zusätzlich Speicherplatz.
Dieses einfache Beispiel enthält aber ein weiteres schwerwiegendes Problem: Nehmen
wir an, die Firma entschließt sich, den ArtikelStaubsaugeraus dem Sortiment zu nehmen.
Este artículo no está disponible en el banco de datos. Es werden deshalb alle Zeilen, die
den ArtikelStaubsaugerenthalten, aus der Datenbank entfernt. Leader verliert damit die
Datenbank auch alle Informationen zum VerkäuferMüller! La tabla intuitiva
VerkaeuferProductoerweist sich folglich sowohl in der Ausführung als auch im
Speicherverbrauch als problematisch. Wir werden später im Abschn.2.3noch sehen, dass
das naheliegende Löschen allein des SpalteneintragsStaubsaugernicht sinnvoll und in
related Datenbanken auch nicht zugelassen ist.
Este pequeño Beispiel zeigt uns bereits, dass zum Erstellen leicht anwendbarer Tabellen
gewisse Grundkenntnisse zu relacionaalen Datenbanken erforderlich sind. Bereits 1970
comenzó E. F. Codd bei seinen Untersuchungen zu relatedalen Datenbanken den Aufbau von
Tabellen systematisch zu studieren. Seine grundlegenden Arbeiten (Codd1970,1972) auf
diesem Gebiet führten zu mathematisch fundierten Theorien (Álgebra relacional,
Relationenkalkül, Normalformenlehre). Diese Theorien zeigen, dass Tabellen so aufgebaut
werden können, dass sowohl Redundanzen in den Daten vermieden als auch Einzeldaten
isoliert gelöscht werden können. Werden uns im Folgenden mit diesen Theorien eingehender
beschäftigen, wobei die praktische Anwendung im Vordergrund stehen wird.

2.2 Estructuras de datos relacionales

In diesem Abschnitt befassen wir uns mit dem Aufbau relacionaler Datenbanken.
Comenzamos con Grundlagen teóricos, insbesondere einigen wichtigen Begriffen.
Betrachten wir gleich Tab.2.2, in der formale Relationsale Bezeichner den mehr
informellen alltäglichen Bezeichnungen gegenübergestellt sind.
In der Regel bevorzugen wir in diesem Buch die exakteren formalen Bezeichnungen,
insbesondere benutzen wir meist den BegriffRelaciónanstelle des Begriffstabla. Zur
besseren Veranschaulichung dieser formalen Bezeichner aus Tab.2.2trachten wir Abb.2.1.
Dort steht eine kleine Relation von Lieferanten im Mittelpunkt. Die einzelnen Zeilen
heißen Tupel, die einzelnen Spalten Attribute. Insgesamt besitzt diese Relation fünf Zeilen
und vier Spalten, die Kardinalität dieser Relation ist daher fünf, der Grad ist vier. Der Grad
ist in a Relation fest vorgegeben, während die Kardinalität durch Einfügen oder Löschen
von Tupel laufend geändert werden kann.
26 2 El modelo de relación

Pestaña. 2.2 Begriffe in relacionalen Datenstrukturen

Relaciones formales Bezeichner Informelle Bezeichnung


Relación tabla
Tupel eine Zeile (Reihe) einer Tabelle
cardinalidad Anzahl der Zeilen einer Tabelle
Atributo un espacio (campo) una tabla
Graduado Anzahl der Spalten einer Tabelle
Primärschlüssel eindeutiger Bezeichner
Gebiet Menge aller moglichen Werte

Der Primärschlüssel ist in dieser Relation das erste Attribut, die Lieferantennummer LNr. En
los bancos de datos relacionales se utilizará la Eindeutigkeit des Primärschlüssels zwingend
gefordert. Weiter sind die einzelnen Einträge in der Relation no willkürlich wählbar. Vielmehr
werden sie einer Menge von gültigen Werten entnommen, der Definicionesmenge. Dies ist
zum Beispiel die Menge aller gültigen Lieferantennummern, die Menge aller denkbaren
Namen, die Menge aller Städte im Umkreis usw. Es existiert demnach zu jedem Attribut ein
eigener Definicionesbereich, auch Definicionesgebiet oder kurz Gebiet genannt.
Wir bezeichnen die Tabellen in einer relacionalen Datenbank als Relationen, wobei
natürlich nicht jede beliebige Tabelle im herkömmlichen Sinne eine Relation ist. Genau
genommen es una relaciónRauf einer Ansammlung von GebietenDidefinido und enthält
dos teile, einenkopf y einenRumpf .
elkopf besteht aus einer festen Anzahlnortepor atributosAila forma

F.A1ID1/; .A2ID2/; .A3ID3/; : : : ; .AnorteIDnorte/g ;

ciudad
nº Gebiete
Nombre
Por favor

Primar-
schlüssel

LNr LNaa
LNme SSta
t dt PPLZ
Kardinalität

1 Müller Múnich 81724


Relación 2 Schmidt Ratisbona 93055
Tupel
3 Maier Hamburgo 20543
4 negro Colonia 50087
5 blanco Berlina 11168

Atributo

Graduado

Tejido. 2.1Relacional Begriffe am Beispiel


2.2 Estructuras de datos relacionales 27

i
Atributo wobei jedesAigenau mit einem GebietDicorrespondido con1 Informell können norte.

wir sagen, dass der Kopf aus den Spaltenbezeichnungen mit den dazugehörigen
Datentypen aufgebaut ist.
Der Rumpf besteht aus einer variablen Anzahl von Tupel. Jedes Tupel besitzt die Forma:

F.A1Ivj1/; .A2Ivj 2/; .A3IvJ 3/; : : : ; .AnorteIvjn/gramo

con el TupelzählerjD1 : : : metro,WobeivJi2Dimit1 i nortedorado. Atributos de Jeder-

Eintrag eines jeden Tupel enthält also ein Element aus dem dazugehörigen Gebiet. Das
entsprechende korrespondierende Gebiet wird durch den Kopf festgelegt.
Wir bezeichnen die Zahlmetrotambién morircardinalidad y morir Zahlnortetambién guarida
Graduado la relaciónR. Es sei nochmals angemerkt, dass der Grad bereits beim Erzeugen der
Relation festgelegt wird. Das Hinzufügen einer weiteren Spalte (eines Attributs) ändert zwar
den Grad, genau genommen handelt es sich dabei aber um die Überführung einer Relation in
eine neue. Die Kardinalität bisagragen ist nach dem Erzeugen der Relation zunächst immer
gleich Null und wird sich mit jedem Einfügen eines neuen Tupel in die Relation erhöhen.

IDefinición: relaciónEine Relation ist eine Tabelle obiger Gestalt, bestehend aus einem
Kopf und einem Rumpf, mit folgenden vier Eigenschaften:

1. Es gibt keine doppelten Tupel.


2. Tupel sind nicht geordnet (etwa von oben nach unten).
3. Atributo sind nicht geordnet (etwa von links nach rechts).
4. Todos los atributos sind atomar.

Una relación también se veráRelación normalizada bezeichnet.


Die ersten drei Eigenschaften ergeben sich aus una fuerte matemática Definición der
Relationen: Eine Relation ist darin ganz grob nichts anderes als eine Menge von Zeilen (Tupel).
Und in Mengen existieren keine doppelten Einträge. Ein Element ist entweder in der Menge
oder aber nicht; nach der Häufigkeit des Vorkommens wird bei Mengen nicht gefragt. Aber
auch ohne Mathematik stellen wir fest, dass wir keine Zusatzinformation gewinnen, wenn wir
einen Eintrag zwei- oder dreimal in der Relation abspeichern. Wir würden nur die Redundanz
erhöhen, ohne dafür auch nur den geringsten Vorteil als Gegenleistung zu erhalten.

Nicht ganz so leicht nachvollziehbar ist die fehlende Anordnung der Tupel und Attribute. Es
gibt in Mengen zwar keine Reihenfolge. Für den Betrachter spielt es aber eine große Rolle, in
welcher Reihenfolge Informationen ausgegeben werden. Esta fehlende Anordnung basiert
aber auf der Forderung aus Kap.1, physische und logische Datenhaltung zu trennen. Esta
Forderung vereinfacht nämlich die interna physische Datenverwaltung enorm: ein
Datenbankhersteller kann seine Daten physisch beispielsweise nach dem Primärschlüssel
ordnen, muss dies aber nicht, und tut dies in der Regel auch nicht. Werden daher beim Zugriff
auf Relationennie die Anordnung der Tupel oder Attribute Innerhalb der Relation ausnutzen.
SQL está en esta situación posterior: SQL besitzt
28 2 El modelo de relación

Pestaña. 2.3 Nicht atomare RelaciónVerkaeuferProducto

VerkNr VerkNombre Por favor VerkAdresse Nombre del producto umsatz


lavadora,
V1 Meier 80331 Múnich 17000
Rebaño, Kühlschrank
V2 Schneider 70173 Stuttgart Rebaño, Kühlschrank 7000
V3 Müller 50667 Colonia Staubsauger 1000

keine Möglichkeit, die zweite oder siebte oder irgendeine andere bestimmte Zeile auszugeben!
Además, no dude en realizar operaciones de apertura, como SQL y una clasificación logística.
Physische und logische Datenhaltung sind also sauber getrennt. Es ist die Aufgabe der
Datenbank und nicht die des Benutzers, die Tupel so zu speichern, dass logische Sortierungen
möglichst performant durchgeführt werden.
Wir sollten nicht unterschätzen, welche Vorteile uns die Punkte 2 y 3 esta definición
einer Relation Bringen. Wir müssen uns beim Zugriff keine Gedanken über die
Reihenfolge der Tupel machen. Die Platzierung beim Hinzufügen eines neuen Tupel
überlassen wir der Datenbank. Ein komplexes Einfügen an einer bestimmten Stelle
entfällt oder wird interna gelöst. Genauso verhält es sich beim Hinzufügen eines weiteren
Attributs. Estos puntos 2 y 3 son un fondo más ligero, además de la relación entre los
bancos de datos y las fechas.
Die vierte Eigenschaft von Relationen erfordert eine genaue Definición de los Begriffs
atomar. Un atributoAiuna relación altaatomar , cuando jeder dazugehörige Attributseintragvyo
nur genau ein Element des GebietsDjenthält oder leer ist. Ebenso bestehen die Gebiete nur aus
Elementen, die im Sinne der Anwendung nicht noch weiter zerlegt werden können. Dies wollen
wir an dem einfachen Beispiel des Gebietsciudadveranschaulichen. Dieses Gebiet enthält
ausschließlich Städtenamen. Alle deutschen Städtenamen wären demnach Elemente dieses
Gebiets. Die Attribute im Rumpf der Relation enthalten je Tupel genau eines dieser Elemente.
Die Städtenamen sind also im Sinne obiger Definición atomar, auch wenn sie intern aus vielen
Einzelbuchstaben zusammengesetzt sind.
Die Forderung der Atomarität ist nicht direkt einsichtig, doch die Handhabung von
Relationen wird dadurch deutlich vereinfacht. Dies wollen wir an unserem Beispiel der Relation
VerkaeuferProductotambién Tab.2.1aufzeigen. Wir hatten Redundanzen erhalten, da wir zu
jedem verkauften Produkt nicht nur den Namen sondern auch die Adresse des Verkäufers
notierten. Estas redundancias se pueden utilizar con mayor facilidad cuando se utilizan
atributos. Nombre del productoalle verkauften Produkte eines Verkäufers aufzählen würden.
Die sich dabei ergebende Tabelle ist in Tab.2.3wiedergegeben. Wir sehen, dass wir jetzt nur
noch eine Zeile je Verkäufer benötigen.
Cuando no es necesario utilizar elementos metálicos cuando se utilizan productos que le
interesen, puede usar esta tabla de acuerdo con sus preferencias. Diese besitzt aber leider
erhebliche Nachteile. Ein erster Nachteil betrifft die physische Speicherung: In einer Relation
sind (gemäß unserer Definición) alle Tupel gleich lang. Dies vereinfacht die physische
Speicherung erheblich. Wir fügen immer gleich große Tupel hinzu, beziehungs-
2.2 Estructuras de datos relacionales 29

weise löschen diese wieder. Die interna Verwaltung ist somit relativ einfach. Betrachten wir nun
unsere nicht atomare Relación: Verkauft etwa Herr Schneider einen Trockner für 600 Euro, so
ist das AttributNombre del productoum ein Element zu erweitern. Wir brauchen zusätzlichen
Platz, eine Zusatzverwaltung wie beispielsweise verkettete Listen wäre erforderlich. Unsere
logische Tabellenstruktur würde komplex auf die physische abgebildet. Dies wollte aber E. F.
Codd mit der Einführung der Relationsalen Datenbanken vermeiden.
Ein weiterer Nachteil bezieht sich auf den Zugriff auf die Relation selbst. Wir haben bereits
gesehen, dass der Verkauf eines Trockners durch Herrn Schneider nur zu einem Hinzufügen
eines Attributs führen würde. Hätte bisagragen Frau Schmidt, die noch nicht in der Tabelle
aufgeführt ist, den Trockner verkauft, so wäre ein Hinzufügen eines kompletten Tupel
erforderlich. Der Verkauf eines Produkts würde demnach gegebenenfalls unterschiedliche
Operationen erfordern, je nachdem ob der Verkäufer bereits in der Tabelle eingetragen ist oder
nicht. Dieses Problem tritt in normalisierten Tabellen nicht auf. In beiden Fällen erfolgt dort
immer der Neueintrag eines Tupel. Wir wollen this zusätzliche Komplexität nicht und fordern
daher explizit die Atomarität.
Es sei allerdings nicht verschwiegen, dass das nicht atomare Abspeichern auch seinen
Reiz besitzt. Wir können damit ganz einfach größere Listen aufnehmen, oder gar komplex
Objektstrukturen! Und genau darauf basiert die Idee der objektrelationalen
Datenbanken. Als Einzelattribute sind nun sogar komplette Relationen erlaubt,
Relationen, die wiederum als Attribute Relationen enthalten dürfen und so weiter. Wir
verweisen im Detail auf Abschn.9.2.
Mit den Relationen können wir jetzt auch relacionale Datenbanken definieren:

IDefinición: banco de datos relacionalEine Relationsale Datenbank es un Datenbank, die der


Benutzer ausschließlich als eine Ansammlung von zeitlich variierenden, normalisierten
Relationen passender Grade erkennt.

Eine relacionale Datenbank ist demnach eine Ansammlung von Relationen, die
zueinander in Beziehung stehen, und die von einem Verwaltungssystem verwaltet
werden. La definición se aplica a menudo, pero el banco de datos físico no se incluye en el
formato de tabla. Wichtig ist allein der logische Aufbau, den der Benutzer sieht. Un banco
de datos, auf die ausschließlich mit SQL-Befehlen zugegriffen und die ausschließlich mit
SQL-Befehlen verwaltet wird, ist nach obiger Definición eine datenbank relacional. Dies
liegt daran, dass der Sprachumfang von SQL auf Relationen zugeschnitten ist. Es sei
hinzugefügt, dass es auch andere, stärker einschränkende Definiciones de datos
relacionales gibt, die zusätzlich fordern, dass auch die physische Speicherung in
Tabellenform geschehen muss. Wir verzichten darauf, da wir logische und physische
Strukturen strikt trennen wollen.
In der Praxis müssen wir den Begriff Relation noch näher specizifizieren. Wir unterscheiden
die „eigentlichen“ Relationen, Basisrelationen genannt, und drei davon abgeleitete Relationen.
Im Einzelnen sind muere:
30 2 El modelo de relación

- relaciones básicas
- Sichten (Vistas)
- abfrageergebnisse
- Relaciones temporales

relaciones básicasSind alle real existierenden und dauerhaft gespeicherten Relationen. Sie
sind so wichtig, dass sie vom Datenbank-Designer einen Namen erhalten und als fester
Bestandteil der Datenbank definiert und abgespeichert werden.

Sichtenheißen auch virtelle Relationen oderPuntos de vista, übernommen aus dem Englischen.
Sie existieren nicht real, erscheinen dem Benutzer aber wie "normale" Relationen. Sichten
werden aus Basisrelationen abgeleitet (siehe Abschn.5.3).

abfrageergebnissewerden in Tabellenform ausgegeben und besitzen ebenfalls die


Struktur einer Relation. Sie existieren jedoch nur temporär im Arbeitsspeicher während
der Ausgabe auf dem Bildschirm oder dem Drucker.

Relaciones temporalesexistieren ähnlich den Abfrageergebnissen nur vorübergehend. In der


Regel werden sie bei bestimmten Ereignissen automatisch wieder gelöscht, meist am Ende
einer Datenbanksitzung.
Die für uns mit Abstand wichtigsten Relationen sind the Basisrelationen. Todas las otras
relaciones se llevan a cabo en estas relaciones básicas, ya que son dauerhaft als Sichten, oder
nur zur Ausgabe oder temporär. Sichten sind besenders wichtig beim Zugriffsschutz. Mittels
Sichten kann ein Benutzer beispielsweise nur auf Teile einer Basisrelation zugreifen, so dass
ihm Daten, die nicht für ihn bestimmt sind, verborgen bleiben. Temporäre Relationen dienen
vor allem zum Abspeichern von Zwischenergebnissen, wenn etwa komplex Datenbankzugriffe
in mehrere einfachere zerlegt werden sollen.
Basisrelationen, Sichten und temporäre Relationen werden mit DDL-Befehlen erzeugt,
Abfrageergebnisse sind das Ergebnis von Zugriffs-, también DML-Befehlen. En SQL, esto
comienza como sigue:

CREAR MESA ... ; CREAR (erzeugt eine Basisrelation) (erzeugt


VISTA...; eine Sicht)
SELECCIONAR ... ; (erzeugt eine Abfrage)
CREAR TABLA TEMPORAL...; (erzeugt una relación temporal)

Der Create-Table-Befehl wird im Abschn.5.1ausführlich behandelt, der Create-View-


Befehl im Abschn.5.4. Den Select-Befehl werden wir im Abschn.4.1Kennen lernen. Der
Create-Temporary-Table-Befehl se basa en el Create-Table-Befehl y se abrirá en Abschn.
5.3vorgestellt.
2.3 Primärschlüssel 31

2.3 Primärschlüssel

Im letzten Abschnitt haben wir Relationen definiert. Jetzt ist es an der Zeit, diese Relationen mit
Daten zu füllen. Wir speichern dazu einen Datensatz nach dem anderen, also Zeile für Zeile ab.
Estas fechas pueden ser escritas por personas, etwa einen Lieferanten oder einen Mitarbeiter.
Sie können aber auch Produkte oder Aufträge beinhalten, je nach Relation. Aber eines haben
diese Datensätze immer gemeinsam: sie sind eindeutig identifizierbar. Und schon kommen wir
zum enorm wichtigen Primärschlüssel einer Relation: Wir bezeichnen nämlich ein Attribut einer
Relation alsPrimärschlüssel , wenn es jedes Tupel dieser Relacióneindeutig identificado. Der
Primärschlüssel muss kein einzelnes Attribut sein, sondern kann sich auch aus mehreren
Einzelattributen zusammensetzen.
Beispielsweise ist der Primärschlüssel in der Lieferantenrelation in Abb.2.1morir spalte
LNr. Allein durch diese Nummer ist jedes Tupel in der Relation eindeutig festgelegt. Wird
etwa der Lieferant mit der Lieferantennummer3gesucht, so können wir sicher sein, altos
einen Lieferanten mit dieser Nummer zu finden.
Es lässt sich leicht beweisen, dassjede Relaciónsumergir Einen Primärschlüssel besitzt:
Nach der Definition einer Relation gibt es keine doppelten Tupel, die Tupel lassen sich
daher eindeutig identifizieren. Die für diese Identifikation notwendigen Attribute bilden
den Primärschlüssel. Este atributo es perfecto o incluso más. Im ungünstigsten Fall kann
sich der Primärschlüssel über alle Attribute erstrecken. Folglich existiert in jeder
(korrekten) Relation ein Primärschlüssel.
Es ist allerdings nicht immer einfach, diesen Primärschlüssel zu identifizieren.
Betrachten wir dazu als Beispiel die Tabelle der chemischen Elemente (Tab.2.4). Beim
näheren Hinsehen werden wir gleich drei mögliche Primärschlüssel entdecken. Sowohl
die Protonenanzahl als auch der Name und ebenso das Symbol des chemischen Elements
identifizieren jedes Tupel eindeutig. Alle drei Attribute kommen daher als Primärschlüssel
in Betracht. Las bisagras del atomizador son un candidato unzuverlässiger. Bei
entsprechend vielen Nachkommastellen sind die Atomgewichte der bisher bekannten
Elemente alle eindeutig. Ob dies in Zukunft für neu entdeckte Elemente auch zutreffen
wird, kann nicht garantiert werden. Wir nehmen also jetzt und in Zukunft besser Abstand
von Mengen- und Größenangaben im Zusammenhang mit Primärschlüsseln!
Es ist durchaus üblich, dass Relationen mehrere mögliche Primärschlüssel besitzen,
wie etwa in unserer Tabelle der chemischen Elemente. Wir führen deshalb folgende
Begriffe ein:

Pestaña. 2.4Tabla de elementos químicos

Protones Atomgewicht Nombre Símbolo


1 1,0079 Wasserstoff h
2 4,0026 Helio Él
3 6.941 Litio li
… … … …
32 2 El modelo de relación

IDefinición: SuperschlüsselEin eventuell aus mehreren einzelnen Attributen zusammen


gesetztes Attribut heißtSuperschlüssel , falls es eindeutig jedes Tupel identifiziert.

IDefinición: SchlüsselkandidatEin eventuell aus mehreren einzelnen Attributen


zusammengesetztes Attribut heißtCandidato a Schlüssel , cae es

- ein Superschlüssel ist und


- minimalista, d. h. beim Weglassen eines einzelnen Attributs eines zusammengesetzten
Attributs die Eindeutigkeit verloren geht.

IDefinición: Primärschlüssel, alternativo SchlüsselBesitzt una relación más


Schlüsselkandidaten, so wird davon einer alsPrimärschlüssel ausgewählt; todos los demás
heißenSchlüssel alternativo .

Die Minimalität wird gefordert, um Schlüssel zu vermeiden, die unnötigerweise aus zu vielen
Attributen zusammengesetzt sind. Dies würde Abfragen komplizieren, ohne dass dadurch an
other Stelle ein Vorteil erkennbar wäre. Ein Primärschlüssel ist gerade so groß, dass er die
Eindeutigkeit der Tupel garantiert. Das Hinzufügen weiterer Attribute zum Primärschlüssel
würde also die Minimalität verletzen und ist daher nicht erlaubt.
Die Überprüfung der Minimalität ist nur bei zusammengesetzten Attributen
erforderlich. Un atributo específico es mínimo. Es gilt daher trivialerweise immer: Ein
Superschlüssel, der aus nur einem Attribut besteht, ist ein Schlüsselkandidat.
Die Tabelle der chemischen Elemente (Tab.2.4) Enthält zahlreiche Superschlüssel,
insbesondere sind alle Kombinationen aus 2, 3 and 4 Attributen Superschlüssel. Es existieren
aber nur die drei bereits erwähnten Schlüsselkandidaten:Protones,NombreySímbolo. Wir
empfehlen nachdrücklich, die Anzahl der Protonen als Primärschlüssel und den Namen und das
Symbol als Alternative Schlüssel zu wählen. Zwar ist der Primärschlüssel grundsätzlich aus den
möglichen Kandidaten free wählbar, doch ein schlecht ausgesuchter Primärschlüssel kann sich
später auf die Handhabung der Datenbank auswirken negativ auswirken. Wir sollten immer
den Schlüsselkandidaten como Primärschlüssel wählen, der auch in der täglichen Praxis as
Identifikator dient.
In der Chemie wird beispielsweise un Element durch seine Protonenzahl identifiziert, Name
and Symbol kamen immerst Wochen oder Monate nach der Entdeckung hinzu. Wird this
Tabelle etwa von un Forschergruppe verwendet, and entdeckt diese Group ein neues Element,
so kann this sofort zusammen mit dem Primärschlüssel eingetragen werden. Schließlich gilt ein
neues Element als solches identifiziert, wenn es eine bisher noch nicht aufgetretene
Protonenzahl aufweist. Über Namen und Symbol wird sich die Forschergruppe vermutlich erst
später den Kopf zerbrechen. Wer merken uns, dass wir den eindeutigen Identifikator der realen
Welt als Primärschlüssel in the Welt der Datenbanken übernehmen. Wir liegen damit immer
richtig.
En zahlreichen Relationen besteht der Primärschlüssel aus mehr als einem Attribut.
Betrachten wir nur die RelaciónVerkaeuferProductotambién Tab.2.1. Ein einzelnes Attribut legt
2.3 Primärschlüssel 33

Dort die Tupel nicht eindeutig fest. Es sei dem Leser als Übung empfohlen, den Primärschlüssel
dieser Relation zu bestimmen (siehe hierzu auch die Übungsaufgaben am Ende des Kapitels in
Abschn.2.7). Ein weiteres Beispiel für zusammengesetzte Primärschlüssel liefert die Relation
Lagerbestandtambién Tab.2.5.
En la relaciónLagerbestandSind alle einzelnen Produkte zusammen mit ihrem Bestand und
dem Verkaufspreis aufgeführt. Jedes Produkt wird dabei durch seinen Namen und durch eine
fortlaufende Typnummer identifiziert. Heer besteht der Primärschlüssel aus den beiden
AttributenNombre del productoyTipo de producto:

Primärschlüssel = ( Nombre del producto, Tipo de producto )

Wir beachten, dass der TypT06sowohl bei Staubsaugern als auch bei Küchenherden auftritt.
Durch den Produkttyp allein sind hier also die Tupel nicht eindeutig identifiziert. In obiger
Relation wäre es natürlich möglich, ein AttributNúmero de productohinzuzufügen, das alle
Produkte eindeutig durchnummeriert. Als Primärschlüssel könnte dann diese Produktnummer
gewählt werden. Der Vorteil wäre ein nicht zusammengesetzter Primärschlüssel, der Nachteil
eine erhöhte Redundanz wegen eines zwingend erforderlichen zusätzlichen Attributs. Letztlich
ist dies eine Designfrage. Im vorliegenden Fall würde das zusätzliche AttributNúmero de
productoaber kaum erkennbare Vorteile Bringen.
Vollziehen wir die Ermittlung des Primärschlüssels der RelationLagerbestanden la pestaña.
2.5im Detalle después. Jedes einzelne Attribut für sich enthält no eindeutige Werte. Der
Primärschlüssel muss also aus mindestens dos Attributen bestehen. Die beiden atributo
Nombre del productoyTipo de productozusammen gewährleisten die erforderliche
Eindeutigkeit. Bestands- oder Preisangaben führen in der Regel zu keiner eindeutigen
Identifikation, da deren Inhalte zeitlichen Änderungen unterliegen. Insbesondere sind hier
gleiche Werte bei mehreren Tupel jederzeit zulässig.Nombre del productoyTipo de producto
bilden zusammen den einzigen Schlüsselkandidaten. Denn das Entfernen eines der beiden
Attribute verletzt die Eindeutigkeit, ein Hinzufügen eines weiteren Attributs erzeugt zwar
weitere Superschlüssel, allerdings ist dann die Minimalität verletzt. Somit ist der
Primärschlüssel festgelegt, este Schlüssel alternativo no existe.
Schlüsselkandidaten zeichnen sich dadurch aus, dass Abfragen mit diesen Schlüsseln
automatisch eindeutige Ergebnisse liefern. Además, esta garantía no garantiza esta
eindeutigkeit. Betrachten wir als Beispiel zu Tab.2.5morir abfragio:

Pestaña. 2.5RelaciónLagerbestandmit zusammengesetztem Schlüssel

Nombre del producto Tipo de producto Mejor y Precio


Staubsauger T06 25 498
Staubsauger T17 17 219
... ... ... ...

pastor de küchen T04 10 1598


pastor de küchen T06 7 1998
- Primärschlüssel -
34 2 El modelo de relación

SELECCIONAR Nombre del producto, Precio


DE Lagerbestand
DÓNDE Nombre del producto = ’Staubsauger’ AND Produkttyp = ’T06’;

Wir haben hier gezielt nach dem Primärschlüssel ausgewählt. Als Ergebnis erhalten wir
maximal eine Zeile: Existiert das Produkt mit diesem Produkttyp, so wird dieses zusammen mit
dem Preis ausgegeben. Existiert es nicht, so bleibt die Ausgabe leer. Wir wollen dieses Beispiel
ein wenig abändern:

SELECCIONAR Nombre del producto, Precio


DE Lagerbestand
DÓNDE Nombre del producto = 'Küchenherd';

Jetzt werden alle Küchenherde zusammen mit den Preisen aufgelistet. Da dem
Datenbankprogrammnicht bekannt ist, wie viele Küchenherderzeit in der Relation
vorhanden sind, müssen die Abfrageergebnisse entweder in einem hinreichend großen
Feld zwischengespeichert oder in einer Schleife zeilenweise gelesen und bearbeitet
werden. Wir sehen, dass sich die Programmiertechnik erheblich unterscheidet, je
nachdem ob wir Werte von Schlüsselkandidaten abfragen oder nicht. Wir verweisen
diesbezüglich auf die Datenbankprogrammierung in Kap.6.
Wir empfehlen dringend, Schlüsselkandidaten und insbesondere Primärschlüssel aus
möglichst wenigen Attributen zusammenzusetzen. Besonders erfreulich ist es, wenn
Primärschlüssel aus nur einem einzigen Attribut bestehen. Doch zwingend notwendig ist dies
nicht! Relationen mit zusammengesetzten Primärschlüsseln können durchaus hochwertig sein,
wie wir in diesem und den folgenden Kapiteln noch sehen werden.

2.4 Integridades relacionales

Bereits die Definition von Relationen zwingt uns, bestimmte Bedingungen beim Erzeugen
von Relationen einzuhalten, insbesondere die Eindeutigkeit der Tupel und die Atomarität
der Attribute. Para tener una buena gestión de mano de obra y una perfecta coherencia e
integridad de un banco de datos seguro, es necesario que se detengan sus reglas. En este
Abschnitt lernen wir dos enormes wichtige Regeln kennen. Esto es para la integridad de
un banco de datos de entscheidender Bedeutung. Wir haben bereits in Abschn.1.2darauf
bisagras, dass sich dieintegridad mit der korrekten Speicherung von Daten beschäftigt.
Wir unterscheiden im Wesentlichen vier Arten der Integrität:

- Integración física
- Ablaufintegrität
- Zugriffsberechtigung
- Integración semántica
2.4 Integridades relacionales 35

Moririntegridad físicaBeschäftigt sich mit dem physischen Ablegen von Daten auf uninem
Speichermedium, etwa un Festplatte, un Solid State Disk (SSD) o un DVD. Die physische
Integrität beinhaltet auch die Vollständigkeit der Zugriffspfade und der physischen
Speicherstrukturen. Esta integridad puede ser el programador del banco de datosnoche abejas
influidas. Dafür sind die Datenbank, das darunterliegende Betriebssystem und die Hardware
verantwortlich. Der Datenbank-Betreiber kann allerdings mit dem Einkauf und der Auswahl
einer Datenbank, eines Betriebssystems und des zugrundeliegenden Rechner-Servers zur
Qualität der physischen Integrität entscheidend beitragen.
debajoAblaufintegritätverstehen wir die Korrektheit der ablaufenden Programme.
Beispielsweise sollen alle Schleifen korrekt enden, und im Mehrbenutzerbetrieb
überschreiben die Anwender Daten nicht gegenseitig. Für die Ablaufintegrität zeichnen
der Anwendungsprogrammierer und der Datenbankdesigner verantwortlich. El banco de
datos puede ser el programador que realice modificaciones durante el tiempo de trabajo.
debajoZugriffsberichtigungverstehen wir die korrekte Vergabe und Administration der
Zugriffsrechte. Dies ist im Wesentlichen die Aufgabe des Datenbank-Administrators.

Integración semánticaist die Übereinstimmung der gespeicherten Informationen mit der


Wirklichkeit. La integridad semántica está dentro de un problema, da viele Eingaben händisch
erfolgen. Der Rechner kann von sich aus aber nur schwer entscheiden, ob menschliche
Eingaben den Daten der realen Welt entsprechen oder ob Tipp- und Eingabefehler vorliegen.

La integridad semántica es una herausforderung, tanto para el programador de cambios


como para el administrador del banco de datos y el administrador del banco de datos. Der
Datenbankhersteller bietet komfortable Bildschirmmasken und Trigger (Prozeduren, die bei
bestimmten auftretenden Ereignissen ablaufen) standardmäßig an. El Datenbank-
Administrator passt die erlaubten Eingaben exakt auf die Anforderungen an, und der
Anwendungsprogrammierer wird die angebotenen Werkzeuge und Schnittstellen intensiv
nutzen. Als Beispiel betrachten wir ein Lager, in das gerade 12 Kühlschränke neu
aufgenommen werden. Bei der Aufnahme dieser Daten in den Rechner könnte aus Versehen
statt 12 die Zahl 112 eingetragen werden. Wird dieser Fehler übersehen, ist die Integrität der
Datenbank verletzt. Sollte es aber aus Lagerkapazitätsgründen gar nicht möglich sein, mehr als
100 Kühlschränke im Lager zu stapeln, sollte ein gutes Eingabeprogramm alle Eingaben größer
als 100 von vornherein mit einer Fehlermeldung abweisen.
Die Überprüfung der Eingabe auf Korrektheit bedeutet also aus Sicht einer Relationsalen
Datenbank:

- Die GebieteDiSind so weit wie möglich einzuschränken. Nur real existierende Werte werden
vorgegeben.
- Es dorado para todos los atributosvJi:vJi2Dipara todos los gültigeniyj. Nur diese real
existierenden Werte dürfen auch verwendet werden.
- Die AttributswertevJiwerden automatisch vergeben, soweit dies möglich ist, etwa bei der
Vergabe der nächsten Auftragsnummer.
36 2 El modelo de relación

In unserem obigen Beispiel sollte das GebietDKühlschrankanzahl¡Nicht alle möglichen


Ganzzahlen umfassen, sondern nur die Werte entre 0 y 100! Wenn es die Datenbank
erlaubt, sollte als Datentyp nicht der viel zu umfassende TypEn tgewählt werden, sondern
die Aufzählung0..100, siehe auch Abschn.5.6. Esta descripción de la definición propia de
maßgeschneiderter Gebiete ist notwendig, um den Anwender effektiv zu unterstützen
und um Fehler zu vermeiden!
Die im Folgenden vorgestellten dos Integritätsregeln tragen wesentlich zur Ablaufintegrität
bei. Eine Verletzung auch nur einer dieser beiden Regeln kann früher oder später zu einer
fehlerhaften Datenhaltung führen. Die beiden Regeln werden daher in related Datenbanken
zwingend vorgeschrieben. Comenzaremos con el primer registro de integridad.

2.4.1 Registro de integridad de entidades

Die erste Integritätsregel o Entitäts-Integritätsregel befasst sich mit dem Aufbau des
Primärschlüssels. Wie wir bereits wissen, identifiziert der Primärschlüssel jedes Tupel
eindeutig. Dies heißt umgekehrt, dass jedes Tupel einen Primärschlüssel besitzen muss –
dies impliziert, dass die Primärschlüsselattribute vernünftige Werte enthalten. Sobre el
Begriffvernünftiglässt sich streiten, aber ein Attribut einfach leer zu lassen, ist sicherlich
nicht vernünftig:

I Regla: Erste Integritätsregel (Entitäts-Integritätsregel)Keine Komponente des


Primärschlüssels einer Basisrelation darfnoches enthalten.

Die erste Integritätsregel bezieht sich ausschließlich auf Basisrelationen. Estas relaciones
sind die einzigen real existierenden und dauerhaft gespeicherten Elemente einer Datenbank.
Dass diese Regel etwa bei Abfrageergebnissen verletzt sein darf, erweitert nur die
Abfragemöglichkeiten, ohne dadurch die Datenbanken in irgendeiner Weise negativ zu
beeinflussen. Es ist völlig legitim, in derVerkaeuferProducto-Relación de Befehl

SELECCIONAR ’ ’ Como Verknr, Nombre del producto


DE VerkaeuferProdukt ;

einzugeben. Die Verkäufernummer und der Produktname sind der Primärschlüssel dieser
Relation. Wenn wir, wie in diesem Beispiel, in der SpalteVerknraber nur Leerzeichen ausgeben
(zur genauen Sintaxis siehe Abschn.4.1.3), so verlieren wir die Eindeutigkeit der ausgegebenen
Tupel. Wir verletzen also nicht nur die erste Integritätsregel, es liegt nicht einmal eine korrekte
Relation vor! Bei Abfragen soll uns dies aber nicht weiter stören.
El nombreEntitäts-Integritätsregelbezieht sich darauf, dass eine Entität (ein Tupel, ein Ding, ein
Objekt) existe oder auch nicht. Esta existencia está directamente relacionada con el Primärschlüssel
gekoppelt. Es macht keinen Sinn, ein Tupel einzutragen, und den Primärschlüssel erst später
anzugeben. Primärschlüssel und Entität bilden mit dieser Regel eine
2.4 Integridades relacionales 37

Untrennbare Einheit. Es existiert ein Objekt (eine Entität), dann ist es identifizierbar (durch den
Primärschlüssel), oder es existiert nicht!
Weiter sollte nicht übersehen werden, dass die Entitäts-Integritätsregel nur für den
Primärschlüssel und nicht für Alternativschlüssel gilt. Einträge in Alternativschlüsseln dürfen
folglich leer bleiben. Der Anwender hat sich ja für einen other Schlüsselkandidaten als
eindeutigen Identifikator entschieden.
Wichtig ist, dass bei zusammengesetzten Primärschlüsseln kein einziges Teilattribut leer
bleiben darf. En una relación más seguraLagerbestandtambién Tab.2.5mussen zu jedem Tupel
sowohl der Produktname als auch der Produkttyp angegeben werden. Denn erst die Angabe
beider Werte sichert die eindeutige Identifizierung. Alle heutigen Datenbanksysteme weisen
Neueinträge oder Änderungen ab, wenn auch nur Teile eines Primärschlüssels leer bleiben. Bei
Neueinträgen empfiehlt es sich sowieso, Primärschlüsselwerte von der Datenbank generieren
automatisch zu lassen.
Wahrscheinlich haben Sie sich beim Lesen dieses Abschnitts schon gefragt, was eine
Datenbank unter dem Begriffmirada lascivaverstehen könnte. Ein Mensch könnte mit einer
Zeichenkette der Länge 0 als leerer Eintrag gut leben, oder mit einer Zeichenkette, die nur
Leerzeichen enthält, so wie im letzten Beispiel. Aus technischen Gründen tauchen aber solche
Zeichenketten gelegentlich auf, ohne dass diese dann als leerer Eintrag interpretiert werden
sollen. Um solche Probleme von vorneherein zu vermeiden, werden eigene „leere“ Werte
eingeführt. En SQL gibt es dafür den WertNULO. Dieser WertNulounterscheidet sich
grundsätzlich von allen anderen möglichen Einträgen. Ein Eintrag ist in der Sprache SQL genau
dann leer, wenn er den WertNuloenthält. Werden in den Kap.4y5este texto en blancoNulonoch
eingehend trachten. Unseren letzten Select-Befehl sollten wir aber noch anpassen:

SELECCIONE NULL como Verknr, nombre del producto


DE VerkaeuferProdukt ;

Anwender sind Menschen, und Menschen machen bekanntlich Fehler. Ein Fehler könnte
sein, dass in einem Primärschlüssel doch einmal der WertNuloeingetragen wird. En las
relaciones con Datenbanken darf dies aber nie passieren. Unsere Datenbanken müssen daher
so implementiert sein, dass der Versuch des Eintrags von Nullwerten im Primärschlüssel
grundsätzlich mit einer Fehlermeldung abgewiesen wird. Erfreulicherweise ist in allen
modernen Datenbanken dieser Sicherheitsmechanismus eingebaut. Die erste Integritätsregel
ist in diesen Datenbanken daher immer erfüllt. Voraussetzung ist natürlich, dass wir der
Datenbank auch alle Primärschlüssel mitgeteilt haben.

2.4.2 Registro de integración de referencia

Die erste Integritätsregel befasst sich mit dem Primärschlüssel jeder einzelnen Relation, die
zweite Regel beschäftigt sich mit dem korrekten Miteinander der Relationen in einer
38 2 El modelo de relación

Banco de datos. La definición de los bancos de datos lehrt uns, dass Datenbanken
zusammengehörige Daten verwalten. Todas las fechas en las relaciones. Estas relaciones
deben realizarse en función de la relación. In Relationsalen Datenbanken kommt dazu ein
weiterer Schlüssel ins Spiel, der Fremdschlüssel. Fremdschlüssel sind der Kit, der die bisher
einzelnen Relationen zu einem gemeinsamen Datenbestand zusammenfügt.

Idefinición: FremdschlüsselEin (möglicherweise zusammengesetztes) Attribut einer


Basisrelation heißtFremdschlüssel , caídas

- das ganze Atributo entweder nichts (Nulo) oder einen definierten Inhalt enthält,
- eine Basisrelation mit einem Primärschlüssel existiert, so dass jeder definierte Wert des
Fremdschlüssels einem Wert jenes Primärschlüssels entspricht.

La primera parte de la definición se basa en todos los atributos. Ein


zusammengesetztes Attribut ist un Attribut, das aus mehr als einem einzelnen Attribut
aufgebaut ist. Beispielsweise bilden in der RelationLagerbestandtambién Tab.2.5der
Produktname und der Produkttyp als zusammengesetztes Attribut den Primärschlüssel.
Esta primera parte de la definición es así, dass entweder alle Einzelattribute des
Fremdschlüssels einen sinnvollen Inhalt besitzen, oder alle Einzelattribute leer bleiben,
also den WertNulobesitzen. Dass nur einzelne Teilattribute einen Null-Wert besitzen, ist
für Fremdschlüssel demnach unzulässig.
La segunda parte de la definición es enorme. Er besagt mit other Worten, dass ein
nichtleerer Fremdschlüssel nur Werte enthält, die im Primärschlüssel derjenigen Relation
vorkommen, auf den sich dieser Fremdschlüssel bezieht. Dies impliziert sofort, dass ein
Fremdschlüssel aus genauso vielen Attributen mit jeweils den gleichen
Gebietsdefinitionen wie der dazugehörige Primärschlüssel bestehen muss.
Ein Fremdschlüssel bezieht sich also immer auf einen Primärschlüssel einer Basisrelation
der Datenbank und ist folglich identisch aufgebaut. Besteht der Primärschlüssel nur aus einer
Ganzzahl, so muss auch der sich darauf beziehende Fremdschlüssel como Ganzzahl definiert
sein. Ist ein Primärschlüssel aus drei Einzelattributen zusammengesetzt, so muss dies auch der
darauf verweisende Fremdschlüssel sein! Ein Fremdschlüssel enthält entweder in all seinen
Teilattributen einen Null-Wert, oder er verweist auf eine bereits existierende Entität und enthält
damit eine exakte Kopie des Primärschlüsselwertes dieser Entität.

Dass ein zusammengesetzter Fremdschlüssel nicht in einzelnen Attributen Null-Werte


besitzen darf, wird jetzt klar: Ein nicht komplett leerer Fremdschlüssel muss auf einen
existierenden Primärschlüsselwert verweisen, und in Primärschlüsseln gibt es keine Nullwerte!

Wir wollen Fremdschlüssel an einem Beispiel aufzeigen. Wir betrachten dazu die drei
RelationenPersonal,KundeyAuftragtambién Tab.2.6,2.7y2.8, die den entsprechenden
Relationen der BeispieldatenbankBicicletaentsprechen. Einzelne hier nicht wichtige Atributo
2.4 Integridades relacionales 39

Pestaña. 2.6RelaciónPersonal(Auszug aus Tab.10.3)

persona Nombre Ort Vorgesetzt Gehalt


1 María Forster Ratisbona NULO 4800.00
2 Anna Kraus Ratisbona 1 2300.00
3 Rango Úrsula Francfort 6 2700.00
4 Heinz Rolle Núremberg 1 3300.00
5 Johanna Koster Núremberg 1 2100.00
6 Marianne Lambert Landshut NULO 4100.00
7 Thomas Noster Ratisbona 6 2500.00
8 Renate Wolters Augsburgo 1 3300.00
9 Ernst Pach Stuttgart 6 800.00

Pestaña. 2.7 RelaciónKunde(Auszug aus Tab.10.2)

nº Nombre calle Por favor Ort


1 Tienda Fahrrad Obere Regenstr. 4 93059 Ratisbona
2 Centro Staller de Zweirad Calle Kirschweg 20 44276 Dortmund
3 Maier Ingrid Universitätsstr. 33 93055 Ratisbona
4 Rafa - Seger KG Liebigstr. 10 10247 Berlina
5 Motociclista Ecke Lessingstr. 37 22087 Hamburgo
6 Fahrräder Hammerl Schindlerplatz 7 81739 Múnich

Pestaña. 2.8 RelaciónAuftrag(entspricht Tab.10.5)

Auftrnr Dato Kundnr persona


1 04.01.2013 1 2
2 06.01.2013 3 5
3 07.01.2013 4 2
4 18.01.2013 6 5
5 03.02.2013 1 2

wurden weggelassen. Este banco de datosBicicletawird en Kap.10ausführlich vorgestellt und


begleitet uns im gesamten Buch.
En las relacionesPersonal,KundeyAuftragbilden joyas mueren Atributopersona, nºy
AuftrNrden Primärschlüssel. Estas tres relaciones sind über Fremdschlüssel in der
RelationAuftragmiteinander verbunden. En esta relaciónAuftragwerden die
eingegangenen Aufträge notiert. Zusammen mit dem Auftragsdatum werden dort die
Personalnummer des Verkäufers und die Kundennummer des Kunden vermerkt.
Möchten wir etwa zum Auftrag mit der Nummer 2 den Namen des Verkäufers wissen, so
finden wir in dieser Relation im Attributpersonaden Eintrag 5 und in der RelationPersonal
bajo el número personal 5 del nombreJohanna Koster. Analoges gilt für den Namen des
Kunden, in unserem Falle wäre dies bei Auftrag 2 der KundeMaier Ingrid.
El atributopersonaen la relaciónAuftragist ein Fremdschlüssel und bezieht sich auf den
Primärschlüssel in der RelationPersonal. Gemäß der Definición von Fremdschlüsseln ist es nicht
erlaubt, im Attributpersonala relaciónAuftrageinen Wert einzutragen, der im dazugehörigen
Primärschlüssel der RelationPersonalnicht existiert. Troquel analógico dorado glei-
40 2 El modelo de relación

che Aussage für den FremdschlüsselKundnren la relaciónAuftrag, der sich auf den
Primärschlüsselnºen la relaciónKundebezieht. In unserem Beispiel muss demnach im
Attributpersonala relaciónAuftragein Wert zwischen 1 y 9 stehen, oderNulo. Soy atributo
Kundnrmuss ein Wert ungleichNuloentsprechend zwischen 1 y 6 liegen.
Ein besonders interessantes Beispiel für Fremdschlüssel finden wir noch in der Relation
Personal. Relación de matrizPersonalenthält alle Mitarbeiter der Firma, auch die vorgesetzten
Mitarbeiter. El atributoVorgesetztgibt zu jedem Mitarbeiter seinen Vorgesetzten an und ist
damit ein Fremdschlüssel, der auf den Primärschlüssel der gleichen Relation verweist. El
EintragNulobei Frau Köster und Frau Lambert deutet darauf hin, dass beide Personen keinem
Vorgesetzten zugeordnet sind. Wie wir den otros Einträgen im Attribut Vorgesetztentnehmen
können, sind diese beiden Personen selbst Vorgesetzte der other Mitarbeiter.

Da es für die Konsistenz und Korrektheit einer Datenbank außerordentlich wichtig ist, dass
alle Fremdschlüsselinhalte nur erlaubte Werte enthalten, stellen wir eine dos Integritätsregel
auf:

I Regel: Zweite Integritätsregel (Referenz-Integritätsregel)Un banco de datos


relacional enthältkeinen Fremdschlüsselwert (ungleichNulo), der im
dazugehörigen Primärschlüssel no existe.

Esta regla es eigentlich absolut überflüssig, denn sie ist bereits in derDefinition der
Fremdschlüssel enthalten. Und trotzdem wurde diese Regel aufgestellt. ¡Denn diese Regel ist so
wichtig, dass sie gleich in die Definición der Fremdschlüssel integriert wurde! Auch diese dos
Integritätsregel ist sehreng auszulegen, sie darf wie die erste grundsätzlich nicht verletzt
werden.
Natürlich werden wir einen neuen Auftrag nicht mit der Kundennummer 13 versehen,
zumindest nicht mit Absicht. Aber es wird irgendwann vielleicht doch passieren, dass ungültige
Verweise gesetzt werden. Betrachten wir nur einmal folgendes Beispiel:
Nehmen wir an, Frau Köster mit der Personalnummer 5 verlässt die Firma, und aus
datenschutzrechtlichen Gründen soll der Eintrag in der RelationPersonalgelöscht werden. Ein
Löschen dieses Tupel würde jedoch die Referenz-Integritätsregel verletzen; denn en la relación
AuftragWird auf die Personalnummer 5 verwiesen, eine Nummer, die nach dem Löschen von
Frau Köster gar nicht mehr existieren würde. Ein Löschen muere Tupel in der TabellePersonal
erfordert deshalb zunächst zwingend Anpassungen in der Relation Auftrag. Bei genauer
Betrachtung gibt es nur dos we sinnvolle Möglichkeiten: Entweder wir ersetzen in der Relation
Auftragden entsprechenden Verweis durchNulo,oder wir löschen jedes Tupel der Relation
Auftrag, el número personal 5 es total.
Este Beispiel zeigt eindrucksvoll, wie leicht die dos Integritätsregel verletzt werden
kann: Wir löschen in einer großen Datenbank ganz unbedarft eine Zeile einer Relation,
und schon kann nichtsahnend ein Fremdschlüssel auf einen nicht mehr existierenden
Wert verweisen. Daraus folgt, dass wir sowohl beim Löschen eines Tupel als auch beim
Ändern des Primärschlüssels eines Tupel immer zunächst nachsehen müssen, ob nicht
2.4 Integridades relacionales 41

Fremdschlüssel auf this Tupel verweisen. Wenn ja, dann existieren genau drei
Reaktionsmöglichkeiten:

- Wir führen das Löschen (bzw. Ändern) nicht aus


- Wir löschen zunächst alle Tupel (bzw. ändern alle Einträge), die auf unser Tupel
verweisen
- Wir setzen zunächst alle entsprechenden Fremdschlüsselwerte auf den WertNulo

Antes de que Fall tun wir nichts, die Integritätsregel bleibt somit trivialerweise erfüllt. In den
den other beiden Fällen werden alle Fremdschlüsselverweise gelöscht, bzw. so abgeändert
oder auf den WertNulogesetzt, dass nach dem Löschen bzw. Ändern eines Tupel die dos
Integritätsregel gültig bleibt. In der Praxis verliert der Anwender schon bei hundert Einträgen
den Überblick, bei tausenden, ja Millionen von Einträgen ist er hoffnungslos überfordert. Wie
schon bei der dersten Regel benötigen wir wieder die Hilfe der Datenbank.

1992 wurden mit der Norm SQL2 neue Sprachkonstrukte eingeführt, um die Probleme
des Löschens oder Änderns von Primärschlüsselwerten in den Griff zu bekommen. Esta
norma SQL incluye, por ejemplo, un Fremdschlüssel que requiere tres tipos de
características propias:

AL ELIMINAR NO HAY ACCIÓN


AL ELIMINAR CASCADA
AL ELIMINAR ESTABLECER NULO

Eine dieser drei Eigenschaften ist beim Erzeugen eines Fremdschlüssels (siehe Abschn.
5.1) immer anzugeben oder wird standardmäßig gesetzt. Verweist beim Löschen eines
Tupel ein Fremdschlüssel auf dieses Tupel, so wird bei gesetzter erster Eigenschaft die
Datenbank das Löschen dieses Tupel nicht ausführen (Ninguna acción). Gilt die zweite
Eigenschaft, so wird die Zeile mit dem Fremdschlüssel gleich automatisch mit gelöscht.
Und mit der dritten Eigenschaft wird der entsprechende Fremdschlüsseleintrag auf den
WertNuloGesetzt.
Ganz analog gibt es drei Eigenschaften, werden ein Primärschlüsselwert geändert werden
soll:

EN ACTUALIZACIÓN NO HAY ACCIÓN EN

ACTUALIZACIÓN EN CASCADA

EN ACTUALIZACIÓN ESTABLECER NULO

Sollten mehrere Fremdschlüssel auf ein zu änderndes oder löschendes Tupel verweisen, so
wird das Ändern oder Löschen schon dann zurückgewiesen, wenn nur einer dieser
Fremdschlüssel die Manipulation mitNinguna acciónverbietet. In allen anderen Fällen werden
die entsprechenden Zeilen gelöscht, bzw. Fremdschlüsselwerte angepasst oder auf den Wert
NuloGesetzt.
42 2 El modelo de relación

Sollen mit einem einzigen SQL-Befehl gleich mehrere Zeilen gelöscht werden, so wird Zeile
für Zeile einzeln geprüft. Gibt es für mindestens eine Zeile eine Zurückweisung (Ninguna acción
), por lo que no se utilizará SQL-Befehl. Schließlich arbeitet eine Datenbank immer im
Transaktionsmodus: entweder der gesamte Befehl wird ausgeführt oder gar nichts!

Ein besonders interessanter Fall ist das kaskadierende Löschen bei der EigenschaftAl
eliminar cascada. Das Kaskadieren tritt auf, wenn auf die Relation mit unserem Fremdschlüssel
wiederum Fremdschlüssel verweisen. Auch auf diese Fremdschlüssel können weitere
Fremdschlüssel zeigen, auf diese wieder und so weiter. In diesem Fall kann das Löschen eines
einzigen Tupel zum kaskadierenden Löschen zahlreicher Tupel führen. Ein solches
fortgesetztes Löschen ist wegen der Referenz-Integritätsregel natürlich nur dann erlaubt, wenn
keiner der geschachtelten Fremdschlüssel das Löschen verbietet. Dieses Kaskadieren wird
beendet, wenn kein weiterer Verweis existiert, oder der Verweis wegen Al eliminar, establecer
nuloen el WertNuloGesetzt wird. Existiert in dieser kaskadierenden Kette auch nur ein einziges
Glied, das das Löschen verbietet, so wird die gesamte Löschaktion zurückgesetzt.

Dies wollen wir an einem Beispiel nachvollziehen und betrachten dazu wieder die
Relationen Tab.2.6y2.8. Nehmen wir in diesen Relationen an, dass für alle Fremdschlüssel
die EigenschaftAl eliminar cascadagelte. Das Entfernen von Frau Forster mit der
Personalnummer 1 hätte dann auch das Löschen aller Mitarbeiter zur Folge, die im Feld
Vorgesetztden Wert 1 besitzen, unter anderem Frau Köster (persona5) y la señora Kraus (
persona2). Dies wiederum würde kaskadierend das Löschen aller Tupel der Relation
Auftragbeirken. Mit dem Löschen der Zeile mit der Personalnummer 1 würden in der
RelationPersonalnur die vier Mitarbeiter stehen bleiben, die im AttributVorgesetzteinen
Wert ungleich 1 besitzen. Más cosas en la relaciónAuftragalle Zeilen gelöscht! Dies kann
en Abb.2.2nachvollzogen werden.
Hätten wir bisagragen in der RelationAuftragla sociedad propiaAl eliminar ninguna acciónen
Fremdschlüsselpersonagesetzt, so würde das Löschen von Frau Köster und Frau Kraus

Personal:
persona Nombre Ort Vorgesetzt Gehalt
3 Rango Úrsula Francfort 6 2700.00
6 Marianne Lambert Landshut NULO 4100.00
7 Thomas Noster Ratisbona 6 2500.00
9 Ernst Pach Stuttgart 6 800.00

A continuación:

Datum auftrnr Kundnr Persnr

Tejido. 2.2Función de eliminación de cascada


2.5 Álgebra relacional 43

und damit letztlich auch das Löschen von Frau Forster abgewiesen werden. ¡Wir merken uns,
dass ein kaskadierendes Löschen immer komplett auszuführen ist! Stößt dieses Löschen jedoch
in mindestens einem kaskadierenden Pfad auf Widerstand, so wird dieser Löschvorgang
komplett zurückgenommen.
Ist ein Fremdschlüssel gleichzeitig Primärschlüssel oder Teil eines Primärschlüssels, so darf
die EigenschaftAl eliminar, establecer nulonicht gesetzt werden. Schließlich darf ein
Primärschlüssel grundsätzlich keine Nullwerte annehmen. In einigen other Fällen sind ebenfalls
Nullwerte nicht erwünscht. Nullwerte in Attributen können wir in SQL durch die zusätzliche
Angabe der Eigenschaft

NO NULO

unterbinden (siehe Abschn.5.1). In diesen Fällen ist natürlich die FremdschlüsseligenschaftAl


eliminar, establecer nuloebenfalls nicht erlaubt.
Zur Vertiefung der beiden Integritätsregeln sei als Übung auf die Beispieldatenbank Bicicletaen
Kap.10verwiesen. Todas las relaciones entre estos bancos de datos se encuentran sobre la base de
datos de Fremdschlüssel. Es wird empfohlen, alle Fremdschlüssel und Primärschlüssel der Datenbank
Bicicletaselbst zu bestimmen.
Die letzten beiden Abschnitte haben uns the enorme Wichtigkeit der Primär- und
Fremdschlüssel in einer Relationsalen Datenbank vor Augen geführt. ¡Jeder
Datenbankprogrammierer sollte alle Primär- und Fremdschlüssel zusammen mit ihren
Eigenschaften kennen! Jeder Datenbankdesigner debe este Schlüssel beim Entwurf einer
Datenbank geeignet setzen. La calidad de un banco de datos es enorme según la
definición óptima de este Schlüssel ab. Es ist daher nicht verwunderlich, dass wir uns
beim Datenbankdesign in Kap.3weiter intensiv mit Primär- und Fremdschlüsseln
beschäftigen werden.

2.5 Álgebra relacional

In den bisherigen Abschnitten estos Kapitels hanben wir uns auf den statischen Aufbau einer
relacionaalen Datenbank konzentriert. Doch früher oder später werden die Relationen mit
Daten gefüllt, and diese Daten unterliegen ständigen manipulations.
Bei allen Zugriffen auf eine Relation, ob lesend oder schreibend, wird in der Datenbank
zunächst die gewünschte Stelle gesucht. Wurde die angefragte Position gefunden, so wird der
darin befindliche Inhalt lesend abgegriffen. Gegebenenfalls sigue anschließend noch ein
Schreibzugriff. Dieses Suchen und Lesen sollte mit einem möglichst geringen sprachlichen
Aufwand erfolgen. Die dazu benötigte Zugriffssprache sollte syntaktisch festgelegt und gut
verständlich sein. SQL (lenguaje de consulta estructurado) es el lenguaje de consulta más
rápido y bekannteste. Der Informatiker E. F. Codd baute 1970 und 1972 seine ursprüngliche
Sprachdefinition aus acht Operadores auf und erstellte auf diesen Operadores eine
vollständige Syntax, eineálgebra relacional , siehe Codd (1970,1972). Er zeigte auch
44 2 El modelo de relación

die Vollständigkeit este álgebra. Damit bewies er, dass alle gewünschten Zugriffe auf
Relationen mit Hilfe dieser Algebra auf Basis der acht Operatoren erfolgreich
durchgeführt werden können.
Wir verwenden die relacionale Algebra im Weiteren nur punktuell. Schließlich können
wir uns auf die moderne und mächtige Zugriffssprache SQL verlassen. Doch zum
besseren Verständnis von Datenbankzugriffen werden wir ab und an auf the
relacionaalen Operatoren zurückgreifen. Gerade bei den Performance-Untersuchungen
en Kap.7Hay un enorme álgebra relacional que optimiza la selección de valores. Im
Folgenden definieren wir the relacional operatoren y anschließend die darauf aufbauende
Algebra. Para obtener información detallada sobre la fecha (2003), Elmasri y Navathe (
2002) y Kemper y Eickler (2015) verwiesen.

2.5.1 Operadores relacionales

E. F. Codd entwickelte in den 70er Jahren eine nueva Álgebra para bancos de datos relacionales.
Er griff dabei auf die Mengenlehre zurück und betrachtete zunächst Relationen als Mengen mit
den Tupeln als die Elemente dieser Mengen. Estas "Relaciones" -Mengen erweiterte er durch
zusätzliche relacionale Eigenschaften. Es ist daher keine Überraschung, wenn in der
relacionaalen Algebra die tres MengenoperatorenVereinigung[,Schnitt\ ydiferencianorte
auftauchen. Hinzu kommen fünf weitere relaen-spezifische Operadores. Aus rein technischen
Gründen wird als neunter Operator der Umbenennungsoperator hinzugefügt.

Wir benötigen im Folgenden mathematische Kenntnisse zur Algebra und zu Mengen. Wir
wollen deshalb einige dieser mathematischen Begriffe kurz wiederholen:
unoMengeist ein Behälter, in der unterscheidbare Objekte zusammengefasst werden.
Bildlich können wir uns als Behälter einen Sack oder einen Koffer vorstellen, in dem alle
unsere Objekte ablegen. Eine Menge ist ein sehr einfacher Behälter. Es wird nicht gefragt,
ob die Dinge oben oder unten, links oder rechts liegen. Bei einer Menge interessieren wir
uns nur dafür, ob ein Element in der Menge ist oder nicht. In diesem Abschnitt
interessieren wir uns für die MengeRtodas las relaciones. Unsere MengeRenthält also in
seinem Sack alle Relationen, die der Definición aus Abschn.2.2entsprechen.
EinOperadorist eine Vorschrift, durch die Elemente einer vorgegebenen Menge in other
Elemente überführt werden. Unsere insgesamt neun Operatoren basieren auf der MengeRder
Relationen. Estos operadores se encuentran en uno o dos elementos angewendet, en unserem
Falle también en las relaciones. Sie Bearbeiten diese oder dos Relationen und erzeugen ein
neues Element, in unserem Fall wieder eine Relation. Wir unterscheiden zwischen unären und
binären Operadores.
Un operadoropes unOperador binärer, wenn dieser Operadorzwei Elemente der Menge
Bearbeitet. In unserem Fall nimmt der relacionale Operadoroptambién dos relaciones, führt
seine Vorschrift aus und liefert eine neue Relation als Ergebnis zurück. Wir
2.5 Álgebra relacional 45

Schreiben muere siguiendo:


opW.¡RRR! R

Aquí estáRRdas Kreuzprodukt der Mengen und symbolisiert, dass wir dos Relationen
Bearbeiten. Betrachten wir zum Verständnis ein Beispiel: Wir wählen die RelationR1
mit allen Kunden aus Berlin und die RelationR2con la hamburguesa Kunden. Die
Vereinigung [ ist ein binärer Operador und wir erhalten mitR3D [.R1; R2/una nueva relación
R3, die alle Kunden aus Berlin und Hamburg enthält. Wir schreiben statt [.R1; R2/meist R1[R
2, da dies leichter lesbar und anschaulicher ist.

Un operadoropes unoperador unärer, wenn die dazugehörige Vorschriftun Element


der Menge Bearbeitet. In unserem Fall nimmt der relacionale Operadoropalso nur eine
Relation und liefert eine Relation als Ergebnis zurück. Wir schreiben dies jetzt wie folgt:

opW.¡R! R

Ein wichtiger unärer relacionaler Operador ist die Restriction -. Wählen wir wieder als
Beispiel die RelationR1mit den Berliner Kunden. Als Restriktion wählen wir alle Kunden,
die mit dem BuchstabenAcomenzando. Dann erhalten wir eine kleinere Ergebnisrelation
R4D -NombreD0A:::0.R1/mit entsprechend weniger Berliner Kunden.
unoÁlgebraist eine formale Sprache, in der Operatoren mit dazugehörigen Regeln definiert
werden. unoálgebra relacionalist eine Abfragesprache auf Relation, in der relacionale
Operatoren mit entsprechenden Regeln definiert sind. EstoOperadores relacionalesführen
eine oder mehrere Relationen in eine Ergebnisrelation über. Das Ergebnis einer relacionaalen
Operation ist immer eine Relation, somit können wir darauf wieder einen relacionaalen
Operador anwenden. Los operadores relacionales lassen sich daher rápidamente beliebig
kombinieren. Ziel von E. F. Codd war es, operatoren relacionale so zu definieren, dass Anfragen
an eine Datenbank mit Hilfe einer endlichen Kombination dieser Operatoren das gewünschte
Ergebnis zurückliefern.

Pestaña. 2.9Operadores de álgebra relacional

Operador Beispiel
Vereinigung ∪ 1 2

Schnitt ∩ 1 2

diferencia ∖ 1∖2

Kreuzprodukt × 1 2

restricción ()
proyección ()
Verbund ⨝
División 1 2

umbenennung _
46 2 El modelo de relación

Nach diesen mathematischen Vorbemerkungen stellen wir jetzt in den folgenden


Abschnitten alle neun Operatoren vor, die in Tab.2.9zusammengefasst sind. Los tres primeros
operadores saben que se bereits aus der Mengenlehre. Die nächsten fünf Operadores sind
Relationen spezifisch, el nuevo operador dient der Umbenennung von Relationen und
Attributen.

2.5.2 Vereinigung, Schnitt y Differenz

Comenzamos con los tres operadores Vereinigung, Schnitt und Differenz, die wir bereits aus
der Mengenlehre kennen. Es handelt sich hier jeweils um binäre Operadores.

VereinigungAus den beiden RelationenR1yR2wird eine nueva relaciónR3mit R3DR1[R2


erzeugt, die alle Tupel enthält, die in mindestens einer der beiden Relationen
vorkommen. Natürlich werden Tupel, die in beiden Relationen vorkommen, nur
einmal aufgenommen.

SchnittAus den beiden RelationenR1yR2wird eine nueva relaciónR3DR1\R2erzeugt, die


nur die Tupel enthält, die in beiden Relationen vorkommen.

diferenciaAus den beiden RelationenR1yR2wird eine nueva relaciónR3mit R3DR1norte


R2erzeugt, die all die Tupel enthält, die in der RelationR1, nicht aber en relaciónR2
vorkommen.
Die Anwendung dieser drei Mengenoperatoren auf Tabellen magn noch etwas ungewohnt
sein, schließlich sind Tabellen keine Mengen. Doch estos tres operadores se encuentran
también en las tablas genauso wie bei Mengen. Muere soll Abb.2.3ilustrar. Die Inhalte der
Relationen werden vereinigt, es wird der Schnitt gebildet, und es werden die Inhalte
voneinander abgezogen.

Vereinigung Schnitt diferencia

Relaciones

Mengen

Tejido. 2.3Los tres operadores masculinos


2.5 Álgebra relacional 47

Tejido. 2.4Die unären Operadores


restricción proyección
Restricción y Proyección

2.5.3 Proyección y restricción

Los operadores especiales para relaciones (tablas) son para una nueva y adecuada cama de
matrimonio. Comenzaremos con el operador junto a un operador.

restricciónFuera de la relaciónR1wird eine nueva relaciónR2D -cama en ngung.R1/erzeugt, die


nur diejenigen Tupel aus der RelationR1enthält, die der angegebenen Bedingung
genügen. In der Literatur wird die Restriktion auch alsSelección bezeichnet. Daher kommt
auch der griechische BuchstabeSigma(-)para la restricción.

proyecciónFuera de la relaciónR1wird eine nueva relaciónR2D -Auswahl.R1/erzeugt, die alle


Tupel vonR1enthält, eingeschränkt auf die angegebene Auswahl von Attributen.
Estos operadores se encuentran perfectamente conectados. Die Resriktion schränkt eine
Relation auf weniger Zeilen ein, die Projektion auf weniger Spalten, siehe auch Abb.2.4. Um
welche Zeilen bzw. welche Spalten es sich handelt, wird untercamabzw.Auswahl angegeben.

2.5.4 Kreuzprodukt, Verbund und Division

Neben der Umbenennung fehlen noch drei binäre Operadores. Estos tres operadores
Kreuzprodukt, Verbund und Division son para el Anfänger nicht einfach zu verstehen. Wer
kann sich schon auf Anhieb ein Produkt dos Tabellen oder gar die Division einer Tabelle
durch eine andere vorstellen? Empezaremos con el producto.

KreuzproduktAus den beiden RelationenR1yR2wird eine nueva relaciónR3D R1


R2erzeugt, die aus allen Kombinationen der Tupel der beiden Relationen bestehen. Das
Kreuzprodukt wird in der Literatur auch häufig als Kartesisches Produkt bezeichnet.
Das Kreuzprodukt verknüpft das erste Tupel ausR1mit dem ersten Tupel ausR2, dann
mit dem zweiten bis hin zum letzten Tupel ausR2. Estos Verfahren wiederholt sich für
jedes weitere Tupel ausR1. Ist etwa die Anzahl der Zeilen (Kardinalität) vonR1gleich norte1y
muerenR2gleichnorte2, entonces besitzt die RelaciónR3DR1 R2morir cardinalidad
norte1norte2. Ein kleines anschauliches Beispiel finden wir in Abb.2.5. Die Wertea,antes de
Cristoyd repräsentieren vollständige Tupel der RelationR1, yXyyentsprechen den Tupel der
48 2 El modelo de relación

Producto (naturalmente) Verbund División

a X a X b1 c1 a X X
b y a y a1 b1 b2 c2 a y y
C b X a2 b1 b3 c3 a z
d b y a3 b1 b X a
C X a4 b2 a1 b1 c1 b y b
C y a2 b1 c1 C y
d X a3 b1 c1 C z
d y a4 b2 c2 d y

Tejido. 2.5Die Operatoren Produkt, Verbund und Division

RelaciónR2. La relación ErgebnisR3enthält alle Kombinationen zwischena,b,Cyd auf


der einen undXyyen otras páginas. Insgesamt ergeben sich también acht Zeilen.

VerbundAus den beiden RelationenR1yR2wird eine nueva relaciónR3DR1‰R2


erzeugt, die aus allen Kombinationen der Tupel der beiden Relationen besteht, wobei
allerdings nur diejenigen Tupel aufgelistet werden, die in jeweils einem Attribut der beiden
Relationen gleiche Werte besitzen. Este atributo vergleichende no se utilizará einmalmente. Der
Verbund wird tambiénUnirsebezeichnet.
Der Verbund setzt voraus, dass es in den beiden RelationenR1yR2joyas ein
verbindendes Attribut gibt. Gibt es ein solches Attribut nicht, so entartet der Verbund zum
Kreuzprodukt. En Abd.2.5ist dieses verbindende Attribut dasjenige, das die b-Werte
enthält. Wir verknüpfen jetzt alle Tupel der beiden Relationen miteinander, die im
verbindenden Attribut gleiche Werte besitzen. Das verbindende Attribut, hier die Spalte
mit den Wertenbi, geben wir dabei nur einmal aus.
Beim Verbund werden die Spalten (Atributo) mit gleichen Spaltennamen (Attributnamen)
miteinander verknüpft. Este arte der Verbindung heißt auchVerbund natural oderunirse
natural. Dabei werden alle Tupel der beiden Relationen zusammengeführt, diesen diesen
Attributen die gleichen Attributseinträge besitzen. Wir sprechen daher auch von einemEqui-
unirse. Darüber hinaus wird der BegriffVerbundauch verwendet, wenn zwei Relationen über
andere Regeln verknüpft werden, etwa mittels Kleiner- oder Größer-Beziehungen. Zur
Unterscheidung bezeichnen wir diesen allgemeinen Verbund alsUnión Theta.

Der Verbund habló en Datenbankanwendungen eine extrem wichtige Rolle. Werden dem
Verbund daher im Weiteren a menudo comienza, insbesondere bei der Behandlung des Join-
Operators von SQL in Abschn.4.1.7. Dort werden wir auch denUnión externakennen lernen,
auf den wir hier hier nicht eingehen.

DivisiónDie Division setzt voraus, dass die RelationR1piensa en todos los atributos
atenciónla relaciónR2enthält. Aus den beiden RelationenR1yR2wird dann una nueva
R21erzeugt, todos los atributos deR1además del atributoatenciónenthält, und die
relación R3DR
2.5 Álgebra relacional 49

allen tupel ausR1besteht, deren Werte in den Attributenatencióncon allen werten ausR2
übereintimmen.
Wir betrachten das Beispiel aus Abb.2.5. Die zweite Relation im Divisionsbeispiel
enthält die EinträgeXyy. La primera relación enthält das gleiche Attribut als zweite Spalte.
Wir suchen jetzt alle Attributswerte aus der ersten Spalte, die mit beiden WertenX yyen
Verbindung stehen. Muere dorado nur für die Werteayb. Dementsprechend enthalt die
Ergebnisrelation auch nur diese Spalte mit diesen beiden Werten.
Zuletzt beachten wir denoperador Umbenennungs.Este operador no tiene grandes
conocimientos en Zugriff auf Datenbanken, y es también para la explicación exacta
interna del álgebra relacional. Dies wollen wir an einem Beispiel zeigen. Ein natürlicher
Verbund zwischen den RelationenPersonalyKundetambién Tab.2.6y2.7ist nicht möglich,
da sich alle Attributnamen voneinander unterscheiden. Wir müssen das Attribut nºder
Kundenrelation erst in den NamenKundnrumbenennen. La operación folgende ist daher
sinnvoll:

relación ergebnisDnº!Kundnr.Kunde/‰Auftrag:

Aquí está la relaciónKundeel atributonºumbenant. En otras relaciones KundeyAuftrag


gibt es nun das gemeinsame AttributKundnr, über das der Verbund ausgeführt wird. Es
sei als Übungsaufgabe empfohlen, die Ergebnisrelation anzugeben. Beim Verbund
können wir die Umbenennung vermeiden, indem wir statt des natürlichen Verbunds den
Equi-Join oder den Theta-Join verwenden. Wir geben dazu im Verbundsymbol die
Verbund-Operation als Index mit an. Obiger Verbund lässt sich daher auch schreiben
también:

relación ergebnisDKunde‰Kunde.NrDAuftrag.KundnrAuftrag:

Erfahrungsgemäß bereiten der Verbund und die Division anfangs erhebliche


Schwierigkeiten. Esto es verständlich, estos bisher no han tenido tiempo de
multiplicar y dividir a los operadores en las relaciones. Zur Vertiefung wollen wir
deshalb zu diesen beiden Operatoren noch ein Beispiel Bringen.
Beginnen wir mit dem Verbund und trachten die RelationenPersonalyAuftrag también Tab.
2.6y2.8. Beide Relationen enthalten das Attributpersona, das als Verbindung für diesen Join
verwendet wird. Unter dieser Voraussetzung liefert die Verbund-Operation R3DAuftrag‰
Personalmorir en la pestaña.2.10Relación angegebene, wobei aus Platzgründen das Attribut
Vorgesetztweggelassen wurde.
Atributo Das verbindendepersonaist hervorgehoben. Todos los atributos de las distintas
relacionesPersonalyAuftragerscheinen auch in der Ergebnisrelation, das in beiden Relationen
vorkommende Attributpersonaallerdings nur einmal. Es werden todos los atributos de la
relaciónAuftragcon todos los atributos de la relaciónPersonalverknüpft, die die die gleiche
Personalnummer besitzen. Da zu jedem Fremdschlüsselwert (Atributopersonala relación
Auftrag) ein Primärschlüsselwert (Atributopersonala relaciónPersonal) existiert, besitzt
50 2 El modelo de relación

Pestaña. 2.10 Verbos naturales de relacionesAuftragyPersonal

AuftrNr Dato Kundnr persona Nombre Gehalt Ort


1 04.01.13 1 2 Anna Kraus 3400.00 Ratisbona
2 06.01.13 3 5 Juan. Koster 3200.00 Núremberg
3 07.01.13 4 2 Anna Kraus 3400.00 Ratisbona
4 18.01.13 6 5 Juan. Koster 3200.00 Núremberg
5 06.02.13 1 2 Anna Kraus 3400.00 Ratisbona

in unserem Beispiel das Ergebnis dieses Verbunds die gleiche Kardinalität wie die Relation
Auftragauto.
Der Verbund hängt eng mit Fremdschlüsseln zusammen und taucht in der Praxis sehr
häufig auf. Wegen este Zentralen Bedeutung wurde en SQL der OperadorUnirse
eingeführt. Diesen werden wir in Kap.4ausführlich kennen lernen. Esta división se da en
SQL sin ningún operador propio. Zum Verständnis ist er aber doch wichtig. Nos
dedicamos también a la división y traemos interesantes juegos de azar. En la tabla
Lieferung (Pestaña.2.11) finden wir zu jedem Artikel (ANr) todos los Lieferanten (Liefnr),
die diesen Artikel zu gegebenen Konditionen (Lieferzeit,Nettopreis) liefern. Konzentrieren
wir uns auf die ersten beiden AttributeANryLiefnr. Nehmen wir an, dass der Lieferant mit
der Lieferantennummer 3 ausfällt. Wir möchten jetzt wissen, ob ein einzelner Lieferant
unseren Lieferanten 3 komplett ersetzen kann. Wir wollen also wissen, ob es noch weitere
Lieferanten gibt, die alle Artikel im Angebot haben, die auch Lieferant 3 liefert. Bei der
Beantwortung dieser Frage hilft uns tatsächlich die Division weiter!
Wir bereiten zunächst die RelationLieferunggeeignet auf und entfernen die no
benötigten Attribute. Esta es una proyección. Anschließend konzentrieren wir uns auf die
Daten des Lieferanten 3 und führen eine entsprechende Restriction durch. Insgesamt er-

Pestaña. 2.11RelaciónLieferung(Auszug)

ANr Liefnr Lieferzeit Nettopreis Mejor


500001 5 1 6.50 0
500002 2 4 71,30 10
500002 1 5 73.10 0
500003 3 6 5.60 0
500003 4 5 6.00 0
500003 2 4 5.70 0
500004 3 2 5.20 0
500004 4 3 5.40 0
500005 4 5 6.70 0
500006 1 1 31.00 0
500007 1 2 16.50 0
2.5 Álgebra relacional 51

Tejido. 2.6Beispiel una


división R1: ANr Liefnr R3: ANr
500001 5 500003
500002 2 500004
500002 1
500003 3 R1÷R3 R4:
500003 4
Liefnr
500003 2
500004 3 3
500004 4 4
500005 4
500006 1
500007 1

geben sich folgende vier Operationen:

R1D -ANr,Liefnr.Lieferung/
R2D -LiefnrD3.R1/
R3D -UN r.R2/R4
DR1 R3:

Relación de matrizR1entspricht der RelaciónLieferungmit nur den beiden SpaltenANr y


Liefnr. Relación de matrizR2wird aus der RelaciónR1abgeleitet und enthält nur noch die
beiden Zeilen mit der Lieferantennummer 3. Die RelationR3wiederum besitzt nur noch die
SpalteANrzu den Teilen, die Lieferant 3 liefert. Dies sind in unserem Beispiel die Teile
500003 und 500004. Dividieren wir jetztR1porR3, así que erhalten wir mit Relación R4alle
Lieferanten, diese beiden Teile liefern, siehe auch Abb.2.6. Dies wären in unserem Beispiel
die Lieferanten 3 y 4. Nur Lieferant 4 liefert daher mindestens die gleichen Teile wie
Lieferant 3!
Übrigens ist es wegen des fehlenden Divisionsoperators in SQL nicht einfach, dieses Beispiel
mit einem passenden SQL-Befehl auszuführen. Wir kommen in Abschn.4.4aber darauf zurück.

2.5.5 Eigenschaften der relacional Operadores

Wir haben im letzten Abschnitt neun Operatoren kennen gelernt, die auf Relationen
angewendet werden. Wir wollen hier einige Eigenschaften dieser Operatoren aufzählen.
Zunächst ist wichtig, dass das Ergebnis bei allen neun Operadoren wieder Relationen sind. Wir
können demnach auf diese Ergebnisse wiederholt unsere Operadores anwenden, was zu
komplexen Ausdrücken führt, aufbauend auf unseren neun Operadores. Wie wir arithmetische
Ausdrücke aus Termen y estos wieder aus Faktoren erstellen, así que podemos tener aquí una
definición de sintaxis. Esta sintaxis beinhaltet Klammerregeln und die
52 2 El modelo de relación

Bindungsstärke von Operadores. Además, los operadores auf Kommutativität und


Assoziativität untersucht. Werden dies hier nicht vollständig nachvollziehen, aber auf
einige Besonderheiten wollen wir trotzdem aufmerksam machen.
Comenzaremos con la Kommutativgesetz. Estos dorados para los mejores operadores
relacionales:
A [ BDB [A
A\BDB\A
A BDB A
A‰BDB‰A
Es sei erwähnt, dass wir hier sehr vorsichtig argumentieren müssen. Bei Vertauschung
der Relationen ändert sich im Ergebnis die Reihenfolge der Tupel bzw. Spalten. Da dies
aber rein logisch in Relationen keine Rolle spielt, ist das Kommutativgesetz für diese
Operatoren gültig. Das Kommutativgesetz gilt nicht für die Differenz und die Division.
Bei komplexen Ausdrücken spielen Klammern eine wichtige Rolle. También
podemos ver en la aritmética también en el álgebra relacional. Bei folgenden
Operatoren gilt das Assoziativgesetz:

A B C /D .A B CDA [ B [ C A \ .B \ C /D .A B CD
A \ B \ C A .B C /D .A B CDA B C A‰ .B‰C /
D .A‰B/‰CDA‰B‰C
VorsichtS

Wieder gilt das Assoziativgesetz nicht für die Differenz und die Division. Aber auch
beim natürlichen Verbund mit mehr als dos Relationen ist große Vorsicht geboten, denn
der natürliche Verbund verbindet immer mittels der Attribute gleichen Namens. Estoy
AusdruckA‰B‰Cwerden también mueren relacionesAyBüber die Spalten gleichen
Namens verknüpft, ebenso die RelationenByC. Sollten jetzt zufälligerweise die Relationen
AyCzusätzlich gemeinsame Attributnamen besitzen, so werden diese ebenfalls beim
Verbund mit verwendet. Dies ist hier aber nicht beabsichtigt. Aus diesem Grund sollte der
natürliche Verbund in der Praxis nur mit Bedacht verwendet werden. Besser ist es, beim
Verbund die zu verwendenden Verknüpfungsattribute immer explizit anzugeben (Equi-
Join!). Wir werden darauf beim Join-Operator en SQL en Kap.4ausführlich eingehen.

Viele weitere Regeln gelten für relacionale Operadores. Wir wollen uns hier auf einige
wenige beschränken. Detalles können en Kemper und Eickler (2015), Schubert (2007) oder
2.5 Álgebra relacional 53

Elmasri y Navathe (2002) nachgelesen werden:

. 1/ - camaA.-camaB.R//D -camaB.-camaA.R// D -camaAY BedingungB.R/


D -camaA.R/\-camaB.R/

. 2/ - camaAO camaB.R/D -camaA.R/ [ -camaB.R/


. 3/ - cama.R1[R2/D -cama.R1/ [ -cama.R2/
. 4/ - cama.R1‰R2/D -cama.R1/‰ -cama.R2/
. 5/ - Bedingung_an_R2.R1‰R2/DR1‰ - Bedingung_an_R 2 . R2/
. 6/ - Auswahl.-cama.R//D -cama.-Auswahl.R//

. 7/ R1D .R1 R2/R2

Die Regel 1 zeigt, dass wir geschachtelte Restriktionen auch direkt mit einer Und-
Verknüpfung versehen können. Las bisagras de conexión de distintos tipos solo se
encuentran en el medio de un tren de conexión, como el nivel 2. Cuando entre los niveles
3 y 4, no se deben usar también para el Schnitt y el producto de cocina. Sie besagen, dass
eine Restriktion vorgezogen werden darf. Dies beeinflusst in der Praxis die Performance
enorm. Estamos en Kap.7darauf zurück.
Regel 5 ist ein Sonderfall von Regel 4 und gilt auch für die Vereinigung, den Schnitt
und das Kreuzprodukt. Este Regel dio una, dass die RelationR1nicht von der Restriktion
betroffen ist, wenn sich die Bedingung nur auf RelationR2bezieht. Regel 6 ist nur sinnvoll,
wenn sich die Bedingung auf Attribute bezieht, die in der Projektion ausgewählt werden.
In diesem Fall darf Projektion und Restriction vertauscht werden. Es hängt vom Aufbau
der Relation ab, welche Reihenfolge schneller zum Erfolg führen wird. Wieder verweisen
wir auf Kap.7.
Die Regel 7 wurde hinzugefügt, um zu zeigen, dass die Division tatsächlich seinen
Namen verdient. Multiplicar con una relaciónR1con una relaciónR2und dividieren dann
wieder durchR2, so erhalten wir die ursprüngliche Relation.
E.F. Codd wies in seinen Veröffentlichungen (Codd1970,1972) zusätzlich nach, dass
nicht alle neun Operadores notwendig sind. Genau genommen reichen bereits die
folgenden sechs Operatoren aus: Vereinigung, Differenz, Kartesisches Produkt,
Restriktion, Projektion und Umbenennung. Die verbleibenden drei lassen sich aus diesen
sechs Operatoren herleiten. Seien dazu die RelaciónR1mit den beiden
(zusammengesetzten) AttributenR1:XyR1:Sy la relaciónR2mit den beiden
(zusammengesetzten) Attributen R2:SyR2:Zgegeben, tan dorado:

R1\R2DR1n.R1norteR2/
R1‰R2D -R1:X;R1:Y;R2:Z.-R1:SDR2:S.R1 R2//
R1 R2D -R1:X.R1/norte -R1:X..-R1:X.R1/ R2/norteR1/
54 2 El modelo de relación

Bei der Division setzten wir voraus, dass die RelationR2nur Attribute enthält, die auch
in der RelationR1existen. Aus diesem Grund wird in der dritten Gleichung zusätzlich
gefordert, dassR2:Zleer ist. Es sei als Übung empfohlen, diese drei Gleichungen selbst
nachzuvollziehen. Ohne Beweis sei noch aufgeführt, dass die verbleibenden sechs
Operadores mínimo sind. Dies heißt, das Weglassen eines weiteren Operadores würde
die Vollständigkeit der relacionaalen Algebra verletzen. In der Praxis hat sich die Sprache
SQL durchgesetzt. Doch SQL y el álgebra relacional han sido mucho gemeinsam,
moriremos en Kap.4mehrfach feststellen.
Zuletzt sei erwähnt, dass die relacionale Algebra nicht der einzige Zugang zum
Relationenmodell ist. Bereits paralelo zur relacionalen Algebra wurde das Relationenkalkül
entwickelt. En el álgebra relacional werden die Zugriffe konstruiert, es también ein
konstruktives Verfahren angewendet. Im Relationenkalkül wird beschrieben, wie mit der
Datenbank und ihren Relationen gearbeitet werden kann. Hierzu wird eine Zugriffssprache
(bekannt ist etwa die Zugriffssprache QUEL) definido. Rasch stellte sich heraus, dass beide
Zugänge zum Relationenmodell gleich mächtig sind, siehe Codd (1972). Auch hier sei dem
interessierten Leser das Buch von Date (2003) zur Vertiefung empfohlen.

2.6 Fassammenfassung

En este Kapitel haben wir neue Begriffe im Zusammenhang mit relacionalen Datenbanken
kennen gelernt bzw. definido. Lo más importante es:Relación,banco de datos relacional,
Schlüsselkandidat, PrimärschlüsselyFremdschlüssel.
In Relationen existiert weder eine Anordnung noch gibt es doppelte Tupel.
Primärschlüssel wiederum identifizieren jedes Tupel einer Relation eindeutig und
Fremdschlüssel beziehen sich immer auf de Primärschlüssel einer Relation. Sie bilden den
„Kit“ zwischen den Relationen.
Die Wichtigkeit sowohl von Primär- als auch von Fremdschlüsseln wird noch durch die
beiden Integritätsregeln verdeutlicht. Die erste bezieht sich auf den Primärschlüssel und
verlangt, dasser immer einen definierten Wert enthalten muss. Die zweite Regel fordert, dass
jeder Fremdschlüssel, falls er einen definierten Wert enthält, auf ein existierendes Tupel
verweisen muss. Dies bedeutet, dass jeder Fremdschlüssel nur Werte annehmen darf, die
bereits im Primärschlüssel der Relation stehen, auf die sich der Fremdschlüssel bezieht. Es
bedeutet ferner, dass entsprechende Primärschlüsselwerte nur geändert werden dürfen, wenn
der dazugehörige Fremdschlüsselwert gleichzeitig mit angepasst wird. Die Verletzung einer der
beiden Regeln würde auf Dauer immer zu inkonsistenten Datenbanken führen und ist daher
grundsätzlich verboten.
Zuletzt haben wir ausführlich die neun Operadores der relacionalen Algebra
vorgestellt. Este álgebra es muy útil, pero los operadores utilizados en SQL son mejores
para su uso. Besonders qué es el álgebra relacional en Zusammenhang mit Performance-
Untersuchungen.
2.7 Übungsaufgaben 55

2.7 Übungsaufgaben

Aufgaben
1. Erklären Sie folgende Begriffe: Tupel, Attribut, Relation, Gebiet, Grad, Kardinalität.

2. Was spricht dagegen, in der Relation der chemischen Elemente aus Tab.2.4den
SchlüsselkandidatenSímboloals Primärschlüssel zu wählen?
3. Geben Sie den Primärschlüssel der RelationVerkaeuferProductotambién Tab.2.1un.
4. Welche Attribute eines neuen einzutragenden Tupel müssen immer mindestens
angegeben werden? Denken Sie dabei an die erste Integritätsregel.
5. Geben Sie die Primärschlüssel aller Relationen der BeispieldatenbankBicicletaaus Kap.10
un. Encuentre también todos los Schlüssel alternativos.
6. Geben Sie alle Fremdschlüssel der BeispieldatenbankBicicletaaus Kap.10un.
7. Nehmen wir an, in der BeispieldatenbankBicicletaaus dem Anhang gelte für alle
Fremdschlüssel die Eigenschaftal eliminar cascada. Geben Sie alle Tupel an, die
kaskadierend gelöscht werden, wenn
a) der Eintrag von P. Köster en la relaciónPersonal
b) der Eintrag 500001 en la relaciónArtículogelöscht wird.
8. Bilden Sie einen Verbund der RelationPersonaltambién Tab.2.6auf sich, también
Personal‰Personal. Hierbei ist das AttributVorgesetztder einen Relación con el
atributopersonader anderen Relation zu verknüpfen. Geben Sie nur die Atributo
persona,NombreyVorgesetztin beiden Relationen aus, también:

- Persona,Nombre,Vorgesetzt.Personal/‰Personal.VorgesetztDChef.Persnr

Personal!Cocinero.-Persona,Nombre,Vorgesetzt.Personal//

9. Es seien dos relacionesAyBcon la KardinalitätMETROrespectivonorteGegeben.


Geben Sie jeweils die minimale und die maximale Kardinalität der folgenden
Ergebnisrelationen an (in Abhängigkeit vonMETROynorte):

A [B; A‰B; AnorteB; A B; A\B

10. Geben Sie die RelaciónRcon nosotrosRDKunde‰Nr=KundnrAuftrag.


11. Die Operadores Schnitt, Verbund und Division können aus den verbleibenden
relacionaalen Operadores hergeleitet werden. Vollziehen Sie die entsprechenden
Formeln aus Abschn.2.5.5nach.
56 2 El modelo de relación

Literatura

Codd, EF (1970). Un modelo relacional de datos para grandes bancos de datos compartidos.MCCA,13(6), 377–
387.
Codd, EF (1972). Completitud relacional de los sublenguajes de bases de datos. En R. Rustin (Ed.),Datos
Sistemas básicos(págs. 65–98). Prentice Hall.

Connolly, T., & Begg, C. (2015).Sistemas de bases de datos(6. Aufl.). Pearson.


Fecha, CJ (2003).Una introducción a los sistemas de bases de datos(8. Aufl., Bd. 1). Addison-Wesley.
Eirund, H., & Kohl, U. (2000).Datenbanken – leicht gemacht. Teubner.
Elmasri, R., & Navathe, S. (2002).Grundlagen von Datenbanksystemen(3. Aufl.). Addison-Wesley.
Elmasri, R., & Navathe, S. (2009).Grundlagen von Datenbanksystemen(3. Aufl.). Addison-Wesley.
soltero
Jarosch, H. (2016).Grundkurs Datenbankentwurf.Springer Vieweg.
Kemper, A., & Eickler, A. (2015).Datenbanksysteme – Eine Einführung. Oldenburgo. Kifer, M.,

Bernstein, A., & Lewis, P. (2005).Sistemas de bases de datos. Addison-Wesley. Maier, D. (1983).La teoría

de las bases de datos relacionales. Prensa de Ciencias de la Computación.

Meier, A. (2003).Bancos de datos relacionales: Eine Einführung für die Praxis. Springer Taschenbuch.
Schubert, M. (2007).Bancos de datos. Teubner.
Unterstein, G., & Matthiessen, M. (2012).Bancos de datos relacionales y SQL en teoría y práctica.
Saltador.
Vossen, G. (1991).Modelos de datos, lenguajes de bases de datos y sistemas de gestión de bases de datos..
Addison-Wesley.
Diseño de banco de datos
3

Supervisión
En Kap.2lernten wir Relationen und wichtige Begriffe und Regeln rund um
Relationen kennen. Primärschlüssel identifizieren die Einträge Innerhalb von
Relationen, und Fremdschlüssel stellen die Verbindung zwischen Relationen her. En
este Kapitel steigen wir in das Erstellen einzelner Relationen bis hin zu kompletten
Datenbanken ein. Das Relationenmodell lässt dem Datenbankdesigner trotz der
beiden Integritätsregeln aus Kap.2Viele Freiheiten.
Dieses Kapitel soll helfen, diese Freiheiten im Design so zu nutzen, dass die
entstehende Datenbank hohen Ansprüchen genügt: Einfache Handhabung, hohe
Performance, leichte Erweiterbarkeit, gute Übersichtlichkeit und geringe
Redundanz sollten selbstverständlich sein. Wir geben dazu viele Anregungen und
wichtige Hilfestellungen. Wir sollten das Datenbankdesign sehr ernst nehmen.
Ansonsten könnten komplex Abfragen und lange Antwortzeiten die Freude an der
neuen Datenbank schnell verderben. Auftretende hohe Redundanzen könnten
leicht zu Inkonsistenzen führen und schließlich die Datenbank völlig unbrauchbar
werden lassen.

Naturalmente, no debe detenerse el diseñador del banco de datos ni las folgenden


Empfehlungen. Doch das Beispiel der bereits en Kap.2relación verwendeten
VerkaeuferProductoen la pestaña.3.1zeigt eindrucksvoll die Schwächen eines schlechten
Designs einer Relation auf, obwohl das Beispiel im Sinne der Definición einer Relation korrekt
war. Noch schlimmer wirkt sich ein schlechtes Design einer ganzen Datenbank aus. Wir sollten
den folgenden Satz nie vergessen: „Einmal schlechtes Design – immer schlechte Anwendung!“
Werden in diesem Kapitel Normalformen von Relationen und diezu benötigten
Definiciones einführen. Während die Normalformenlehre immer nur einzelne Relationen
getrennt untersucht, unterstützt das anschließend vorgestellte Entity-Relation-Modell
58 3 Diseño de banco de datos

Pestaña. 3.1 VerkaeuferProdukt (übernommen aus Tab.2.1)

VerkNr VerkNombre Por favor VerkAdresse Nombre del producto umsatz


V1 Meier 80331 Múnich lavadora 11000
V1 Meier 80331 Múnich Rebaño 5000
V1 Meier 80331 Múnich Kühlschrank 1000
V2 Schneider 70173 Stuttgart Rebaño 4000
V2 Schneider 70173 Stuttgart Kühlschrank 3000
V3 Müller 50667 Colonia Staubsauger 1000

das Gesamtdesign einer Datenbank mit all den Beziehungen zwischen den
einzelnen Relationen. El modelo de entidad-relación es enorme y no se incluye
en los bancos de datos relacionales.
Zusammen mit Kap.2Bildet dieses Kapitel den Schwerpunkt zu Relationsalen
Datenbanken. Jeder Datenbankprogrammierer sollte mit den Integritätsregeln aus Kap.2y
den hier behandelten Normalformen und dem Entity-Relation-Modell vertraut sein. Un
diseño óptimo y un programa de programación óptimo steht dann nichts mehr im Wege.

3.1 Formas normales

Die Normalformenlehre klassifiziert Relationen. Sie teilt Relationen abhängig von Redundanzen
und Zugriffsproblemen in sogenannte Normalformen ein. Bereits bei seiner Vorstellung der
Relationsalen Datenbanken im Jahre 1970 verwendete E. F. Codd drei forma normal , siehe
Codd (1970y1972). In den Folgejahren kam eine zweite Version zur dritten Normalform hinzu,
ebenso eine vierte und fünfte Normalform. Über eine sechste Normalform wird seit Jahren
diskutiert. Alle Normalformen bauen directamente aufeinander auf, wobei die erste
Normalform am wenigsten, die fünfte am stärksten einschränkt. Es dorado allgemein:

I Befindet sich eine Relation in dernorte. forma normal , así que befindet sie sich auch in der
metro. forma normal conmn.

Werden here und in den folgenden Abschnitten sechs Normalformen kennen lernen,
beginnend bei der ersten über dos dritte bis hin zur fünften Normalform. Eine hohe
praktische Bedeutung besitzen die zweite und dritte Normalform. Die vierte und fünfte
Normalform werden im Detail vorgestellt, spielen aber in der Praxis kaum eine Rolle. Die
entsprechenden Abschn.3.1.6y3.1.7Richten sich daher vor allem an die interessierten
Leser.
3.1 Formas normales 59

3.1.1 Primera forma normal

Comenzamos con la primera forma normal. Sie lautet:

IDefinición: primera forma normalUna relación está en elersten forma normal , wenn alle
zugrundeliegenden Gebiete nur atomare Werte enthalten.

Esta definición está incluida, todos los atributos no son atributos específicos enthalten
dürfen. Dies haben wir aber bereits bei der Definición einer (normalisierten) Relation gefordert.
¡Damit sind todas las relaciones automáticas en la primera forma normal! La definición der
ersten Normalform ist historisch bedingt, da E. F. Codd in der Originaldefinition einer Relation
nicht forderte, dass eine Relation nur atomare Attribute enthalten darf.
Relación de matrizVerkaeuferProductotambién Tab.3.1ist eine normalisierte Relation und
damit in der dersten Normalform. Esta relación besitzt allerdings dos gravierende, bereits in
Kap.2angesprochene Schwächen. Zum einen enthält sie Redundanzen, da zu jedem verkauften
Produkt immer alle Verkäuferdaten aufgelistet sind. Zum anderen ist das Entfernen des
ProduktsStaubsaugeraus dem Sortiment nicht möglich, da wir sonst auch alle Informationen
zum VerkäuferMüllerverlieren würden. Ein Ersetzen des InhaltsStaubsaugerdurante la guarida
Nulo-Wert ist ebenfalls nicht erlaubt, da das AttributNombre del producto¡Teil des
Primärschlüssels ist, und dies somit die erste Integritätsregel verletzen würde! Auch das
Einfügen eines neuen Verkäufers ist nicht möglich, wenn er noch nichts verkauft hat.
Es sei darauf bisagras, dass in objektrelationalen Datenbanken auf die Atomarität und
damit auf the erste Normalform bewusst verzichtet wird. Estas relaciones también son NF
2-Normalformen bezeichnet. NF2Steht für NFNF und ist eine Abkürzung für Non-First-
Normal-Form, also für Relationen, die sich nicht in erster Normalform befinden. Detalles
de zu NF2-Normalformen und zu objektrelationalen Datenbanken sei auf Abschn.9.2.2
verwiesen.
Die erste Normalform ist nur ein Einstieg. Wir müssen weitere Normalformen einführen, um
die Qualität der Relationen zu verbessern.

3.1.2 Abhängigkeit funcional

Die Qualität einer Relation hängt vor allem von den internan Zusammenhängen zwischen den
einzelnen Attributen ab. Wir müssen deshalb zunächst diese Zusammenhänge verstehen,
bevor wir weitere Normalformen einführen können. Folgende Definición beschreibt die
Abhängigkeiten der einzelnen Attribute untereinander und ist daher besonders wichtig:

IDefinición: FunktionaleAbhängigkeitUn atributoYuna relaciónRheisstabhangig funcional


atributo vomXRelación derselben, wenn zu jedemX-Wert höchstens einY-Wert möglich ist.
60 3 Diseño de banco de datos

La definición no se incluye en ningún atributo específico.XyYkönnen auch


zusammengesetzte Attribute sein. esYvonXFuncional abhängig, así que sigue un X-
Wert höchstens ein Y-Wert, y wir schreiben:

X!Y

La definición de bedeutet:YEsta función funcional se abreX, wenn während der gesamten


Existenz der Relation zu jedemX-Wert höchstens einY-Wert existieren kann. Wir dürfen dabei
das Wort „höchstens“ nicht durch „genau“ ersetzen, daNulo-Werte auftreten können. Wir
wollen this Definición en el Beispiel der RelationVerkaeuferProductotambién Tab.3.1
nachvollziehen. Dort hängen die Verkäuferdaten von der Verkäufernummer eindeutig ab. Es
liegt eine funktionale Abhängigkeit vor. Wir können schreiben:

VerkNr!VerkNombre
VerkNr!Por favor

VerkNr!VerkAdresse

oder zusammengefasst:

VerkNr! .VerkNombre;Por favor;VerkAdresse/ :

Es ist nicht trivial, alle funktionalen Abhängigkeiten in der RelationVerkaeuferProducto zu


encontrado. Sehr hilfreich bei dieser Suche ist aber jetzt der im Kap.2Definierte Begriff
Superschlüssel. Jeder Superschlüssel beschreibt ein Tupel eindeutig. Cada vez que este
Superschlüsselwerte existe daher höchstens ein Wert en cada otro atributo. Folglich
gehen von jedem Superschlüssel Pfeile zu allen anderen Attributen!
Der wichtigste Superschlüssel ist der Primärschlüssel, und in der RelationProducto Verkaeuferist
dies das zusammengesetzte Attribut(VerkNr, nombre del producto). Somit dorado:

. VerkNr;Nombre del producto/ !umsatz


. VerkNr;Nombre del producto/ !VerkNombre
. VerkNr;Nombre del producto/ !Por favor
. VerkNr;Nombre del producto/ !VerkAdresse

Auf der rechten Seite wurden alle Attribute der Relation aufgelistet, die nicht zum
Primärschlüssel gehören. Damit haben wir sehr wichtige funktionale Abhängigkeiten kennen
gelernt. Möglicherweise existieren aber noch weitere. Setzen también alberga el fuerte Suche.
Si estamos en la playa, esto no significa que la relación calidad-precio sea completa, por lo que
no tendremos que preocuparse por nada. Folgende Abhängigkeit besteht beispielsweise nicht:

VerkNombre!VerkAdresse . falso!/
3.1 Formas normales 61

Schließlich könnten im Laufe der Zeit noch weitere Verkäufer mit dem Namenmeyer oder
Müllereingestellt werden. Aus dem Verkäufernamen kann daher nicht zwingend auf die
Adresse geschlossen werden.
Hochinteressant ist der Vergleich von Postleitzahlen und Wohnorten. Im Allgemeinen
existieren hier keine Abhängigkeiten, da es Kleingemeinden mit gemeinsamer gleicher
Postleitzahl gibt. Umgekehrt besitzen alle Großstädte mehr als nur eine Postleitzahl. Werden in
einer Datenbank aber nur größere Ortschaften verwendet, aus welchen Gründen auch immer,
so wäre folgende Abhängigkeit denkbar:

Por favor!VerkAdresse . falls die Adresse nur große Ortschaften enthält!/

Identificarse con el atributoVerkAdressenicht nur den Wohnort, sondern auch die Straße
und die Hausnummer, so ist die folgende Abhängigkeit naheliegend:

. Ort;calle;casa/ !Por favor ‹

Doch auch diese Abhängigkeit gilt nicht allgemein. Es gibt in Deutschland viele
Ortschaften gleichen Namens, denken wir nur an den OrtNeustadt. Und in diesen Orten
wird es sicherlich gleiche Straßennamen wie Hauptstraße oder Bahnhofstraße mit
gleicher Hausnummer geben. Folglich folgt die Postleitzahl nicht eindeutig aus der
vollständigen Adresse. Dies war übrigens auch der Hauptgrund, warum die Post vor ca.
50 Jahren die Postleitzahlen einführte!
Außer den schon aufgeführten funktionalen Abhängigkeiten finden wir also keine weiteren.
Es fällt aber auf, dass wir die AttributeVerkNombre,Por favoryVerkAdressezweimal auf der
rechten Seite aufgelistet hatten:

VerkNr! .VerkNombre;Por favor;VerkAdresse/

. VerkNr;Nombre del producto/ ! .VerkNombre;Por favor;VerkAdresse/

Estos tres atributos cuelgan de los números funcionales ab. Nehmen wir zur
Verkäufernummer noch weitere Attribute hinzu, so folgt aus diesem zusammengesetzten
Attribut natürlich weiterhin eindeutig der Verkäufername. Wir erhalten also durch
Hinzunahme weiterer Attribute auf der linken Seite des Pfeils eine Fülle von zusätzlichen
Abhängigkeiten, die uns aber nicht wirklich weiterbringen. Wir verschärfen daher unsere
Definición de la función funcional:

IDefinición: Volle funktionale AbhängigkeitUn atributoYuna relaciónRheisst


voll abhängig funcional atributo vomXRelación derselben, cuando es funcional abhängig
vonXist, no aber funcional abhängig von beliebigen Teilattributen vonX.

esYvoll funcional abhängig vonX, así que schreiben wir abkürzend

X)Y
62 3 Diseño de banco de datos

Cuando no se puede realizar ninguna operación funcional, solo se puede utilizar


una configuración sencilla.X ! Y.
Ähnlich wie beim Übergang vom Superschlüssel zum Schlüsselkandidaten verlangen
wir jetzt die Minimalität des AusgangsattributsX. esXein nicht zusammengesetztes
Attribut, so folgt wegen der Minimalität aus der funktionalen AbhängigkeitX ! YSofort die
volle funktionale AbhängigkeitX ) Y .
Kommen wir zu unserer RelaciónVerkaeuferProductozurück. Gehen wir davon aus,
dass zwischen den AttributenPor favoryVerkAdressekeine funktionale Abhängigkeit
besteht, so gibt es genau folgende vollen funktionalen Abhängigkeiten in dieser Relation:

. VerkNr;Nombre del producto/ !Umsatz


VerkNr!VerkNombre

VerkNr!Por favor

VerkNr!VerkAdresse

Aus dem Primärschlüssel folgt eindeutig der Umsatz, bereits aus Teilen des
Primärschlüssels (VerkNr) siguen otros atributos.
Ganz allgemein gilt, dass von allen Superschlüsseln und damit auch vom
Primärschlüssel Pfeile (!) zu allen other Attributen führen. Dies liegt an der Eindeutigkeit
der Superschlüssel und ist eine grundlegende Eigenschaft von Relationen. Geht vom
Primärschlüssel aber kein Doppelpfeil ()) zu allen other Attributen, so existiert eine all
funcionale Abhängigkeit bereits von einem Teil des Primärschlüssels. Teile des
Primärschlüssels sind nicht eindeutig und kommen daher in einer Relation mehrfach vor.
Si se utiliza, también se activará la función funcional, redundanzen entstehen. ¡Und
gerade estos redundanzen wollen wir nun beseitigen!

3.1.3 Forma normal de Zweite

Im letzten Abschnitt haben wir gesehen, dass funktionale Abhängigkeiten vom


Primärschlüssel immer existieren. Es treten jedoch Redundanzen auf, wenn nocht alle
Attribute voll funktional vom Primärschlüssel abhängen. Dementsprechend wollen wir
nur noch volle funktionale Abhängigkeiten vom Primärschlüssel erlauben:

IDefinición: forma normal de ZweiteUna relación está en la segunda forma normal, cuando está
en la antigua forma normal y todos los atributos de Nichtschlüssel son funcionales desde
Primärschlüssel abhängt.

Ein Nichtschlüsselattribut ist jedes (auch zusammengesetzte) Attribut, das kein


Schlüsselkandidat ist. Die Definición schließt also nicht aus, dass neben dem Primärschlüssel
noch Alternative Schlüssel vorkommen dürfen. Die zweite Normalform bezieht sich nur
3.1 Formas normales 63

auf den Zusammenhang zwischen allen Nichtschlüsselattributen und dem


Primärschlüssel. Wir können daher sehr einfach Relationen unterscheiden, ob sie nur in
erster oder zweiter Normalform sind:

I Para todas las relaciones, tenga en cuenta la anterior forma normal dorada:

Primärschlüssel!atributo Nichtschlüssel

Para todas las relaciones en mente dos veces la forma normal dorada:

Primärschlüssel)atributo Nichtschlüssel

Esta pequeña camada de dos formas normales se elimina de una gran cantidad de
funciones, y se eliminarán algunas redundancias. Dies sehen wir auch eindrucksvoll an unserer
RelationVerkaeuferProducto. Die Verkäuferdaten (VerkNombre,Por favor,VerkAdresse) Sind voll
funktional abhängig vom Primärschlüssel. La relación no está incluida en la segunda forma
normal. Esta reducción funcional de todas las funciones es también la Ursache für die
Redundanz, das mehrfache Auflisten der Verkäuferdaten.
Ob eine Relation in dos Normalform ist oder nicht, hängt also nur von der Qualität des
Primärschlüssels ab. Besteht der Primärschlüssel nur aus einem einzigen Attribut, so sind
wegen der Minimalität alle funktionalen Abhängigkeiten vom Primärschlüssel
automatisch también alle funktional. Wir schließen daraus sofort:

I Eine normalisierte Relation mit einem nicht zusammengesetzten Primärschlüssel


ist mindestens in derdos veces Forma normal.

Es gilt auch die Umkehrung: Eine Relation, die sich nicht in der zweiten Normalform
befindet, besitzt einen zusammengesetzten Primärschlüssel. Da in der Praxis viele Relationen
eine laufende Nummer als Primärschlüssel besitzen, sind all estas Relationen auch in dos
Normalform. Wir haben bereits die Tabelle der chemischen Elemente (Tab.2.4) kennen gelernt.
Esta relación está relacionada con el PrimärschlüsselProtones, un atributo einzelnes, y está
incluido en la segunda forma normal.
Jede Relation in erster Normalform lässt sich ganz einfach in die bessere zweite Normalform
überführen. Wir müssen nur dafür sorgen, einen einen einfachen Primärschlüssel zu
verwenden. Muere wollen wir una relación unsererVerkaeuferProductoeindrucksvoll aufzeigen:

Wir fügen zu unserer RelaciónVerkaeuferProductoUn nuevo atributonºhinzu und


nummerieren die Einträge durch. Esta nueva relación es besitzt nun dos Schlüsselkandidaten,
nämlichnºy(VerkNr, nombre del producto). Legen wir den bisherigen Schlüssel als
Primärschlüssel fest, so gewinnen wir nichts. Wählen wir jedoch das Attributnº, ¡así que la
relación es tan fuerte en la forma normal en dos ocasiones! Von dem nicht
zusammengesetzten AtributonºHängen nämlich alle other Nichtschlüsselattribute voll
funktional ab. Als Ergebnis erhalten wir die RelationVerkaeuferProdukt2NFen la pestaña.3.2.
64 3 Diseño de banco de datos

Pestaña. 3.2 VerkaeuferProdukt2NF

n.v.
r erkNr V erkNombre PAG
LZ V erkAdresse PAG
nombre rodukt Ud.
msatz
1 V1 Meier 80331 Múnich lavadora 11000
2 V1 Meier 80331 Múnich Rebaño 5000
3 V1 Meier 80331 Múnich Kühlschrank 1000
4 V2 Schneider 70173 Stuttgart Rebaño 4000
5 V2 Schneider 70173 Stuttgart Kühlschrank 3000
6 V3 Müller 50667 Colonia Staubsauger 1000

Wir erkennen sofort, dass wir mit this neuen Relation in zweiter Normalform das Problem
der Redundanz der ursprünglichen Relation nicht lösen können. Im Gegenteil, wir haben mit
dem neuen Primärschlüssel noch Redundanzen hinzugefügt! Da nun das atributoNombre del
productonicht mehr Teil des Primärschlüssels ist, kann jetzt andererseits das Produkt
Staubsaugerjederzeit entfernt werden, indem die entsprechenden Einträge einfach mitNulo
überschrieben werden. Auch ein neuer Verkäufer kann jederzeit hinzugefügt werden, auch
wenn er noch nichts verkaufte. Wir sehen, dass diess die immer mögliche Überführung einer
Relation in die die zweite Normalform mittels des Hinzufügens eines einzelnen
Primärschlüsselattributs zumindest teilweise befriedigt. Una transformación óptima sin
relaciónVerkaeuferProductoliegt aber mit Sicherheit nicht vor!
Tejido.3.1morirvollen funciones funcionales en la relaciónVerkaeuferProdukt2NF. Die beiden
Schlüsselkandidaten sind dabei hervorgehoben. Wieder fällt besunders das AttributVerkNrAls
Teil des Alternativen Schlüssels auf, von dem die Verkäuferdaten abhängen. Weitere
funktionale Abhängigkeiten existieren nicht, da zwischen Postleitzahlen und Adressen keine
direkten Zusammenhänge existieren, ebenso nicht zwischen Verkäufername und Adresse, wie
wir bereits im letzten Abschnitt festgestellt hatten.
Podemos saber la relaciónVerkaeuferProdukt2NFnoch durch ein AttributEstado
federado erweitern. Dadurch entstehen zusätzliche funktionale Abhängigkeiten des
Bundeslandes von den Schlüsselkandidaten und von der Postleitzahl. La relación también
está en la segunda forma normal. Wir erkennen, dass die doss Normalform zwar das
Arbeiten mit Relationen erleichtert, nicht jedoch notwendigerweise Redundanzen
entfernt.
Die funktionale Abhängigkeit beschreibt Abhängigkeiten. Besitzt nun ein Attribut, von dem
ein Pfeil ausgeht, mehrere gleiche Einträge, so wird auch diese Abhängigkeit ent-

Tejido. 3.1Todas las


umsatz
funciones funcionales Nombre del producto

VerkNr
VerkNombre

VerkAdresse

Por favor
3.1 Formas normales sesenta y cinco

sprechend mehrfach angegeben. Podemos evitar estas redundancias, indemnmente,


como resultado de la adaptación de los atributos de las personas, denen Pfeile ausgehen.
Und damit wären wir schon bei der nächsten Normalform.

3.1.4 Dritte Normalform nach Boyce und Codd

La definición de las dos formas normales se incluye en el texto original. Todos los demás
juegos dobles se juegan en la segunda forma normal sin ningún rollo. Sin embargo, todas
las funciones están desactivadas por un atributo, por lo que no se puede seleccionar el
candidato, por lo que se redunda automáticamente. Schließlich enthalten Nicht-
Schlüsselkandidaten nicht notwendigerweise eindeutige Werte, und die Abhängigkeiten
werden entsprechend mehrfach aufgezählt. Die Verkäufernummer in der Relation
VerkaeuferProdukt2NFist ein eindrucksvolles Beispiel. Die logische Folgerung ist nun, all
diese weiteren Abhängigkeiten (Pfeile) zu verbieten. Und genau dies ist die Kernaussage
der dritten Normalform nach Boyce und Codd. Este año 1974 en Codd (1974) vorgestellte
Normalform ist einfacher zu handhaben als die ursprüngliche Definición von E. F. Codd.
La definición original sigue im nächsten Abschnitt.

IDefinición: DeterminanteunoDeterminante ist ein (eventuell zusammengesetztes)


Attribut, von dem ein other voll funktional abhängt.

Esta definición se basa en todos los atributos de cada uno de ellos, y también en el
Determinante bezeichnet. En el segundo formato normal también se tiene en cuenta el
Primärschlüssel un determinante. Die dritte Normalform geht einen Schritt weiter:

IDefinición: Dritte Normalformnach Boyce-CoddEine normalisierte Relation ist in der


forma normal dritten , wenn jede Determinante dieser Relation ein Schlüsselkandidat ist.

Esta definición sagt aus, dass es außer Schlüsselkandidaten keine Determinanten gibt. Oder
gleichbedeutend, dasstodos ¡Doppelpfeile bei den Schlüsselkandidaten starten!
Esta definición no está disponible en la definición de la segunda forma normal.
Trotzdem gilt, dass sich jede Relation in der dritten Normalform auch in der zweiten
Normalform befindet. Dies ist leicht einsichtig. Cuando las dos formas normales no se
modifican, el doble de la forma original debe tenerse en cuenta cuando existan atributos,
y forder la forma normal, dos veces con los Schlüsseln alternativos y también las dobles.

Es ist klar, dass sich unsere RelaciónVerkaeuferProductonicht in der dritten Normalform


befindet, sie ist ja nicht einmal in der zweiten. Aber auch unsere RelaciónVerkaeufer-
Produkt2NFerfüllt die Bedingungen der dritten Normalform nicht. Aus Abb.3.1können wir
direkt die Determinanten ablesen. Este es el siguiente:
66 3 Diseño de banco de datos

nº Schlüsselkandidat!
VerkNr
(VerkNr, Nombre del producto) Schlüsselkandidat!

Wir sehen sofort, dass die Verkäufernummer zwar eine Determinante ist, jedoch kein
Schlüsselkandidat. ¡La relación no está en la forma normal escrita! Es lässt sich beweisen, dass
jede Relation von der dosweiten in die dritte Normalform überführt werden kann. Dazu wird
die Abhängigkeit, die nicht von einem Schlüsselkandidat ausgeht, in eine eigene Relation
ausgelagert. Wir wollen dies an unserem Beispiel demonstrieren und unsere Relation
VerkaeuferProductoin die dritte Normalform überführen. Dazu zerlegen wir diese in
mindestens doswei, besser noch in drei neue Relationen. Una solch óptima Zerlegung wird en
Tab.3.3,3.4y3.5vorgestellt. Beachten Sie bitte, dass jede estas tres nuevas relaciones en sich
redundanzfrei ist.
La relación ursprünglicheVerkaeuferProductoist zur RelaciónVerknuepfung
geschrumpft. Alle Verkäuferattribute wurden bis auf die DeterminanteVerkNrentfernt und
in einer eigenen RelaciónVerkáeuferaufgenommen. El DeterminanteVerkNrist hier der
neue Primärschlüssel. Wir übertragen alle Verkäuferdaten nur einmal in diese Relation.
Estas verfahren kann für beliebige Relationen angewendet werden.
In unserer Zerlegung gingen wir noch einen Schritt weiter. Häufig benötigen wir zu
Produkten noch Eigenschaften, etwa den Preis oder die Farbe. Esto lo podemos encontrar en la
relaciónVerknüpfungnicht mit aufnehmen, ohne sofort wieder die dritte Normalform zu

Pestaña. 3.3Relación Verkaeufer

VerkNr VerkNombre Por favor VerkAdresse


V1 Meier 80331 Múnich
V2 Schneider 70173 Stuttgart
V3 Müller 50667 Colonia

Pestaña. 3.4 Relación Producto

ProdNr Nombre del producto

P1 lavadora
P2 Rebaño

P3 Kühlschrank
P4 Staubsauger

Pestaña. 3.5 Relación Verknuepfung

VerkNr ProdNr umsatz


V1 P1 11000
V1 P2 5000
V1 P3 1000
V2 P2 4000
V2 P3 3000
V3 P4 1000
3.1 Formas normales 67

verletzen. Wir lagern daher auch die Produktdaten in eine eigene RelationProductoaus und
führen eine Produktnummer ein, die wir in der RelationVerknuepfungbelassen.
¡A propósito de la forma normal! Todas las tres nuevas relaciones están en la forma normal
escrita. Der Beweis sei als Übung empfohlen. Dazu müssen wir nur alle Schlüsselkandidaten
und Determinanten bestimmen. Wir sehen dann, dass tatsächlich alle Determinanten
Schlüsselkandidaten sind.
Estas tres nuevas relaciones sind in sich redundanzfrei. Sind die Verkäufer fleißig, so wird
sich nur die kleine RelationVerknuepfungvergrößern.Wir können jederzeit Produkte und
Verkäufer hinzufügen. Auch die Verkäuferdaten lassen sich problemlos ändern. También
reducimos con la forma normal seca la redundancia y verbessern gleichzeitig die Handhabung.
Es sollte das erklärte Ziel jedes Datenbankdesigners sein, seine Relationen so zu entwerfen,
dass sie in dritter Normalform sind. Die folgende Aussage bekräftigt die noch.

I Die dritte Normalform beseitigt alle Redundanzen außerhalb der


Schlüsselkandidaten.

Als Übung sei empfohlen, die Normalformen aller Relationen der Beispieldatenbank
Bicicletaim Anhang zu bestimmen. Wir weisen darauf hin, dass die DatenbankBicicletamit
Absicht so entworfen wurde, dass nicht alle Relationen in der dritten Normalform sind.
Überführen Sie gegebenenfalls Relationen in die dritte Normalform.

3.1.5 Dritte Normalform nach Codd

Die dritte Normalform von Boyce und Codd ist aus praktischer Sicht optima: Sie ist einfach
zu handhaben und beseitigt Redundanzen. Die Normalformenlehre wäre also eigentlich
abgeschlossen. Para las personas que les interesen, se añadirán otras formas normales a
cada caso.
Die ursprünglich von E. F. Codd bereits 1970 definierte dritte Normalform ist etwas
schwerfällig. Este texto original en formato normal nach Codd geht vom Begriff der transitiven
Abhängigkeit aus. Betrachten wir dazu die RelaciónVerkáeufertambién Tab.3.3und erweitern
diese um das AttributEstado federado. Wir erhalten die RelaciónVerkaeuferLand también Tab.
3.6.
Die vollen funktionalen Abhängigkeiten this Relation sind in Abb.3.2eingetragen. Hinzu
gekommen ist gegenüber der RelationVerkáeuferdie Abhängigkeit des Bundes-

Pestaña. 3.6Relación VerkaeuferLand

VerkNr VerkNombre Por favor VerkAdresse Estado federado

V1 Meier 80331 Múnich bávaro


V2 Schneider 70173 Stuttgart Baden-Wurtemberg
V3 Müller 50667 Colonia Renania del Norte-Westfalen
68 3 Diseño de banco de datos

Tejido. 3.2Funktionale
VerkNombre
Abhängigkeiten in der
VerkNr Estado federado
Relation VerkaeuferLand
VerkAdresse

Por favor

landes von der Postleitzahl! Aus der Abbildung erkennen wir direkt, dass es vom
PrimärschlüsselVerkNrhin zum Bundesland dos wege gibt, einen direkten und einen über
die Postleitzahl.
Wir sprechen allgemein von un transitiven Abhängigkeit oder Transitivität, wenn un
Attribut von einem other Attribut über den Umweg eines dritten Nichtschlüssel-Attributs
abhängig ist. Ein Nichtschlüssel-Attribut ist ein Attribut, das nicht Schlüsselkandidat ist. El
Bundesland es demnach zum einen direkt, zum anderen aber auch transitiv über die
Postleitzahl abhängig vom Primärschlüssel.

IDefinición: Abhängigkeit transitivoUn atributoYuna relaciónRheisstabhängig


transitivo atributo vomXRelación derselben, wenn ein Nichtschlüssel-Attributz
existente, tan dorado:
El atributozcolgar voll funktional vom AttributXy el atributoYvoll funcional del
atributo Z ab, kurz:X ) Z ) Y .

La definición original de la forma normal dritten verbietet diese Transitivitäten. Sie lau-
tet:

IDefinición: Dritte Normalform nach CoddUna relación está en elforma normal dritten (nach
Codd), wenn sie sich in der dos Weiten Normalform befindet und jedes Nichtschlüsselattribut
nicht transitiv vom Primärschlüssel abhängt.

Jede Relation in der dritten Normalform nach Boyce y Codd erfüllt auch diese
Bedingung der dritten Normalform. Dies ist ganz einfach zu beweisen: Jede
vorkommende Transitivität bedeutet, dass es Determinanten gibt, die nicht
Schlüsselkandidaten sind. En la forma normal escrita tras Boyce y Codd sind aber alle
Determinanten verboten, die von Nichtschlüsselattributen ausgehen. Transitivitäten
können also in einer Relation nicht vorkommen, die in der dritten Normalform nach
Boyce und Codd sind. También hay estas relaciones en la forma normal escrita en Codd.
Das Umgekehrte gilt allerdings no. Es gibt tatsächlich Relationen, die in der dritten
Normalform nach Codd, nicht aber nach Boyce und Codd sind. Dem interessierten Leser sei
empfohlen, eine solche Relation anzugeben. Dies ist allerdings nicht einfach. Folgende Aussage
zeigt nämlich die Ähnlichkeit beider Normalformen auf:

I Besitzt eine Relation nur nicht zusammengesetzte Schlüsselkandidaten, so sind die


beiden Definiciones der dritten Normalform gleichwertig.
3.1 Formas normales 69

Noch präziser gilt, dass sich die beiden dritten Normalformen höchstens dann
unterscheiden, wenn die Relation mindestens dos Schlüsselkandidaten besitzt, die aus
zusammengesetzten Attributen bestehen und sich in mindestens einem Attribut überlappen.
Wir müssen also entsprechende Relationen betrachten, um Unterschiede in den Normalformen
zu finden.
Unsere Empfehlung ist eindeutig: Wir verwenden die dritte Normalform nach
Boyce und Codd. Esto es fácil de usar y podemos utilizarlo en todas las condiciones
necesarias para la transición. Cuando somos seguidores de la escritura en forma
normal, está en la forma normal entre Boyce y Codd gemeint.

3.1.6 Vuelta en forma normal

In einem Merksatz erwähnten wir, dass die dritte Normalform die Redundanzen außerhalb von
Schlüsselkandidaten beseitigt. Wir müssen daher nur Relationen mit möglichst einfachen
Schlüsselkandidaten konstruieren. Schon sind unsere Relationen optimas. Umgekehrt bereiten
Relationen mit komplexen Schlüsseln oft erhebliche Probleme. Primera definición dervierten y
fünften forma normal verbessern auch diese Relationen. In der Praxis spielen estas formas
normales aber fast keine Rolle.
Grundsätzliches Ziel beim Datenbankdesign sollte es sein, die Primärschlüssel und
weitere Alternative Schlüssel nicht oder nur soweit wie nötig aus mehreren Attributen
zusammenzusetzen. Auch das im Abschn.3.2vorgestellte Entity-Relationship-Modell lässt
komplex zusammengesetzte Primärschlüssel kaum entstehen. Wir erinnern an den
Merksatz, dass bereits die dritte Normalform alle Redundanzen außerhalb der
Schlüsselkandidaten beseitigt.
Im Datenbankdesign ist es hilfreich, die höheren Normalformen zumindest zu kennen. Wir
illustrieren dies an einem Negativbeispiel und trachten wieder unsere Relation
VerkaeuferProductotambién Tab.3.1. Wir nehmen jetzt an, dass ein Verkäufer durch die drei
AttributeVerkNombre,Por favoryVerkAdresseeindeutig festgelegt sei. Dies können wir
akzeptieren, wenn wir die Adresse um die Straße und die Hausnummer ergänzen und bei
Namensgleichheiten den Vornamen und gegebenenfalls den Zusatzsénioryjúnioroder den
dosweiten Vornamen hinzufügen. Entfernen wir nun aus dieser Relation das Attribut VerkNr,
así que busque esta nueva relación en forma normal. Der Primärschlüssel esta relación
VerkaeuferProdukt3NFtambién Tab.3.7Besteht aus den ersten vier Attributen VerkNombre,Por
favor,VerkAdresseyNombre del producto. Aus Übersichtsgründen wurden Straße und
Hausnummer in Tab.3.7nicht mit aufgeführt.
Esta relaciónVerkaeuferProdukt3NF kann nicht befriedigen. Die Redundanzen sind
erheblich, jedes Ändern der Adresse eines Verkäufers führt zu mehrfachen Änderungen in der
Relation. Auch die Handhabung ist wegen der ersten Integritätsregel problematisch: Ist etwa
zu einem neuen Verkäufer seine Postleitzahl noch nicht bekannt, so kann dieser nicht, auch
nicht teilweise, eingetragen werden! Esta relación es incompatible con la realidad.
70 3 Diseño de banco de datos

Pestaña. 3.7 VerkaeuferProdukt3NF

VerkNombre Por favor VerkAdresse Nombre del producto umsatz


Meier 80331 Múnich lavadora 11000
Meier 80331 Múnich Rebaño 5000
Meier 80331 Múnich Kühlschrank 1000
Schneider 70173 Stuttgart Rebaño 4000
Schneider 70173 Stuttgart Kühlschrank 3000
Müller 50667 Colonia Staubsauger 1000

dritter Normalform, da es nur eine volle funktionale Abhängigkeit vom Primärschlüssel


zum Umsatz gibt!
Dieses Beispiel schreckt ab. Aber der Datenbankdesigner darf nun einmal seine
Relationen und dazugehörigen Primärschlüssel frei wählen. Das Design einer Datenbank
ist aber nicht nur Kunst sondern vor allem Wissenschaft. El diseñador solo daher
unbedingt die vorgestellten Normalformen und Merksätze befolgen. Una relación
VerkaeuferProdukt3NFwird ihm dann nicht im Traum einfallen.
Die Redundanzen internalhalb der Schlüsselkandidaten beseitigen erst die höheren
Normalformen. Comenzamos con la conversión a formato normal. Es ist kaum zu glauben, aber
die Relation aus Tab.3.7¡Erfüllt sogar die Bedingungen der vierten Normalform! Es muss also
noch „schlechtere“ Relationen geben, Relationen, die in dritter Normalform, aber nicht in
vierter Normalform sind. Um dies zu zeigen fügen wir zur RelationVerknuepfungtambién Tab.
3.5el atributoKFZNrhinzu und entfernen das Attributumsatz. Soy nuevo atributo KFZNrwerden
alle Firmenfahrzeuge angegeben, die die Verkäufer benutzen. Sind dies für VerkäuferMeierdie
Fahrzeuge mit den KennzeichenME 515yMX 333, para el VerkäuferSchneidermorir FahrzeugeSH
654yKJ 123y para el VerkäuferMüllerdas FahrzeugKJ 123, entonces könnten wir die Relation
Verknuepfungüberführen en la relación VerkaeuferProduktKFZen la pestaña.3.8.

Pestaña. 3.8VerkaeuferProduktKFZ

VerkNr Nombre del producto KFZNr


1 lavadora ME 515
1 lavadora MX 333
1 Rebaño ME 515
1 Rebaño MX 333
1 Kühlschrank ME 515
1 Kühlschrank MX 333
2 Rebaño SH 654
2 Rebaño KJ 123
2 Kühlschrank SH 654
2 Kühlschrank KJ 123
3 Staubsauger KJ 123
3.1 Formas normales 71

Relación de matrizVerkaeuferProduktKFZEstá en forma normal, pero no existe


ninguna función funcional. Gleichzeitig bilden alle drei Attribute zusammen den
Primärschlüssel. Esta relación enthält viele redundanzen, da sie dos Abhängigkeiten
enthält, die Abhängigkeit des Verkäufers vom verkauften Produkt und die vom
Firmenwagen. El producto y el vehículo no están autorizados. Wir sprechen hier von
einer mehrwertigen Abhängigkeit.

IDefinición: Mehrwertige AbhängigkeitUn atributoYuna relación es por un


atributoXrelación diesermehrwertig abhängig (X-Y),wenn ein weiteres Atributoz
Esta relación existe con la relación propia:

- EinY-Attributwert hängt vom dazugehörigen.X; Z/-Par bereits allein eindeutig vom X


-Wert ab und ist unabhängig vomz-Atributo.
- El atributoXEs mínimo.

En la relación con la pestaña.3.8dorado:X=NºVerk,Y=Nombre del productoyZ=KFZNr.


Nehmen wir das ProduktKühlschrank. Verkäufer 1 y 2 han ben Kühlschränke verkauft, aber
diese Abhängigkeit gilt unabhängig vom Fahrzeug! Dies gilt in der Relation für jedes Produkt.
Damit ist der Produktname mehrwertig abhängig von der Verkäufernummer. Aus
Symmetriegründen ist auch das KFZ-Kennzeichen mehrwertig von der Verkäufernummer
abhängig. Hemos hablado:
VerkNr-Nombre del producto

VerkNr-KZFNr
Die Ursache einer mehrwertigen Abhängigkeit liegt im gleichzeitigen Speichern dos
abhängiger funktionaler Abhängigkeiten in ainer Relation. Dies wird direkt ersichtlich,
wenn wir die Atomarität aufgeben. Wir erhalten dann die sehr übersichtliche Tab.3.9.
Esta tabla no está en forma normal anterior. Werden daher einen anderen Weg
einschlagen. Estas definiciones se traducirán en la forma normal:

IDefinición: Forma Normal VueltaEine normalisierte Relation ist in dernormal normal -


forma , cuando jeder mehrwertigen AbhängigkeitX-Yseguir, dassXein Schlüsselkandidat
ist.

La definición no es la misma forma normal que Boyce y Codd. Esto es ofensivo, cuando
tenemos unas características superiores, dass jede funktionale Abhängigkeit auch eine
mehrwertige ist. Setzen wir nämlich in der Definición der mehrwertigen Abhängigkeit das

Pestaña. 3.9Nicht atomare Relation VerkaeuferProduktKFZ

VerkNr Nombre del producto KFZNr


1 Lavadora, Manada, Kühlschrank ME 515, MX 333
2 Rebaño, Kühlschrank SH 654, KJ 123
3 Staubsauger KJ 123
72 3 Diseño de banco de datos

Atributozals das leere Attribut an, so folgt die eindeutige Abhängigkeit des AttributsY vonX,
también la función funcional Abhängigkeit. Die vierte Normalform besagt also, dass nur von
Schlüsselkandidaten Pfeile ausgehen dürfen, seien es voll funktionale oder mehrwertige.
Relación de matrizVerkaeuferProduktKFZtambién Tab.3.8ist nicht in der vierten
Normalform, da sie dos mehrwertige Abhängigkeiten enthält. Pestaña Matriz.3.9gibt uns
wertvolle Hinweise, wie wir diese Relation in die vierte Normalform überführen können: Wir
betrachten die beiden funktionalen Abhängigkeiten getrennt und zerlegen diese in die beiden
Relationen VerkaeuferNombre del productoyVerkaeuferKFZen la pestaña.3.10y3.11.
Además de las nuevas relaciones, se cambia la forma normal y se transmiten según la relación.
VerkaeuferNombre del producto‰VerkaueferKFZsofort wieder in die ursprüngliche Relación
VerkaeuferProduktKFZüberführen.
Dieses Beispiel zeigt, dass es eigentlich ganz einfach ist, gute Relationen zu erzeugen. Die
Schwierigkeiten liegen jedoch im Detail. Wir möchten nicht weiter in die Problematik der
vierten Normalform eindringen, aber mit einem kleinen Zusatzbeispiel Interesse wecken.
Nehmen wir an, die Firmenleitung möchte im Detail wissen, welcher Verkäufer wie viele
Kilometer mit welchem Fahrzeug jährlich unterwegs ist. Möchte die Leitung dies auch
produktspezifisch wissen, so benötigen wir tatsächlich eine Relation der Form aus Tab.3.12.

Es sei als Übung empfohlen, über den inhaltlichen Aufbau und insbesondere über den
Primärschlüssel, die funktionalen and mehrwertigen Abhängigkeiten und die Normalform

Pestaña. 3.10VerkaeuferNombre del producto

VerkNr Nombre del producto

1 lavadora
1 Rebaño

1 Kühlschrank
2 Rebaño

2 Kühlschrank
3 Staubsauger

Pestaña. 3.11 VerkaeuferKFZ

VerkNr KFZNr
1 ME 515
1 MX 333
2 SH 654
2 KJ 123
3 KJ 123

Pestaña. 3.12 Erweiterung von VerkaeuferProduktKFZ

VerkNr Nombre del producto KFZNr Año km


… … … … …
3.1 Formas normales 73

esta nueva relación nachzudenken. Zur Vertiefung sei insbesondere Elmasri und Navathe
(2002) empfohlen, aber auch Fecha (2003) y Meier (2010).

3.1.7 Función de forma normal

Bis zur vierten Normalform werden logische Abhängigkeiten berücksichtigt. Es gibt aber
oft auch interna Abhängigkeiten, die beispielsweise sogar nur in einer Firma gelten, etwa
spezielle Regeln zu Arbeitszeiten. Estos estudiantes practicantes juegan un rollo en la
forma normal. Es ist dabei teilweise extrem schwer zu erkennen, ob eine Relation in
fünfter Normalform ist oder nicht. Es kann sogar sein, dass die gleiche Relation in der
einen Datenbank in der fünften Normalform ist, in der anderen bei einer anderen Firma
aber nicht! Die fünfte Normalform juega rápido sin rollo. Estas abstenciones pueden dar
lugar también a excesos.
Wir setzen unser Beispiel aus dem letzten Abschnitt fort und betrachten die Relation
VerkaeuferProduktKFZtambién Tab.3.8. Nehmen wir jetzt an, dass in den Fahrzeugen mit den
Kennzeichen M-X 333 und K-J 123 wegen fehlender Spezialverankerungen keine Kühlschränke
und Waschmaschinen transportieren werden dürfen. Setzen wir dies in unserer Relation um, so
erhalten wir die neue RelationVerkaeuferProduktKFZ4NFen la pestaña.3.13.
Esta relación está tatsächlich in vierter Normalform, da es auch Abhängigkeiten zwischen
den AttributenNombre del productoyKFZNrregalo. Somit existieren keine mehrwertigen
Abhängigkeiten mehr. Eine Zerlegung in die beiden RelationenVerkaeuferNombre del producto
en la pestaña.3.10yVerkaeuferKFZen la pestaña.3.11ist nicht möglich, da dadurch
Informationen verloren gehen würden. Der Verbund dieser beiden Relationen liefert ja die
Relation VerkaeuferProduktKFZy nocheVerkaeuferProduktKFZ4NF.
Relación de matrizVerkaeuferProduktKFZ4NFbefriedigt aber nicht. Sie enthält weiter
Redundanzen und auch Lösch- und Einfügeanomalien. Wollen wir beispielsweise die Zeile (1,
Rebaño, ME 515)en la pestaña.3.13löschen, so müssen wir auch die Zeile(1, Rebaño, M-X 333)
¡mit entfernen! Schließlich können Herde mit beiden Fahrzeugen geliefert werden. Umgekehrt
dürften wir die Zeile(1, Rebaño, M-X 333)für sich allein löschen, falls Verkäufer 1 das Fahrzeug
MX 333ab sofort nicht mehr benutzt.

Pestaña. 3.13VerkaeuferProduktKFZ4NF

VerkNr Nombre del producto KFZNr


1 lavadora ME 515
1 Rebaño ME 515
1 Rebaño MX 333
1 Kühlschrank ME 515
2 Rebaño SH 654
2 Rebaño KJ 123
2 Kühlschrank SH 654
3 Staubsauger KJ 123
74 3 Diseño de banco de datos

Bisher no podrá mantener ninguna relación óptima en dos relaciones diferentes.


Durch einen Verbund dieser Zerlegungen erhielten wir wieder die Originalrelation. Wir
nennen dies eine Verbundabhängigkeit. Besonders eindrucksvoll sehen wir dies an der
RelationVerkaeuferProduktKFZtambién Tab.3.8, morir en las relacionesNombre del
producto VerkaeuferyVerkaeuferKFZen la pestaña.3.10y Tab.3.11zerlegt wurde. Ein
Verbund der letzten beiden Relationen führt zurück zur Originalrelation. Die hier
vorliegende Verbundabhängigkeit heißtnicht trivial , da die beiden Zerlegungen
unterschiedliche Primärschlüssel besitzen.
Wir können trivial jede Relation mit mehreren Nichtschlüsselattributen zerlegen: Wir
nehmen den Primärschlüssel und nacheinander je einen Nichtschlüssel. Schon haben wir
viele Zerlegungen, die dann mittels eines Verbunds wieder zur ursprünglichen Relation
führen. Betrachten wir dazu die RelaciónVerkáeufertambién Tab.3.3. Wir können this
Relation in die Teilrelationen(VerkNr, VerkName),(VerkNr, VerkAdresse)y(VerkNr, PLZ)
zerlegen. Este triviale Zerlegung macht aber wenig Sinn. Wir kommen daher zu folgender
Definición:

IDefinición: VerbundabhängigkeitUna relaciónRbesitzt eineVerbundabhängigkeit , wenn


sie nicht trivial in Teilrelationen zerlegt werden kann, so dass der Verbund dieser
Teilrelationen wieder die RelationRergibt.
Nicht trivial heißt, dass die Teilrelationen jeweils unterschiedliche Primärschlüssel besitzen.

Nehmen wir die relacionale Algebra zu Hilfe, so heißt dies, dass es nicht triviale Projektionen
der RelationRgibt, so dass der Verbund dieser Projektionen wieder die Relation Rliefert. Para la
relaciónVerkaeuferProduktKFZbeispielsweise dorado:

VerkaeuferProduktKFZ
D -VerkNr;Nombre del producto.VerkaeuferProduktKFZ/

‰ -VerkNr;KFZNr.VerkaeuferProduktKFZ/

Este problema de Verbundabhängigkeiten se encuentra. Gleichzeitig zeigen sie aber auch


auf, dass es sinnvolle und nicht triviale Zerlegungen gibt. Relationen, die entsprechend zerlegt
werden können, sind daher nicht in höchster Normalform und sollten auch zerschlagen
werden:

IDefinición: forma normal FünfteUna relación está en elfünften forma normal , wenn sie in der
vierten Normalform ist und keine Verbundabhängigkeiten besitzt.

Relación inseguraVerkaeuferProduktKFZ4NFNo es óptimo. Sie kann aber nicht in dos


Relationen zerlegt werden, so dass der Verbund wieder die Originalrelation liefert. Gleichzeitig
vermuten wir aber, dass sich diese Relation nicht in der fünften Normalform befindet. Jetzt hilft
uns folgende Información adicional:
3.1 Formas normales 75

I Ist eine Relation in der vierten Normalform, nicht aber in der fünften, so werden
mindestensdrei Teilrelationen zum Zerlegen benötigt.

In unserem Beispiel der RelationVerkaeuferProduktKFZ4NFist die dritte Zerlegung die


RelationProductoKFZtambién Tab.3.14, die angibt, welche Produkte mit welchen Fahrzeugen
transportiert werden. Es monja dorada tatsächlich:

VerkaeuferProduktKFZ4NF
D -VerkNr;Nombre del producto.VerkaeuferProduktKFZ4NF/

‰ -VerkNr;KFZNr.VerkaeuferProduktKFZ4NF/ ‰ -Nombre

del producto;KFZNr.VerkaeuferProduktKFZ4NF/

Der erste Verbund liefert die RelationVerkaeuferProduktKFZ. Der zweite Verbund


entfernt dann die drei Tupel zu den Fahrzeugen, die nicht erlaubt sind. Relación de matriz
VerkaeuferProduktKFZ4NFbesitzt also eine Verbundabhängigkeit, ist damit nicht in der
fünften Normalform und sollte in die tres angegebenen Relationen zerlegt werden. Die
dritte ZerlegungProductoKFZist aber noch nicht óptimo. Sie sollte alle
Transportmöglichkeiten enthalten. Diese Ergänzung sei als Übung empfohlen.
Die fünfte Normalform ist kaum praxistauglich. Es erweist sich in komplexen Relationen als
enorme schwierig zu erkennen, ob nicht triviale Verbundabhängigkeiten vorliegen oder nicht.
Grundsätzlich sollten wir versuchen, Schlüsselkandidaten und insbesondere Primärschlüssel
einfach zu gestalten. Wir kommen dann nicht in die hier vorgestellten Problemfälle. Es dorado:

I Relationen, die nicht inder viertenoder fünftenNormalformsind, sindentweder


auchnicht inder drittenNormalformoder besitzen Schlüsselkandidaten, die aus
mindestens drei Einzelattributen bestehen.
Besitzt eine Relation nur nicht zusammengesetzte Schlüsselkandidaten, so fallen
die beiden Definiciónen der dritten und die der vierten und fünften Normalform
zusammen!

Pestaña. 3.14ProductoKFZ

Nombre del producto KFZNr


lavadora ME 515
Rebaño ME 515
Rebaño MX 333
Rebaño SH 654
Rebaño KJ 123
Kühlschrank ME 515
Kühlschrank SH 654
Staubsauger KJ 123
76 3 Diseño de banco de datos

Zum Abschluss sei noch auf eine Besonderheit bisagrawiesen. Das Zerlegen der Relación
VerkaeuferProduktKFZ(Pestaña.3.8) en las relacionesVerkaeuferNombre del producto(Pestaña.
3.10) yVerkaeuferKFZ(Pestaña.3.11) erfolgte mittels einer Projektion. Der Verbund dieser
beiden neuen Relationen führt zurück zur ursprünglichen RelationVerkaeuferProduktKFZ. ¡Esta
mehrwertige Abhängigkeit también es una Verbundabhängigkeit! Dies gilt ganz allgemein, und
wir vermerken ohne Beweis:

I Una de todas las funciones de Abhängigkeit es también una Abhängigkeit mejor.


UndeinemehrwertigeAbhängigkeit ist immer auch eine Verbundabhängigkeit.
Oder umgekehrt: In der Verbundabhängigkeit ist die mehrwertige Abhängigkeit
enthalten. Und in der wehrwertigen Abhängigkeit ist die volle funktionale
Abhängigkeit enthalten.

La definición de la forma normal fünften está en un completo complejo de detalles. Para que les
interese leer más sobre Elmasri y Navathe (2002) empfohlen, ebenso Fecha (2003).

3.1.8 Cierre de cuentas

Die Normalformenlehre spielt eine enorme wichtige Rolle beim Entwurf von Datenbanken. Als
Faustregel gilt, dass jede Relation mindestens in die zweite Normalform überführt werden
sollte. Wirklich wünschenswert ist aber die dritte Normalform. Heer ist wegen der einfachen
Handhabung die Normalform nach Boyce und Codd zu empfehlen. Die noch höheren
Normalformen spielen in der Praxis höchstens in Einzelfällen eine Rolle. Ein gutes Design wird
es zu diesen Spezialfällen gar nicht kommen lassen.
Wir wollen no verschweigen, dass wir die dritte und höhere Normalform nur
erreichen, wenn wir Relationen der dos Weiten Normalform zerschlagen. Dies
erhöht in der Praxis die Anzahl der Verbundabfragen und führt zu langeren
Laufzeiten. Es posible utilizar estos tonos de rendimiento en la forma normal escrita.
Ein Datenbankdesigner muss daher die Für und Wider genau abwägen. Werden en
Kap.7näher darauf eingehen.
Para el diseñador de Datenbank es wichtig, dass ertodos Schlüsselkandidaten undtodos
Funcionalmente Abhängigkeiten kennt. Damit weiß er um die Güte seiner Relationen und kann
gegebenenfalls für Abhilfe schaffen. Oberstes Gebot ist es, einfache und leicht verständliche
Relationen zu entwerfen. Damit werden pathologische Fälle verhindert, wie etwa große
zusammengesetzte oder sich überlappende Schlüssel.

3.2 Modelo Entidad-Relación

Zum Design einer kompletten Datenbank gehört das Erstellen vieler Relationen. Über
einzelne Relationen haben wir bereits umfassend im letzten Abschnitt gesprochen. Guta
3.2 Modelo Entidad-Relación 77

Handhabung und minimale Redundanz waren die Ziele bei den Normalformen. Dies bleibt aber
auch unser Ziel beim Aufbau großer Datenbanken mit hundten von Relationen. Wir wollen,
dass eine von uns erzeugte Datenbank gut anwendbar und bis auf die Beziehungen zwischen
Primär- und Fremdschlüssel redundanzfrei ist.
Der Entwurf einer komplett neuen Datenbank ist nicht trivial, vor allem bei vielen
Relationen. Werden daher für diesen Entwurf dasModelo entidad-relación , kurz ERM
genannt, verwenden. Este modelo fue creado por P. P. Chen vorgestellt (1976) y hat sich
in der Praxis nicht nur bei Datenbanken vielfach bewährt. La normalización de las
relaciones se basa en la redundancia interna de una relación. El modelo entidad-relación
impide la redundancia bis auf Fremdschlüssel auch über die Grenzen einzelner Relationen
hinweg.

3.2.1 Entidades

El nombreRelación entre entidadesweist auf Entitäten und Beziehungen hin. Es handelt sich um
Begriffe, die wir zum Erstellen von relacionaalen Datenbanken benötigen. Darüber hinaus verwenden
wir weitere Bezeichnungen und Definiciónen, um Daten und Gegebenheiten der realen Welt mit Hilfe
des Entity-Relationship-Modells in eine Datenbank zu konvertieren. Los códigos de barras que
aparecen en la pestaña se muestran en la pestaña.3.15vor.
Wir wollen this Begriffe aus Tab.3.15vertiefen. En la pestaña.3.16geben wir daher zu
jedem Begriff Beispiele an.
Wir bezeichnen alle eindeutig identifizierbaren Objekte alsentidades , egal ob diese real als
Personen vor uns stehen oder nur als Rechnungen auf einem Blatt Papier oder sogar nur
elektronisch existieren. Objekte besitzen in der Regel Eigenschaften: Eine Person hat einen
Namen, ein Produkt einen Preis und vielleicht ein Verfallsdatum, und eine Rechnung hat ein
Datum und eine Rechnungsanschrift. Objekte stehen nicht für sich allein: Eine Person verkauft
als Verkäufer Produkte. Nach dem Verkauf wird eine Rechnung erstellt. Damit stehen diese
Entitäten zueinander in ainerBeziehung .

Pestaña. 3.15Begriffe zum Datenbankdesign

Un objeto único y un elemento único


entidad

Eigenschaft Ein Teil einer Entität, der die Entität beschreibt


Eine Entität, die dos oder mehr Entitäten miteinander
Beziehung
verknüpft
Una entidad, die ein teil einer anderen, umfassenderen
Subtipo
entität ist
supertipo Eine Entität, die Subtypen besitzt
Entität, die von einer other Entität vollständig abhängig
Entidad Schwache
ist
78 3 Diseño de banco de datos

Pestaña. 3.16 Beispiele zu den Begriffen zum Datenbankentwurf

begriff Beispiele
entidad Persona, Werkzeug, Produkt, Rechnung
Nombre, Vorname, PLZ, Ort einer Person; Größe,
Eigenschaft
Gewicht eines Werkzeugs; Preis eines Produkts
Las entidadesVerkäuferyProductostehen miteinander in
Beziehung
einer Beziehung: Verkäufer verkaufen Produkte.
Subtipo La entidadVerkäuferist un subtipo zuMitarbeiter
supertipo La entidadMitarbeiteres un supertipo deVerkäufer
La entidadTiempo de gobiernoist schwach gegenüber der
Entidad Schwache
EntitätMitarbeiter

In einer großen Firma gibt es viele Sekretärinnen, Kaufleute, Informatiker oder Verkäufer.
Todos estos grupos de gesamten Mitarbeiterstabs sindSubtipo . Umfasst die EntitätMitarbeiter
alle Beschäftigten, so ist dies einsupertipo estos grupos de teil. Wird die tägliche Arbeitsdauer
der Mitarbeiter in der EntitätTiempo de gobiernoerfasst, so sind diese Einträge ohne dazu
passende Mitarbeiter sinnlos, diese Entität heißt daherschwarz gegenüber der Entität
Mitarbeiter.
Tejido.3.3zeigt uns den Zusammenhang zwischen Entitäten und Eigenschaften. La entidad
Personabesitzt bestimmte Eigenschaften wieNombre,Gehalt,direcciónodernúmeropersonal.
Estas características propias pueden ser desconocidas, como aquí la dirección y el nombre. Zur
Unterscheidung markieren wir Entitäten als Rechtecke und Eigenschaften als Ellipsen

Dies ist ein relativ einfaches Beispiel, so dass es uns nicht schwer fall wird, diese
EigenschaftenGehalt,dirección,Nombreypersonael objetoPersonazuzuordnen. In großen
Datenbanken kann schnell die Übersicht verloren gehen, so dass wir systematisch vorgehen
sollten. Natürlich hilft auch die Erfahrung, um die Entitäten und die Zuordnung der
Eigenschaften zu diesen Entitäten schnell zu erkennen. Grundvoraussetzung ist jedoch,

Persona

Gehalt dirección persona Nombre

Por favor nº nombre de usuario Zuname

Ort calle
entidad

Eigenschaft

Tejido. 3.3Beispiel zu Entitäten und Eigenschaften


3.2 Modelo Entidad-Relación 79

Tejido. 3.4Abkürzende
Schreibweise zu Entitäten und Persona

Eigenschaften Gehalt
Por favor

Ort
calle

persona
nombre de usuario

Nachname entidad

dass der Datenbankdesigner das nachzubildende Umfeld genauestens kennen muss, bevor er
die dazugehörige Datenbank entwirft.
Tejido.3.3zeigt weiter, dass uns mit dieser Darstellung in großen Datenbanken mit vielen
Entitäten schnell der Platz ausgeht. Angelehnt an die Darstellung von Objekten in UML (Unified
Modeling Language) werden daher häufig gleich die Eigenschaften mit in die Entität
aufgenommen, siehe Abb.3.4
Wir wollen jetzt an Hand eines Beispiels Beziehungen kennen lernen: Es existiere neben der
obigen EntitätPersonauna entidadAbteilung, in der alle Daten zu den einzelnen Abteilungen
abgespeichert sind. Es gibt dann eine Beziehung zwischen den Personen der EntitätPersonay la
entidadAbteilung, wenn Personen jeweils einer Abteilung zugeordnet sind. Estas Beziehungen
zeichnen wir in unserem Entidad-Relación-Diagrama como Raute. Tejido.3.5zeigt ein
entsprechendes Diagramm, wobei aus Übersichtsgründen die einzelnen Eigenschaften der
EntitätenAbteilungyPersonanicht mit aufgeführt wurden. Die Zeichen 1 undmetroin der
Abbildung klassifizieren die Beziehung. In diesem Fall gehören in der Regel mehrere (metro)
Personen einer einzigen (1) Abteilung an.
No utilizamos estos diagramas como diagrama de entidad-relación y bezeichnen den
gesamten Modellierungsprozess como el modelo de entidad-relación o el ERM kurz. Este
modelo está incluido en las entidades y los cambios en el mismo lugar. Wir erkennen an
diesem Diagramm, dass die beiden EntitätenAbteilungyPersonaMittels einer sogenannten

Abteilung Abteilung

1 1
enthält
abgekürzt:
enthält metro

Persona
metro

Persona
Beziehung

Tejido. 3.5Beispiel einer Beziehungsrelation


80 3 Diseño de banco de datos

metrozu 1 Beziehung verknüpft sind. Als Abkürzung wird die Raute häufig weggelassen, der
Beziehungstext (aquí:enthält) sollte aber weiterhin angegeben werden.
Subtipo Sind spezielle Entitäten, die sich aufsupertipos beziehen. Als erstes Beispiel
haben wir in Tab.3.16la entidadVerkäuferaufgeführt. Esta entidad es una parte de la
entidadMitarbeiter, die alle Mitarbeiter einer Firma enthält. Diese Teilentitäten heißen
Subtyp and besitzen in der Regel spezielle zusätzliche Eigenschaften, die nur auf diesen
Subtyp zutreffen. Heer könnten es beispielsweise die Verkaufszahlen sein. Da diese
zusätzlichen Eigenschaften nicht auf die weiteren Mitarbeiter zutreffen, ist es sinnvoll,
dies in eigenen Subtypen auszulagern. Die umfassende Entität, aquíMitarbeiter, heißt
entsprechend Supertipo. Werden diese Entitäten ausführlich in Abschn.3.2.5behandeln.
Der letzte neue Begriff bezieht sich auf starke und schwache Entitäten. Wir bezeichnen
eine Entität alsschwarz , cuando esta entidad de otras entidades está abhängt, y zwar in
dem Sinne, dass sie ohne estas otras entidades no existen. Todas las otras entidades
entidades starke . Es ist in der Praxis nicht immer einfach zu erkennen, ob eine Entität
schwach ist oder nicht. Wir werden daher in Abschn.3.2.5noch ausführlich darauf
eingehen.
Ein anschauliches Beispiel zu schwachen und starken Entitäten liefert eine
Produktionsdatenbank, die unter anderem die EntitätenProducto,Einzelteilylista de fehler
enthält. Hier handelt es sich um die hergestellten Produkte, um die Einzelteile, aus denen
Produkte gefertigt werden, und eine Liste der bei der Produktion der einzelnen Produkte
aufgetretenen Fehler. Die beiden EntitätenEinzelteilylista de fehlerstehen somit in einer
Beziehung zur EntitätProducto. Sind alle denkbaren Fehler produktspezifisch, so hangt
the Entitätlista de fehlervoll von der EntitätProductoab. Wir bezeichnen sie als schwach
und zeichnen die Entität mit einer Doppellinie, siehe Abb.3.6. Wird etwa ein Produkt aus
der Produktion genommen, so sind die Fehlerdaten zu diesem Produkt wertlos. Einzelteile
bisagragen können für mehrere Produkte verwendet werden. Außerdem können
Einzelteile beispielsweise noch auf Lager vorrätig sein, auch wenn sie nicht mehr
gebraucht werden. La entidadEinzelteilist daher unabhängig vom der EntitätProductoy
folglich nicht schwach sondern stark.

Producto

unabhangig voll abhängig

Einzelteil lista de fehler Schwache


entidad

Tejido. 3.6Starke und schwache Entitäten


3.2 Modelo Entidad-Relación 81

Esta erste Überblick zeigt, wie wir beim Erstellen einer Datenbank mittels Entidad-
Relación vorgehen: In einem ersten Schritt ermitteln wir alle Entitäten und die
dazugehörigen Eigenschaften, die in der zu erstellenden Datenbank abgespeichert
werden sollen. Dies kann recht aufwendig sein, da es in einem größeren System nicht
einfach ist alle benötigten Eigenschaften zu ermitteln und zu isolieren. Meist ist this
Erstellprozess ein iterative Vorgang, der hofentlich schnell konvergiert. Zum Schluss
liegen dann alle Entitäten und deren Eigenschaften vollständig vor.
In Relationsalen Datenbanken wählen wir genau diese Entitäten als unsere Relationen
der neu zu schaffenden Datenbank. Bei einer sauberen Identifikation der Entitäten sind
dien geschaffenen Relationen meist bereits mindestens in der dritten Normalform. Wenn
nicht, sollten wir diese Relationen noch entsprechend transformieren. Zum Erzeugen
estas relaciones verwenden wir en SQL denCrear mesa-Befehl, siehe dazu auch Abschn.
5.1. Esta opción para la entidadPersonacomo sigue:

CREAR MESA Persona


( persona ENTERO,
nombre de usuario CARÁCTER(20),
Nachname CARÁCTER(20),
...
PRIMARIO CLAVE (Pers.)
);

Damit wäre der erste Schritt in der Entity-Relationship Modellierung abgeschlossen,


die Entitäten sind bestimmt. Im dos Schritt werden wir die Beziehungen (Relaciones)
zwischen den einzelnen Relationen ermitteln.

3.2.2 Cambios de posición

En Kap.2Haben wir gelernt, dass die Beziehungen zwischen den einzelnen Relationen durch
Fremdschlüssel hergestellt werden und diese Fremdschlüssel auch als der Kitt einer Datenbank
bezeichnet werden. Ziel dieses Abschnitts ist es nun, genau diese Fremdschlüssel zu
identifizieren und zu erzeugen.
In einem ersten Schritt zeichnen wir alle Entitäten in unser Entity-Relation-Diagramm
ein. Im zweiten Schritt überlegen wir, in welcher Beziehung diese Entitäten untereinander
stehen. Als hilfreiches Muster dient Abb.3.5, in der die Beziehung zwischen den
Abteilungen und ihren Mitarbeitern aufgezeigt wird. Im Endausbau sollten in dem
Diagramm alle Entitäten jeweils mittels mindestens einer Beziehung miteinander
verknüpft sein. Schließlich wollen wir eine Datenbank entwerfen, und in der Definición
von Datenbanken in Kap.1hatten wir definiert, dass alle Daten in einer logischen
Beziehung zueinander stehen. En Summe hemos tenido un modelo de entidad-relación.
Wir hätten damit erfolgreich die zugrunde liegenden realen Gegebenheiten modelliert.
82 3 Diseño de banco de datos

Este modelo puede funcionar en un banco de datos relativo einfach en un banco de datos
relacional. Bevor wir dies aber im nächsten Abschnitt tun, sollten wir uns noch eingehend
mit den unterschiedlichen Arten von Beziehungen auseinander setzen.
Beziehungen zwischen den einzelnen Entitäten können vielfältig sein. Sie lassen sich aber
generell in drei Kategorien einteilen:

- 1 a 1 Beziehungen
- metrozu 1 (viele zu 1) Beziehungen
- metrozunorte(viele zu viele) Beziehungen

Eine 1 zu 1 Beziehung zwischen dos EntitätenAyBist gegeben, wenn jeder Eintrag inAcon
joyas einem Eintrag enBverknüpft ist und umgekehrt. beimetrozu 1 Beziehungen zwischenAyB
können darüber hinaus mehrere Einträge inAmit dem gleichen Eintrag inBen Verbindung
stehen. EnmetrozunorteBeziehungen gilt dies auch umgekehrt, so dass beliebig viele
mehrfache Zusammenhänge zwischen Einträgen der beiden Entitäten erlaubt sind.

Wir haben im letzten Abschnitt bereits einemetrozu 1 Beziehung zwischen den Entitäten
PersonayAbteilungKennen Gelernt: Die EntitätPersonaenthält alle Mitarbeiter einer Firma, die
EntitätAbteilungalle Abteilungen. Ein Eintrag der RelaciónPersona, también ein Mitarbeiter, ist
einer Abteilung zugeordnet. Umgekehrt arbeiten in einer Abteilung mehrere Mitarbeiter: Ein
Eintrag in der EntitätAbteilunghat also eine Beziehung zu mehreren Einträgen in der Entität
Persona.
Wie wir im nächsten Abschnitt sehen werden, ist es in der Praxis wichtig zu wissen, ob ein
Mitarbeiter immer einer Abteilung zugeordnet sein muss. In einigen Firmen gibt es spezielle
Stabsstellen, so dass ein Mitarbeiter zeitlich begrenzt auch keiner Abteilung angehört. Cuando
se toma en cuenta el Prokurist einer Firma in der Entität Person aufgeführt, entonces ist er
vermutlich ebenfalls keiner Abteilung zugeordnet. Wir müssten also genau genommen von
einer „m a 0 o 1“ Beziehung sprechen: Ein Mitarbeiter ist in einer oder keiner Abteilung
beschäftigt. Wir sprechen hier vereinfacht von einermetrozuCBeziehung, wobeiCnur die Werte
0 oder 1 annehmen kann.
Weiter kann es vorübergehend vorkommen, dass eine Abteilung keine Mitarbeiter
besitzt. Die Viele-Beziehung implica también, dass manchmal auch nur eine oder gar
keine Beziehung besteht. Dies kommt in relatedalen Datenbanken regelmäßig vor,
schließlich muss eine neue Abteilung in einer RelationAbteilungerst einmal eingetragen
werden, bevor Mitarbeiter dieser neuen Abteilung zugeordnet werden können. ¡Direkt
nach dem Einrichten hat diese Abteilung also keine Mitarbeiter! Null-Werte sind in einer
Viele-Beziehung also immer möglich.
Zusammenfassend stellen wir also fest, dass es drei wesentliche Beziehungswerte gibt: C2 f
0;1gramo,1 unidadmetro! Berücksichtigen wir jetzt alle Kombinationsmöglichkeiten dieser drei
Werte, so erweitern wir jetzt unsere obige grobe Einteilung auf neun Kategorien, siehe Abb.3.7.
3.2 Modelo Entidad-Relación 83

Tejido. 3.7Todas las Beziehungen


c (0..1) 1
acciones posibles en un ERM
metro

cc c1 cm
c (0..1) A B A B A B

1 taza 11 1 metro
1 A B A B A B

mc metro 1 mm
metro A B A B A B

Die in der Abbildung ausgegrauten Felder rechts oberhalb der Diagonale sind LEDiglich
Symmetrien der Einträge links unten. Die ebenfalls ausgegraute 1 zu 1 Beziehung kommt in der
Praxis in related Datenbanken nicht vor, wie wir noch zeigen werden. Somit müssen wir nur
fünf Fälle eingehender untersuchen:
1 zuCCambios de tamaño:Estas beziehungen mitC2 f0;1gramosind relativ selten.
Anzutreffen sind sie meist dann, wenn Zusatzeigenschaften von Entitäten in Subtypen
ausgelagert werden, sei es aus Datenschutzgründen, oder um viele Null-Einträge in einer
umfassenden Supertyp-Entität zu vermeiden. Betrachten wir wieder unser Beispiel aus Tab.3.16
con el subtipoVerkäufery el supertipoMitarbeiter. El Supertipo incluye todos los Mitarbeiter
einer Firma, el Subtipo Zusatzangaben zu den Verkäufern. Damit ist jeder Eintrag in der Entität
VerkäuferAuch genau einmal in der EntitätMitarbeiterenthalten. Umgekehrt gibt es zu jedem
Mitarbeiter keinen oder einen Eintrag in der EntitätVerkäufer. Es liegt also tatsächlich eine 1 zu
CBeziehung conC2 f0;1gramovor. Tejido.3.8zeigt auf, wie wer dies in einem Entidad-Relación-
Diagrama darstellen können. Wir lesen dies wie folgt: Zu einem Mitarbeiter gibt esCVerkäufer,
también einen oder keinen. Zu einem Verkäufer gibt es genau einen Mitarbeiter.
Vollständigkeitshalber weisen wir noch darauf hin, dass die EntitätVerkäuferSchwach ist, da
diese ohne die EntitätMitarbeitersinnlos wäre: Ist eine Person kein Mitarbeiter der Firma, so ist
er auch kein Verkäufer.
An Hand dieses Beispiels können wir auch nachvollziehen, warum es in related
Datenbanken keine 1 zu 1 Beziehungen geben kann. Wir können schließlich nicht
gleichzeitig in beiden Relationen neue Einträge einfügen. Nach dem Einfügen in der
ersten Relation gibt es noch keinen Eintrag in der zweiten. Habremos somit eine 1 zuC
Beziehung.
CzuCCambios de tamaño:Estas beziehungen están seleccionadas. Die meisten Eins-
Beziehungen beruhen auf der Beziehung zwischen Subtyp and Supertyp, and dies sind 1 zuC
Beziehungen. MorirCzuCBeziehungen sind ein Spezialfall dermetrozuCBeziehungen und
werden immetro-C-Fall mit trachtet.
metroa 1 Beziehungen:Bei diesen Beziehungen verweisen kein, ein oder mehrere Einträge
in der einen Entität auf genau einen Eintrag in der deren. Umgekehrt verweist jeder Eintrag der
zweiten Entität auf genau einen Eintrag der ersten. Es liegt eine Viele-zu-Eins-
84 3 Diseño de banco de datos

Verkaufsbezirk Disposición

persona
C
Verkäufer
1
es
Nombre
Mitarbeiter
es Betriebs-
1 Informatico sistema
C
dirección
Gehalt
banco de datos
programador

Tejido. 3.8Beispiel von zwei 1 zu c Beziehungen

Verknüpfung vor. Habremos de que esta Beziehung bereits zwischen den EntitätenAbteilung y
Personakennen gelernt (siehe Abb.3.5). Dort existiert zu jeder Abteilung kein, ein oder mehrere
Mitarbeiter aus der EntitätPersona. Umgekehrt ist jeder Mitarbeiter der EntitätPersonagenau
einer Abteilung zugeordnet. Estometrozu 1 Beziehungen kommen sehr häufig vor, etwa in
Hierarchien.
metrozuCCambios de tamaño:Estas beziehungen son genauso wichtig wie diemetrozu 1
Beziehungen und sollten von diesen schon beim Design sehr sorgsam unterschieden werden.
Betrachten wir wieder die Beziehung zwischen den EntitätenAbteilungyPersonatambién Abb.
3.5. In einigen Firmen könnte es durchaus sein, dass ein Mitarbeiter vorübergehend keiner
Abteilung angehört. Wird etwa eine Abteilung aufgelöst, so könnte die Zuordnung der
Mitarbeiter zu einer Abteilung zunächst vakant gehalten werden. Primero sukzessiv würden die
Mitarbeiter dann auf otras Abteilungen verteilt. In diesem Falle läge einemetrozu CBeziehung
vor, ein Mitarbeiter wäre also Mitglied von keiner oder einer Abteilung. Wir sehen, dass wir
schon beim Design Besonderheiten der realen Umgebung genau beachten sollten!

metrozunorteCambios de tamaño:Beide Zahlenmetroynortestehen für viele


Verknüpfungen. Dies schließt mit ein, dass vorübergehend auch nur eine oder gar keine
Verknüpfung besteht. Es liegt hier eine Beziehung vor, in der mehrere Einträge der einen
Entität auf densalben Eintrag in der der deren Entität verweisen können. Umgekehrt zeigen
mehrere Einträge der dos Entität auf einen Eintrag in der ersten. Wir haben diese Beziehung
schon kennen gelernt. En la pestaña.3.3y3.4Sind die RelationenVerkáeuferyProducto
aufgeführt. Jeder Verkäufer kann mehr als ein Produkt verkaufen, gleichzeitig kann auch jedes
Produkt von mehreren Verkäufern angeboten werden. Wir schließen selbstverständlich mit ein,
dass ein neues Produkt noch nicht angeboten wurde, oder dass ein frisch eingestellter
Verkäufer noch nichts verkauft hat. Esta Beziehung está en Abb.3.9wiedergegeben.
Wir haben jetzt alle wichtigen Beziehungen kennen gelernt. Es wird Zeit, estas Beziehungen
auch praktisch auf Beispiele des täglichen Lebens anzuwenden. En la pestaña.3.17 Haben wir
eine kleine Auswahl zusammen gestellt. Wir können über jeden einzelnen Ein-
3.2 Modelo Entidad-Relación 85

Tejido. 3.9Beziehung zwischen


norte
Verkäufer und Produkt
metro

Verkäufer Producto
verkauft

Trag diskuteren, da die angegebenen Beziehungen von den vorliegenden Gegebenheiten


abhängen. Beispielsweise könnte zwischen den EntitätenBewohnerycasaunometrozuC
Beziehung vorliegen, wenn Bewohner einer Wohngesellschaft auch noch aufgeführt werden,
wenn sie nicht mehr dort wohnen. auch morirCzu 1 Beziehung zwischen den Entitäten Leery
Abteilungkann in Frage gestellt werden. Hat denn nicht jede Abteilung auch einen
Abteilungsleiter? Liegt also nicht eine 1 zu 1 Beziehung vor? In der Praxis kann es aber
durchaus vorkommen, dass der Posten des Abteilungsleiters vorübergehend unbesetzt ist. Y
también cuando no hay caídas, podemos estar en un banco de datos relacional que no se
realice correctamente: ¡Direkt nach dem Eintrag einer neuen Abteilung gibt es ja noch keinen
Abteilungsleiter! Wir hatten daher bereits weiter oben 1 zu 1 Beziehungen ausgeschlossen.

Zur Bestimmung der korrekten Beziehung ist das Wissen des exakten Umgebungskontextes
zwingend notwendig. Wollen wir etwa angeben, welche einzelnen Bäume in einem Park
wachsen, so liegt eine 1 zumetroBeziehung zwischen Park und Baum vor. Konzentrieren wir
uns bisagragen nur auf die Artenvielfalt, e interessiert uns lediglich, wie viele Linden und
Kastanien im Park wachsen, so liegt einemetrozunorteBeziehung zwischen Park und Baumart
vor. Im ersten Fall steht dem Park eine EntitätBaumgegenüber mit Eigenschaften wie Alter,
Größe, Baumart und Lage im Park. Im dos veces Fall liegt die EntitätBaumart

Pestaña. 3.17Beispiele zu Beziehungen zwischen Entitäten

Beziehung bemerkung
1 Halter kann mehrere KFZ anmelden
KFZ-Halter KFZ
1 KFZ está en el máximo de un cabestro zugelassen
1 Student besucht mehrere Vorlesungen 1
Alumno Vorlesung
Vorlesung besucht mehrere Studenten
1 Kunde gibt mehrere Bestellungen auf 1
Kunde Bestellung
Bestellung gehört zu genau einem Kunden
1 Bewohner wohnt in einem Haus En 1
Bewohner casa
Haus wohnen mehrere Bewohner
En 1 parque wachsen mehrere Bäume 1
Parque Baum
bestimmter Baum steht en un parque
En 1 Parque wachsen mehrere Baumarten 1
Parque Baumart
Baumart gibt es en mehreren Parques
1 KFZ máximo máx. einen Verbrennungsmotor 1
KFZ Motor
Motor en posición máxima einem KFZ eingebaut
1 Tipo de motor KFZ besitzt mehrere Motorvarianten 1
Tipo KFZ Tipo de motor
Motortyp kommt in mehreren Tipo KFZ vor
1 Abteilungsleiter leitet genau eine Abteilung 1
Leer Abteilung
Abteilung besitzt maximal einen Leiter
86 3 Diseño de banco de datos

vor mit Eigenschaften wie Artenname, botanischer Name, Gattung, Ordnung und weitere
allgemeine Daten zu der Baumart.

3.2.3 Relaciones de dependencia

In den letzten Abschnitten haben wir Entitäten, Beziehungen und die Erstellung eines
Entity-Relationship-Diagramms ausführlich kennen gelernt. Unser Ziel bleibt es, un
datenbank relacionale zu erstellen. Im ersten Schritt habían wir die Entitäten ermittelt
und eins zu eins in Relationen überführt. Im zweiten Schritt haben wir im Detail die
Beziehungen zwischen diesen Entitäten betrachtet. Werden monja in diesem Abschnitt
diese Beziehungen auf eine relacionale Datenbank abbilden. Wir wissen bereits, dass eine
relacionale Datenbank nur Relationen enthält. Wir wissen ebenfalls, dass Fremdschlüssel
der Kit zwischen den einzelnen Relationen sind. Wir vermuten daher korrekt, dass die
Beziehungen direkt mit Fremdschlüsseln in Zusammenhang stehen.
Gehen wir nun davon aus, dass ein komplettes Entity-Relationship-Modell vorliegt und wir
alle Entitäten in Relationen überführt haben. Wir betrachten dann jede Beziehung zwischen dos
Relationen einzeln und führen jeweils geeignete Fremdschlüssel ein. Zum Schluss liegt dann
dien vollständige relacionale Datenbank vor, die dann nur noch mit Daten gefüllt werden muss.
Betrachten wir also die fünf relevanten Beziehungen aus dem letzten Abschnitt nacheinander:

metrozunorteCambios de tamaño:En los bancos de datos relacionales müssen wir eine


metrozunorteBeziehung in eine eigene Datenbank-Relation überführen. Aus einerBeziehung
im Entidad-Relación-Modelo entsteht einerelación beziehungs . Esta relación de dependencia
envuelve dos frenos de mano, y en el primero de ellos intervienen entidades involucradas.
Betrachten wir unser Beispiel der beiden EntitätenVerkäuferyProducto. Wir erzeugen jetzt una
nueva relaciónVerknuepfungals Verbindungsglied zwischen diesen beiden Relationen. Esta
relación de BeziehungsVerknuepfungenthält die beiden FremdschlüsselVerkNryProdNr, die auf
die Primärschlüssel der beiden RelationenVerkáeufery Productozeigen. Wir kennen genau this
Relation bereits aus Tab.3.5. In der dortigen Relation ist zusätzlich der Umsatz aufgeführt. Die
Überführung einermetrozunorteBeziehung in die entsprechende Beziehungsrelation ist in Abb.
3.10visualizar.
Ganz analog müssen wir bei den Beziehungen zwischen Student und Vorlesung oder den
Beziehungen zwischen Park und Baumart vorgehen und jeweils eine eigene Relation erzeugen.
Gelegentlich finden wir auch Beziehungen zwischen mehr als dos Entitäten. Diese enthalten
dann entsprechend viele Fremdschlüssel. Das Vorgehen bei Mehrfachbeziehungen ist analog
zu den Zweierbeziehungen, wer können uns also im Folgenden auf Zweierbeziehungen
beschränken.
Charakteristisch für Beziehungsrelationen ist, dass die beiden verknüpfenden
Fremdschlüssel zusammen immer eindeutig sind und somit einen Schlüsselkandidaten
bilden. En la relaciónVerknuepfungsind die beiden AtributoVerkNryProdNrmorir einzigen
3.2 Modelo Entidad-Relación 87

Verkáeufer
Verkäufer
1
metro
metro
VerkNr
verkauft

verkauft Verknuepfung 2 Fremdschlüssel

metro ProdNr
norte

1
Producto
Producto

relación beziehungs

Tejido. 3.10Beziehungsrelation zwischen Verkaeufer und Produkt

Schlüsselkandidaten und damit auch Primärschlüssel. Relación de matrizVerknuepfungkann in


der Datenbanksprache SQL (siehe Abschnitt5.1) wie folgt erzeugt werden:

CREAR MESA Verknuepfung


( VerkNr CARÁCTER(4) REFERENCIAS Verkaeufer,
ProdNr CARÁCTER(4) REFERENCIAS producto,
umsatz ENTERO,
PRIMARIO CLAVE (VerkNr, ProdNr)
);

Ohne den Create-Table-Befehl zu kennen, können wir ihn nachvollziehen: Das Attribut
VerkNrverweist auf die RelaciónVerkáeufer(genauer auf den Primärschlüssel dieser
Relation) undProdNren la relaciónProducto. Ebenso ist der zusammengesetzte
Primärschlüssel angegeben.
Wir weisen explizit darauf hin, dass wir im Falle des Verkäufers und des Produkts mit Hilfe
des Entity-Relation-Modells zu dem exakt gleichen Ergebnis kommen wie zuvor in der
Normalformenlehre beim Übergang zur 3. Normalform. Setzen wir das Diagramm in Abb.3.10
um, así que erhalten wir die drei RelationenVerkáeufer,ProductoyVerknüpfungtambién Tab.3.3,
3.4y3.5. Normalformenlehre und Entity-Relationship arbeiten Hand in Hand. Claramente, las
entidades identificadas aparecen en las relaciones automáticas según la forma normal. Das
Gleiche gilt für Beziehungen und Beziehungsrelationen. Letztere wollen wir exactamente
definieren:

IDefinición: relación de dependenciaSeienkRelacionándose conk > 1Gegeben. Una relación R


heisstrelación beziehungs , cuando esto sea asíkRelationen wie folgt miteinander verbindet:

- RenthältkFremdschlüssel mitk> 1, die je auf genau eine derkGegebenen Relationen


verweisen.
- MorirkFremdschlüssel bilden zusammen einen Schlüsselkandidaten.
88 3 Diseño de banco de datos

En fast allen Fällen doradok = 2. Esta definición es deshalb wichtig, da auch das
Umgekehrte gilt: Gibt es eine Relation mitkFremdschlüsseln, die zusammen
Schlüsselkandidat sind, so liegt eine Beziehungsrelation vor! Las relaciones de pareja se
conocen como diagrama de relación de entidad con una relación.
metroa 1 Beziehungen:Diese Beziehungen lassen sich ebenfalls in
Beziehungsrelationen überführen, doch es gibt eine einfachere Lösung: Wir fügen in der
Viele-Beziehung (Angabe:metro) einen Fremdschlüssel als Verweis auf die 1 Beziehung
hinzu. Betrachten wir dazu das Beispiel der Beziehung zwischen den EntitätenAbteilungy
Personatambién Abb.3.5. Wir erweitern die RelaciónPersonapor un atributoAbteilungsnr,
in das wir die Abteilungsnummer eines Mitarbeiters eintragen. Der dazugehörige SQL-
Befehl zum Erzeugen der RelationPersonakönnte lauten:

CREAR MESA Persona


( PersNr ENTERO,
Nombre PERSONAJE (25),
...
Abteilungsnr ENTERO NO NULO REFERENCIAS Abteilung,
CLAVE PRIMARIA (Persona)
);

Hervorzuheben ist hier die BedingungNO NULO. Damit sind im AttributAbteilungsnrkeine


Null-Werte erlaubt. Dies ist wegen dermetrozu 1 Beziehung zwingend notwendig! Hier muss
immer genau eine Abteilung angegeben werden.
Erst jetzt verstehen wir Abb.3.10vollständig. Genau genommen haben wir dort die metrozu
norteBeziehung durch Hinzufügen einer Beziehungsrelation in dosweimetrozu 1 Beziehungen
umgewandelt. Die Not-Null-Bedingung war dort nicht erforderlich, da beide Fremdschlüssel
Teil des Primärschlüssels sind.
metrozuCCambios de tamaño:Wie beimetrozu 1 Beziehungen wird in dermetroBeziehung
ein Fremdschlüssel hinzugefügt. Der einzige Unterschied ist, dass jetzt auch Null-Einträge
erlaubt sind. Wir fügen also keine Not-Null-Bedingung hinzu. Gibt es in einer Firma Mitarbeiter,
die vorübergehend oder dauerhaft keiner Abteilung angehören, so können wir jetzt bei diesem
Mitarbeiter den WertNuloeinfugen. Übrigens kann einemetrozunorteBeziehung auch in zwei
metrozuCBeziehungen umgewandelt werden. Voraussetzung ist nun natürlich, dass die
Fremdschlüssel in der Beziehungsrelation nur Alternative Schlüssel sind!
1 zuCCambios de tamaño:Estas Beziehungen werden wie diemetrozuCBeziehungen
behandelt: Es wird ein Fremdschlüssel hinzugefügt, und zwar in related Datenbanken
zwingend in derC¡Beziehung! Gleichzeitig ist dieser Fremdschlüssel ein Schlüsselkandidat,
da in einerCBeziehung jeder Wert nur maximal einmal vorkommen darf. Este
Fremdschlüssel debe estar en einen Wert verweisen (wegen 1 zuC!), somit muss auch die
Not-Null-Bedingung gelten. Wir wollen dies am Beispiel der recht häufigen Subtypen
aufzeigen und betrachten wieder die Mitarbeiter und deren Teilmenge, die Verkäufer, aus
Abb.3.8. Es bietet sich bei Subtypen immer an, den Primärschlüssel des Subtyps
3.2 Modelo Entidad-Relación 89

gleichzeitig auch als Fremdschlüssel zu verwenden. Damit sind die Eindeutigkeit und die Not-
Null-Bedingung automatisch erfüllt, und wer saven einen eigenen Fremdschlüssel.

CREAR MESA Verkáeufer


( PersNr REFERENCIAS ENTERAS mitarbeiter,
PRIMARIO CLAVE (NºPers),
...
);

Wir weisen noch darauf hin, dass wir den Fremdschlüssel nicht in der RelationMitarbeiter
Definieren können. Würden wir nämlich dort einen Fremdschlüssel auf die Relation Verkäufer
einfügen, así que läge eineCzuCy no hay 1 zuCBeziehung vor! Schließlich wird erst der
Mitarbeiter mit den Basisdaten wie Personalnummer und Name eingetragen, bevor die
Verkäuferdaten angelegt werden. Und in der Zwischenzeit müsste der Fremdschlüssel den
WertNuloenthalten!
CzuCCambios de tamaño:Estas äußerst seltenen Beziehungen werden wie die 1 zuC
Beziehungen behandelt. Es ist jetzt dem Datenbankdesigner allerdings frei gestellt, in welcher
Relation er den Fremdschlüssel setzt. Este Fremdschlüssel está en Unterschied zurmetrozuC
Beziehung immer ein Schlüsselkandidat, jedoch kein Primärschlüssel, da wir wegen derC
Bedingung explizit Null-Werte zulassen. En unserem Beispiel en Tab.3.17können wir also
zwischen Motor und KFZ frei entscheiden. Da der Motor ins Fahrzeug eingebaut wird,
empfehlen wir, den Fremdschlüssel in die RelationKFZeinzufügen. Der entsprechende SQL
Befehl zum Erzeugen der RelationKFZkönnte lauten:

CREAR MESA KFZ


( KFZNr ENTERO,
Número de motor ENTERO REFERENCIAS Motor,
PRIMARIO CLAVE (KFZNr),
ÚNICO (Nº de motor),
...
);

Die Unique-Bedingung garantiert, dass jeder Motor nur einmal vorkommt. Gleichzeitig
muss ein Fahrzeug nicht ununterbrochen einen Motor haben, Null-Werte sind also
zugelassen.
Fassen wir die fünf Beziehungstypen und ihre Überführung in Relationen und
Fremdschlüssel nochmals kurz zusammen (Tab.3.18).
Wir haben jetzt zu allen fünf möglichen Beziehungen in unserem Entity-Relation-
Relation-Modell gezeigt, wie wir daraus entsprechende Relationen mit den
dazugehörigen Fremdschlüsseln erzeugen können. Estos frenos de mano no tienen
características propias, pero no se sentirán cómodos.
90 3 Diseño de banco de datos

Pestaña. 3.18 Von Beziehungen zu Relationen und Fremdschlüssel

Beziehung Überführung in Relationen und Fremdschlüssel


Erfordert Beziehungsrelation mit zwei m zu 1 oder m zu c
m zu n
Beziehungen
m zu c Hinzufügen eines Fremdschlüssels zur m Relation
m zu 1 Wie m zu c! Zusätzlich: Fremdschlüssel NO ES NULO
c zu c Wie m zu c! Zusätzlich: Fremdschlüssel es ÚNICO
¡Wie c zu c! Zusätzlich: Fremdschlüssel ist NOT NULL
c zu 1
Meist ist Fremdschlüssel der Primärschlüssel

3.2.4 Fremdschlüsseligenschaften

Im letzten Abschnitt haben wir gezeigt, wie Beziehungen im ERM in Fremdschlüssel einer
datanbank relacional überführt werden. Fremdschlüssel müssen die dos Integritätsregel
erfüllen und folglich immer auf gültige Tupel zeigen. Werden dabei von der Datenbank
unterstützt, damit wir bei Löschoder Änderungsvorgängen nicht ungewollt ungültige
Fremdschlüsselwerte vorfinden. Zur dosweiten Integritätsregel und ihren Folgerungen
verweisen wir auf Abschn.2.4.2. Mit dem Erzeugen der Fremdschlüssel sollten wir daher
zu jedem Fremdschlüssel folgende drei Fragen beantworten:

- Darf ein Fremdschlüsselwert leer bleiben, también Null-Werte enthalten?


- Darf ein Tupel gelöscht werden, auf den sich ein Fremdschlüssel bezieht, und wie sollte die
Datenbank reagieren?
- Darf ein Tupel geändert werden, auf den sich ein Fremdschlüssel bezieht, und wie
sollte die Datenbank reagieren?

Die Antwort auf die erste Frage beeinflusst die beiden anderen und sollte deshalb
unbedingt immer zuerst überlegt werden. Dass Nullwerte in Fremdschlüsseln in einigen Fällen
durchaus Sinn machen und in otheren nicht, wollen wir an dos Beispielen aus Tab.3.17
demostrar. Estos libros están en Abb.3.11directamente gegenübergestellt. En un banco de
datos en el KFZ-Meldestelle sind alle Kraftfahrzeuge in der RelationKFZaufgelistet, ebenso alle
Halter von Fahrzeugen. Ein Halter kann mehrere Fahrzeuge anmelden, ein Fahrzeug kann aber
nur einen Halter besitzen. Ein abgemeldetes Fahrzeug ist no zugelassen und hat keinen Halter.
Es liegt daher einemetrozuCBeziehung vor. Aus dem letzten Abschnitt wissen wir, dass wir den
Fremdschlüssel in dermetroBeziehung hinzufügen, también en la relaciónKFZ, nenen wir ihn
cabestro. Wir müssen im Attributcabestrozwingend Nullwerte erlauben, da ja nicht jedes
Fahrzeug einen Halter besitzen muss.
Ganz anders verhält es sich im Falle dermetrozu 1 Beziehung zwischen den Relationen
KundeyBestellung. Eine Bestellung ohne Kunde ergibt keinen Sinn. Jede Bestellung muss
daher im FremdschlüsselKundnr¡Einen gültigen Kundeneintrag besitzen! Nullwerte sind
hier sinnlos und daher von vorne herein auszuschließen. El FremdschlüsselKundnr erhält
im Create-Table-Befehl die BedingungNo nulo.
3.2 Modelo Entidad-Relación 91

Tejido. 3.11Vergleich zwischen


C
m zu 1 und m zu c Beziehungen
metro

Cabestro KFZ
fusionar un

1 metro

Kunde Bestellung
erteilt

Diese Fremdschlüsseligenschaften gelten ganz allgemein. Sie gelten analog también para C
hasta 1 undCzuCCamas. Wir merken uns daher:

I en unometrohasta 1 unidad en unoCzu 1 Beziehung darf der Fremdschlüssel keine Nullwerte


annehmen. Ist der Fremdschlüssel nicht Primärschlüssel, por lo que está en SQL die
BedingungNo nulozu setzen.
en unometrozuCy en unoCzuCBeziehung sind Nullwerte in Fremdschlüsseln
zuzulassen. Insbesondere kann der Fremdschlüssel nicht Primärschlüssel sein.

Wir sollten daher bei der Erstellung eines ERM ganz genau darauf achten, ob in einer
Beziehung einCoder eine 1 steht. Dies entscheidet darüber, ob Nullwerte in Fremdschlüsseln
erlaubt sind oder eben nicht. Morirmetrozu n Beziehungen sind im obigen Merksatz nicht
aufgeführt, da estos mittelsmetroa 1 o 1metrozuCBeziehungen aufgelöst werden. Meist liegen
metrozu 1 Beziehungen vor, da die Fremdschlüssel in der Regel Teil des Primärschlüssels sind.

Kommen wir zu den eingangs gestellten Fragen zurück. Über die erste mit den
Nullwerten habrán wir hinreichend diskutiert. Die beiden other Fragen beziehen sich auf
die Referenz-Integritätsregel, siehe Abschn.2.4.2. Wir erinnern uns, dass ein Tupel, auf
das sich ein Fremdschlüssel bezieht, nicht einfach gelöscht werden darf. ¡Ebenso darf der
Primärschlüssel eines solchen Tupel nicht ohne weiteres geändert werden, um die
Integritätsregel nicht zu verletzen!
Besonders wichtig ist die obige zweite Frage, da das Löschen von Einträgen relativ
häufig vorkommt. Bereits beim Erstellen eines Fremdschlüssels und damit beim Erzeugen
einer Relation müssen wir darauf achten, dass die dos Integritätsregel immer eingehalten
wird. Beim Vorstellen este Regel en Abschnitt2.4.2wurde diese Thematik ausführlich
behandelt. Wir wollen dies hier daher nur kurz zusammenfassen. Wir hatten beim
Löschen eines Eintrags, auf den Fremdschlüssel verweisen, drei Möglichkeiten:

- AL BORRAR NO HAY ACCIÓN: Das Löschen des Eintrags wird zurückgewiesen, wenn
mindestens ein Fremdschlüsselwert auf diesen Eintrag verweist.
- EN BORRAR CASCADA: Mit dem Löschen des Eintrags werden auch alle Tupel
gelöscht, die sich auf diesen zu löschenden Eintrag beziehen.
- AL ELIMINAR ESTABLECER NULO: Mit dem Löschen des Eintrags werden alle
Fremdschlüsselwerte aufNulogesetzt, die sich auf diesen zu löschenden Eintrag beziehen.
Traducido del inglés al español - www.onlinedoctranslator.com

92 3 Diseño de banco de datos

Wir weisen darauf hin, dass inmetrohasta 1 undCa 1 Beziehungen die EigenschaftAl
eliminar, establecer nuloNaturalmente nicht erlaubt ist, da ja in diesen Beziehungen Nullwerte
im Fremdschlüssel verboten sind.
Besonderheiten, etwa das kaskadierende Löschen in der EigenschaftAl eliminar
cascada, wurden bereits im Abschn.2.4.2besprochen. Wir kommen daher gleich zur
dritten obigen Frage, dem Ändern von Primärschlüsselwerten, auf die Fremdschlüssel
verweisen. Esto es lo que se dice en primer lugar, ya que en la práctica no se manipulan
los productos primarios. Wir fassen uns daher kurz und geben die drei Möglichkeiten
direkt an:

- EN ACTUALIZACIÓN NO HAY ACCIÓN: Das Ändern des Primärschlüsseleintrags wird


zurückgewiesen, wenn mindestens ein Fremdschlüsselwert auf diesen Eintrag verweist.
- EN CASCADA DE ACTUALIZACIÓN: Mit dem Ändern des Primärschlüsseleintrags werden auch alle
Fremdschlüsseleinträge mit geändert, die auf diesen Eintrag verweisen.
- EN ACTUALIZACIÓN ESTABLECER NULO: Mit dem Ändern des Primärschlüsseleintrags werden
alle Fremdschlüsselwerte aufNulogesetzt, die sich auf diesen Eintrag beziehen.

Wirklich sinnvoll ist eigentlich nur die EigenschaftEn cascada de actualización: Todos los
ajustes se activan automáticamente en el freno de mano con vollzogen. Leider unterstützt
Oracle diese wünschenswerte Eigenschaft nicht. Wir kommen darauf in Kap.5zurück. Ein
kaskadierendes Ändern kann nur in den seltenen Fällen auftreten, wenn der Fremdschlüssel
Teil eines Primärschlüssels ist, auf den wieder andere Fremdschlüssel verweisen.
El diseñador de los bancos de datos debe tener estas características propias de los mercados
financieros incondicionalmente entre sí y si está en el lugar donde se encuentran las monedas para
una verdadera pérdida. Er stellt damit die Weiche für die erlaubten Zugriffe auf die Datenbank. Wir
wollen dieses vollständige Umsetzen einermetrozu n Beziehung en zweimetrozu 1 Beziehungen mit
allen Eigenschaften am Beispiel des Erzeugens der BeziehungsrelationVerknuepfungaufzeigen. Zu
Einzelheiten zum Create-Table-Befehl sei auf Abschn.5.1verwiesen:

CREAR TABLA Verknuepfung


( VerkNr CARÁCTER(4) REFERENCIAS Verkaeufer
AL ELIMINAR NO HAY ACCIÓN AL ACTUALIZAR
CASCADA, ProdNr CARÁCTER(4) REFERENCIAS Producto
AL ELIMINAR NO HAY ACCIÓN AL ACTUALIZAR CASCADA,
umsatz ENTERO,
CLAVE PRIMARIA (VerkNr, ProdNr)
);

Este manual es sich also lediglich um eine Vervollständigung des bereits im letzten
Abschnitt angegebenen Create-Table-Befehls. Analog ergänzen wir beispielhaft auch die
RelationKFZ:
3.2 Modelo Entidad-Relación 93

CREAR MESA KFZ


( KFZNr ENTERO,
Número de motor ENTERO REFERENCIAS Motor
AL ELIMINAR ESTABLECER NULO AL ACTUALIZAR CASCADA,
PRIMARIO CLAVE (KFZNr),
ÚNICO (Nº de motor),
...
);

Aquí descubriremos la competencia de los bancos de datos SQL. Ist ein Motor nicht mehr
reparabel, so wird er aus dem Fahrzeug ausgebaut und entsorgt. Mit dem Löschen der
entsprechenden Zeile in der RelationMotorwird dann en la relaciónKFZautomatisch die
Motornummer auf den WertNuloGesetzt.
Wir weisen darauf hin, dass die EigenschaftenAl eliminaryEn actualizaciónnicht zwingend
angegeben werden müssen. Después de la norma SQL se cerrará automáticamente Ninguna
acciónGesetzt. Los bancos de datos como Oracle, SQL Server y MySQL se detienen según la
norma. Más detalles se encuentran en la versión anterior de Create-Table-Befehls en Abschn.
5.1.

3.2.5 Schwache Entitäten y Subtypen

Im letzten Abschnitt befassten wir uns intensiv mit Fremdschlüsseln. Nicht immer ist es
einfach, die dort gestellten Fragen schnell und zufriedenstellend zu beantworten. Haber
wir im ERM aber schwache Entitäten oder Subtypen identifiziert, so lassen sich die
Eigenschaften von Fremdschlüsseln schnell und sicher einstellen.
Comenzamos wieder mit einem Beispiel und trachten eine Firma, die zu jedem Mitarbeiter
die Arbeitszeiten elektronisch erfasst. In der Datenbank existe una relaciónTiempo de gobierno
, in der diese Zeiten zu jedem Mitarbeiter abgespeichert sind. Die Daten eines Mitarbeiters in
der RelationTiempo de gobiernosind wertlos, falls dieser aus der Firma ausscheidet. Die
einzelnen Einträge in der RelationTiempo de gobiernohängen voll von den entsprechenden
Einträgen in der RelationPersonaab. Es handelt sich bei der RelationTiempo de gobierno
folglich um eine schwache Entität. El diagrama de entidad-relación aquí se encuentra en Abb.
3.12. Wie in ER-Diagrammen üblich, haben wir die schwache Entität mit einem Doppelrechteck
gekennzeichnet.

1 metro

Persona Tiempo de gobierno

Schwache
entidad

Tejido. 3.12Schwache Entität Arbeitszeit


94 3 Diseño de banco de datos

Die Eigenschaften dieses Fremdschlüssels in der RelationTiempo de gobiernopecado:

NO NULO
EN ACTUALIZAR CASCADA
EN BORRAR CASCADA

Dies ist leicht nachvollziehbar: Natürlich muss sich jeder Arbeitszeiteintrag auf einen
Mitarbeiter beziehen, so dass ein Nullwert im Fremdschlüssel nicht vorkommen darf. Erhält ein
Mitarbeiter eine andere Personalnummer, sollte diese Änderung auch sofort in der Entität
Tiempo de gobiernonachvollzogen werden. Wird ein Mitarbeiter in der RelationPersona
gelöscht, so sind auch alle Daten in der EntitätTiempo de gobiernowertlos und somit ebenfalls
zu entfernen.
In schwachen Entitäten besitzt der Fremdschlüssel immer die drei obigen
Eigenschaften. Es gilt auch die Umkehrung, so dass wir eine schwache Entität auch über
die drei obigen Fremdschlüsseligenschaften definieren können.

IDefinición: Entidad SchwacheUna entidad importanteschwarz , wenn für die dazugehörige


RelaciónRdorado:

- Renthält genau einen Fremdschlüssel mit den drei EigenschaftenNo nulo,Al eliminar
cascadayEn cascada de actualización.
- AufRverweist kein Fremdschlüssel.

Una entidad negra cuelga de otras entidades ab. Daher enthält sie genau einen
Fremdschlüssel. Weiter ist klar, dass eine Entität nicht schwach sein kann, wenn eine
otra Entität darauf verweist. In diesem Fall müssten ja Einträge in dieser Entität
existieren, bevor andere darauf verweisen können. ¡Estas entradas se pueden hacer
sin querer!
Es gilt also nicht zwingend, dass eine Relation schwach ist, nur weil sie einen Fremdschlüssel
mit den EigenschaftenNo nulo,Al eliminar cascadayEn cascada de actualización enthält.
Andererseits können wir mit obiger Definición leicht schwache Entitäten identifizieren. Ebenso
können wir bei bekannten schwachen Entitäten sofort die Fremdschlüsseligenschaften
angeben.
Zuletzt betrachten wir noch dieSubtipo und sehen uns dazu nochmals das Beispiel aus Abb.
3.8un. Heer stehen die Basisdaten des Personals in der EntitätMitarbeiter también supertipo.
Wir haben zusätzlich die beiden SubtypenVerkäuferyInformaticomit ihren speziellen
Eigenschaften definido. Diese Aufteilung in mehrere Entitäten ergibt Sinn, da sonst alle
speziellen Eigenschaften der Verkäufer, der Informatiker, der Kaufleute, der Sekretärinnen usw.
en la entidadPersonahinzugefügt werden müssten. Estas características propias se dividen
exclusivamente para un grupo de personas selecto, por lo que todos los demás empleados
deben ser nulos. ¡Und genau esta redundanza vermeiden wir mit Subtypen! Hemos tenido el
Create-Table-Befehl zur RelationVerkáeuferboinas soy
3.2 Modelo Entidad-Relación 95

Abschn.3.2.3kenn gelernt. Wir ergänzen ihn jetzt um die noch fehlenden


Fremdschlüsseligenschaften:

CREAR MESA Verkáeufer


(NºPers. REFERENCIAS ENTERAS Mitarbeiter ON BORRAR
CASCADA ON ACTUALIZAR CASCADA, CLAVE
PRIMARIO (PersNr),
...
);

La sociedad propiaNo nuloentfällt im Fremdschlüssel, da der Fremdschlüssel gleichzeitig


Primärschlüssel ist. Este es un tipo típico de subtipos y se comercializará según lo siguiente:

I Es una entidadSubtipo , so ist diese in der Regel schwach und es gilt für die
dazugehörige RelationR:

- Renthält einen Fremdschlüssel auf den Supertyp mit den EigenschaftenNo nulo,Al
eliminar cascadayEn cascada de actualización.
- Este Fremdschlüssel es un Schlüsselkandidat und in der Regel sogar der
Primärschlüssel.

3.2.6 Cierre de cuentas

In den letzten Abschnitten haben wir mit Hilfe des Entity-Relation-ship-Modells gelernt,
kleine Datenbanken zu entwerfen. Este modelo se encuentra en la praxis tausendfach
bewährt und ergänzt hervorragend die Normalformenlehre. Wir können dieses Vorgehen
nur wärmstens empfehlen. El diseño de un banco de datos sigue el siguiente esquema:

- Bestimmen aller Entitäten mit ihren Eigenschaften.


- Ermittlung der Beziehungen zwischen den einzelnen Entitäten.
- Überführung der Entitäten in Relationen und der Eigenschaften in die Attribute dieser
Relationen. Gegebenenfalls erfolgt noch eine Überführung in die dritte (oder höhere)
Normalform.
- Überführung dermetrozu n Beziehungen in Beziehungsrelationen und der anderen
Beziehungen in Fremdschlüssel.
- Ermittlung der Eigenschaften der Fremdschlüssel. Aquí ayuda también Stichworte wie
entidad schwacheySubtipomás adelante.

Este registro de fechas relativo e individual para un nuevo banco de datos


relacional es un banco de datos de tamaño pequeño o grande. Es sei allerdings nicht
96 3 Diseño de banco de datos

verschwiegen, dass bei großen Datenbanken mit vielen hundert Entitäten schnell die Übersicht
verloren geht. Hier hilft eine Zusammenfassung in Untergruppen, sogenannte Schemata (siehe
Abschn.5.5), wie Rechnungswesen, Personalwesen, Vertrieb und Produktion noch ein bisschen
weiter. In der Praxis werden bei sehr großen Datenbanken jedoch sogenannte Case-Tools
eingesetzt oder gleich komplex ERP-Systeme with SAP ERP.
Wir sollten nicht vergessen, wie enorme wichtig ein gutes Design einer Datenbank ist! Ein
Design wird nur einmal durchgeführt. Die Folgen eines schlechten Entwurfs bekommen wir
aber während der gesamten Lebensdauer dieser Datenbank täglich zu spüren. Komplexe
Zugriffe und schlechte Performance sind noch die harmlosen Auswirkungen. Bei
Datenverlusten und Inkonsistenzen wird es ernst.

3.3 Übungsaufgaben

Aufgaben
1. Zeigen Sie, dass sich jede Relation mit nicht zusammengesetztem Primärschlüssel in der
zweiten Normalform befindet.
2. Utilice todas las funciones funcionales
a) en la relaciónVerkaeuferProducto(aquí Tab.3.1)
b) en allen Relationen derBicicleta-Datenbank aus dem Anhang an.
3. Geben Sie zu allen Relationen aus Aufgabe 2 die Determinanten an.
4. Geben Sie zu den RelationenVerkáeufer,ProductoyVerknuepfungtambién Tab.3.3,
3.4y3.5alle Determinanten an.
5. Bestimmen Sie die höchste Normalform (¡nur bis zur 3.NF!) aller Relationen der Bicicleta
-Datenbank aus dem Anhang.
6. Geben Sie eine Relation an, die in der dritten Normalform nach Codd, jedoch nicht in
der dritten Normalform nach Boyce und Codd ist. (Hinweis: Diese Relation muss
zwei zusammengesetzte Schlüsselkandidaten besitzen, die sich in mindestens
einem Attribut überlappen.)
7. Discutir la relaciónVerkaeuferProduktKFZtambién Tab.3.12. Bestimmen Sie den
Primärschlüssel und die funktionalen und mehrwertigen Abhängigkeiten.
Schließen Sie daraus auf die Normalform.
8. Relación de muerteProductoKFZtambién Tab.3.14ist aus einer Projektion
entstanden. Sie enthält aber in der Praxis no alle Kombinationsmöglichkeiten.
Welche Tupel sollten daher noch hinzugefügt werden? Welches Ergebnis ergibt
dann der Verbund aus dieser Relation mit den RelationenVerkaeuferNombre del
producto yVerkaeuferKFZ? Kommen eventuell gegenüber der Relation
VerkaeuferProduktKFZ4NF¿Noch weitere Tupel hinzu? ¿Wirkt sich dies
gegebenenfalls auf the Normalform aus?
9. Geben Sie zu allen Fremdschlüsseln der RelationenPersonal,KundeyAuftrag el banco
de datosBicicleta(Vea también Tab.2.6,2.7y2.8) die drei
Fremdschlüsseligenschaften an.
Literatura 97

10. Geben Sie zur BeispieldatenbankBicicletaan, welche Entitäten schwach sind, bei
welchen Relationen es sich um Beziehungsrelationen handelt und ob Sub- und
Supertypen vorliegen.
11. Das Auftragswesen der DatenbankBicicletaNo se ha implementado de forma
rudimentaria. Erweitern Sie daher die Datenbank durch ein einfaches
Rechnungswesen. La nueva relaciónRechnungsollte mindestens ein Rechnungsdatum,
den Rechnungsbetrag, Informationen über einen Rabatt, erfolgte Mahnung und
erfolgte Bezahlung enthalten. Ergänzen Sie das Entidad-Relación-Modell aus Abb.10.1
anexo. Geben Sie alle neuen Fremd- und Primärschlüssel und die Eigenschaften der
Fremdschlüssel an. Es la relaciónRechnung¿schwach?

Literatura

Chen, P. (1976). El modelo entidad-relación: hacia una visión unificada de los datos.ACM TODS,1, 9.
Chen, P., & Knöll, H. (1991).La entidad-relación-ansatz zum logischen SystementwurfBI.
Codd, EF (1970). Un modelo relacional de datos para grandes bancos de datos compartidos.MCCA,13(6), 377–
387.
Codd, EF (1972). Completitud relacional de los sublenguajes de bases de datos. En R. Rustin (Ed.),Datos
Sistemas básicos(págs. 65–98). Prentice Hall.

Codd, EF (1974).Investigaciones recientes sobre sistemas de bases de datos relacionalesProc. Congreso IFIP.

Connolly, T., & Begg, C. (2010).Sistemas de bases de datos(5. Aufl.). Addison-Wesley.

Fecha, CJ (2003).Una introducción a los sistemas de bases de datos(8. Aufl., Bd. 1). Addison-Wesley.
Eirund, H., & Kohl, U. (2010).Datenbanken – leicht gemacht. Springer Vieweg.
Elmasri, R., & Navathe, S. (2002).Grundlagen von Datenbanksystemen(3. Aufl.). Addison-Wesley.
Elmasri, R., & Navathe, S. (2009).Grundlagen von Datenbanksystemen(3. Aufl.). Addison-Wesley.
soltero
Jarosch, H. (2016).Grundkurs Datenbankentwurf.Springer Vieweg.
Kemper, A., & Eickler, A. (2015).Datenbanksysteme – Eine Einführung. Oldenburgo. Kifer, M.,
Bernstein, A., & Lewis, P. (2005).Sistemas de bases de datos. Addison-Wesley. Kudlich, H. (1988).
Diseño de Datenbank. Saltador.
Maier, D. (1983).La teoría de las bases de datos relacionales. Prensa de Ciencias de la Computación.

Meier, A. (2003).Bancos de datos relacionales: Eine Einführung für die Praxis. Springer Taschenbuch. Meier,
A. (2010).Bancos de datos relacionales y postrelacionales. Saltador. Schubert, M. (2007).Bancos de datos.
Teubner.
Unterstein, G., & Matthiessen, M. (2012).Bancos de datos relacionales y SQL en teoría y práctica.
Saltador.
Vossen, G. (1991).Modelos de datos, lenguajes de bases de datos y sistemas de gestión de bases de datos..
Addison-Wesley.
Zehnder, CA (2005).Sistemas de información y bancos de datos. vdf Hochschulverlag.
Die Zugriffssprache SQL
4

Supervisión

In den beiden letzten Kapiteln wurden Relationsale Datenbanken ausführlich vorgestellt.


Wir haben kennen gelernt, dass diese Datenbanken ausschließlich aus Tabellen
aufgebaut sind, die mit Daten gefüllt sind. Wir haben aber auch gesehen, dass
Zusammenhänge zwischen diesen Tabellen mittels Fremdschlüssel hergestellt werden,
woraus sich schließlich vielfältige Möglichkeiten der Abfrage und Manipulation ergeben.
Ziel dieses Kapitels ist es nun, mit Hilfe der Zugriffssprache SQL auf diese Daten in ihrer
gesamten Vielfalt lesend und schreibend zuzugreifen. Muere en Kap.2vermittelten
wichtigen theoretischen Grundlagen zu relacionaalen Datenbanken werden in die Praxis
umgesetzt.
Zunächst beschäftigen wir uns ausschließlich mit Abfragen. Wir arbeiten uns
systematisch durch den Select-Befehl, um schließlich mittels Unterabfragen und
Verbundoperativeen (Uniones) auch komplex Zugriffe auf die Inhalte un Datenbank
meistern können. Im dos Abschnitt behandeln wir Mutationsbefehle, die
Schreibzugriffe auf die Daten. Estas befehle son relativas einfach, da sie syntaktisch
weitgehend auf den Lesezugriffen aufbauen.

Als Zugriffssprache wirdSQL (S estructuradoq ueryl idioma) verwendet. SQL war


zunächst eine Sprache für den Endbenutzer. Inzwischen dominieren grafische
Oberflächen als Schnittstelle zum Anwender. Al utilizar el programador de datos
bancarios SQL, obtendrá una gran cantidad de información. SQL hat sich, insbesondere
seit dersten Normierung (SQL11987), zur wichtigsten Standardsprache für Datenbanken
entwickelt. Esta antigua norma (impuesta a la norma SQL1) fue adoptada en 1992 (SQL2
1992). La norma SQL2 se implementa con mucha dificultad, todas las etiquetas están
disponibles y además se aplican de manera específica. Sie ist daher die Basis dieses
Kapitels.
100 4 Die Zugriffssprache SQL

En enero de 1999, kam die Objektorientierung hinzu (SQL31999). Weitere


Ergänzungen und Erweiterungen insbesondere in Richtung XML erfolgten in den
Jahren 2003 (SQL 2003), 2006 (SQL2006), 2008 (SQL2008) y 2011 (SQL2011). La norma
SQL2 tiene más de 600 páginas, cada una de ellas ampliada y en tres niveles
aumentados. Estamos aquí en el centro de esta norma que se incluye en el nivel
intermedio.
Para utilizar la orientación de objetos en SQL3 en Kap.9. Aus Platzgründen gehen
wir auf the Unterstützung von XML nicht ein und empfehlen insbesondere Conolly
und Begg (2015) y Faeskorn-Woyke (2007). Para SQL3 en Gulutzan y Pelzer (1999)
bisagras. Una descripción completa de SQL2 se encuentra en Fecha y Darwen (1998),
Van der Lans (2007), Melten y Simon (2001) y Unterstein y Matthiessen (2012), weiter
sei die Literaturliste am Ende dieses Kapitels empfohlen.
La implementación de SQL de los bancos de datos se realiza mediante la norma. Es
posible que esto sea así, ya que aquí se utilizan normas de lenguaje SQL nur nach
kleineren Anpassungen auf den Datenbanken der einzelnen Hersteller ablauffähig ist. Bei
Abweichungen en Oracle, SQL Server y MySQL son entsprechende Hinweise gegeben. Es
empfiehlt sich aber immer, auch auf die Handbücher oder die Onlinehilfen der einzelnen
Softwarehersteller zurückzugreifen.
In der Praxis spielen Transaktionen eine sehr wichtige Rolle. Wir widmen diesen
Transaktionen daher einen eigenen Abschnitt. Wieder gehen wir auf the Besonderheiten
bei Transaktionen en Oracle, SQL Server y MySQL utilizados.
¡El álgebra relacional es una práctica de Zugriffssprache en bancos de datos
relacionales, incluso SQL! Es bietet sich daher an, diese beiden Zugriffsmethoden zu
vergleichen. Este capítulo no se encuentra en la sabiduría del álgebra relacional y también
puede ser útil para todos. Der Vergleich mit der relacionaalen Algebra dient aber der
Vertiefung und dem Verständnis zur Zugriffssprache SQL. Es kann sich daher durchaus
lohnen, zwischendurch einige Absätze zur relacionalen Algebra aus Abschn.2.5
nachzuschlagen. In einem eigenen Abschnitt estos Kapitels werden wir zusätzlich
aufzeigen, dass alle acht Zugriffsoperatoren der relacionaalen Algebra in SQL
nachgebildet werden können, dass also SQL im Sinne der relacionaalen Algebra eine eine
relacionale Zugriffssprache ist.
Wir empfehlen nachdrücklich, die hier vorgestellten SQL-Befehle intensiv zu üben,
gemäß dem Sprichwort: „Nur Übung macht den Meister“. Skripte zur Installation der hier
verwendeten BeispieldatenbankBicicletaPuede utilizar Oracle, SQL Server y MySQL en
Internet para descargarlos, y aquí encontrará la información que necesita.

4.1 La selección de Abfragebefehl

In SQL steht zur Suche und Abfrage von Daten einer Datenbank genau ein Befehl zur
Verfügung: der Select-Befehl. Cuando wir an Kreuzprodukt, Vereinigung oder Verbund (Unirse)
denken, siehe auch Abschn.2.5zur relacionalen Algebra, dann erahnen wir die Mächtig-
4.1 La selección de Abfragebefehl 101

keit dieses Select-Befehls. Es ist das Ziel dieses Kapitels, die wesentlichen und wichtigen Teile
dieses Befehls ganz ausführlich vorzustellen.
Wir wollen die Zugriffsbefehle durch praktische Anwendungen lernen und die Theorie als
zusätzliches Mittel einsetzen, um die praktischen Erfahrungen zu festigen und zusätzlich
verständlich zu machen. Wir setzen daher eine im Anhang ausführlich beschriebene
BeispieldatenbankBicicletaein. Auszüge dieser Datenbank haben wir bereits in Kapitel 2 mit den
RelationenPersonal,KundeyAuftragtambién Tab.2.6,2.7y2.8kennengelernt. In diesem Kapitel
werden wir zusätzlich die RelationAuftragspostenverwenden. Estas relaciones se encuentran en
la pestaña Tab.10.2–10.6. Comenzamos con Abfragen auf die RelationPersonalund stellen einen
Auszug dieser Relación en Tab.4.1nochmals vor.
Esta relaciónPersonalbesitzt in der Originalversion (Tab.10.3y10.4) Atributo elfo. En la
versión reducida (Tab.4.1) verbleiben fünf mit den Namenpersona,Nombre, Ort,
VorgesetztyGehalt. Wollen wir die gesamte Relation mit Hilfe des Select-Befehls
ausgeben, so schreiben wir:

SELECCIONAR * DE Personal ;

Jeder Select-Befehl comienza con el BezeichnerSeleccionar, enthält immer den


Bezeichner Dey termina con un semikolon. Direkt nach dem BezeichnerDeschreiben wir
den Namen der Relation, die wir ausgeben wollen. Zwischen den BezeichnernSeleccionary
DeGeben wir die Attribute (Spaltennamen) an, die wir anzeigen möchten. El símbolo
principal (" ") es una apertura unida a "todos los atributos". Wir geben folglich die
gesamte Personaltabelle aus. Soll nur der Name und Wohnort aller Mitarbeiter
ausgegeben werden, so lautet der Befehl

SELECCIONE Nombre, Ort DESDE Personal;

Die hier groß geschriebenen Wörter sind reservierte Bezeichner der Sprache SQL und
dürfen daher nicht als Spaltenoder Tabellennamen verwendet werden. Analog zu otros
höheren Programmiersprachen ist die Schreibweise wahlfrei: Es sind also beliebig viele
Leerzeichen oder Zeilenwechsel zwischen einzelnen Wörtern erlaubt. Auch unterscheidet

Pestaña. 4.1Relación personal (Auszug aus Tab.10.3y10.4)

persona Nombre Ort Vorgesetzt Gehalt


1 María Forster Ratisbona NULO 4800.00
2 Anna Kraus Ratisbona 1 2300.00
3 Rango Úrsula Francfort 6 2700.00
4 Heinz Rolle Núremberg 1 3300.00
5 Johanna Koster Núremberg 1 2100.00
6 Marianne Lambert Landshut NULO 4100.00
7 Thomas Noster Ratisbona 6 2500.00
8 Renate Wolters Augsburgo 1 3300.00
9 Ernst Pach Stuttgart 6 800.00
102 4 Die Zugriffssprache SQL

SQL grundsätzlich nicht zwischen Groß- und Kleinschreibung. Folgende Schreibweise ist daher
äquivalent zum letzten Befehl, aber natürlich nicht empfehlenswert:

Seleccionar nombre, TRO


de personal ;

In der Praxis werden Abfrageergebnisse meist nicht direkt ausgegeben, sondern zur
weiteren Verarbeitung in Variablen gespeichert. Esta Möglichkeit werden wir en Kap.6
beim Programmieren von Datenbankzugriffen aufzeigen. Doch zunächst wollen wir den
Select-Befehl ausführlich kennen lernen und geben diese Befehle direkt ein. Die
Datenbankhersteller bieten dazu entsprechende benutzerfreundliche Schnittstellen an.
Para Oracle utilizado con SQL Developer, para SQL Server es el Management Studio el
primero en funcionar y para MySQL está instalado MySQL Workbench para su versión. Im
Folgenden werden wir den Select-Befehl im Detail Schritt für Schritt vorstellen.

4.1.1 Der Aufbau des Select-Befehls

Unbewusst wurde sicherlich schon eine wichtige Eigenschaft der Zugriffssprache SQL bemerkt:
SQL fragt nicht,como wir Daten finden, sondern ausschließlich,welche Daten wir suchen. Para
que el juego SQL no sea un rollo, ob las fechas secuenciales abgespeichert oder über un
komplex Indexverwaltung geordnet sind. Der Anwender wird diese Unterschiede höchstens an
der Laufzeit merken, nicht aber an den SQL-Zugriffsbefehlen! Dies vereinfacht die
Zugriffssprache erheblich und dürfte auch der Hauptgrund sein, warum sich relacionale
Datenbanken e insbesondere SQL so schnell verbreiteten.
Für uns hat dies den Vorteil, dass wir uns nicht mit überflüssigem Ballast beschäftigen
müssen und uns gleich auf denSeleccionar-Befehl stürzen können. La sintaxis para las
sogenanntenHauptteil desSeleccionar-Befehls lautet:

Seleccionar Hauptteil:
SELECCIONAR [TODOS | DISTINTO ] Spaltenauswahlliste
DE lista de tablas
[ DÓNDE cama ]
[ GRUPO POR Spaltenliste
[ TENER Bedingung ] ]

Hier und im Weiteren verwenden wir folgendeNotación :

- Die in Großbuchstaben geschriebenen Wörter sind reservierte Bezeichner in SQL und sind
bis auf Groß- und Kleinschreibung exakt so im Befehl anzugeben.
- Ausdrücke in eckigen Klammern sind wahlfrei. Die eckigen Klammern selbst werden nicht
geschrieben!
4.1 La selección de Abfragebefehl 103

- Ausdrücke in geschweiften Klammern geben eine Auswahlliste an. Die einzelnen


Listenelemente sind durch senkrechte Striche („|“) voneinander getrennt. Genau eine dieser
Angaben ist auszuwählen. Die geschweiften Klammern und die senkrechten Striche werden
nicht geschrieben.
- Eine Auswahlliste kann mit geschweiften auch mit eckigen Klammern erfolgen. Dann
ist maximal eine Angabe auszuwählen.
- Alle Bezeichner erfüllen die SQL-Namenskonvention: Bezeichner beginnen mit einem
Buchstaben (ohne deutsche Sonderzeichen ä, ö, ü oder ß), gefolgt von weiteren Buchstaben,
Unterstrichzeichen (“_“) oder Ziffern.
- Drei Punkte „. . . “ weisen darauf hin, dass die vorherige Angabe beliebig oft wiederholt
werden darf.
- Todos los demás tipos de bebidas no se pueden utilizar, o se manejan con
nombres libres.

Der gesamte Select-Befehl kann aus mehreren dieser Hauptteile bestehen. La sintaxis
indicada:

Seleccionar Befehl:
Select-Hauptteil
[FUNIÓN [TODOS] | EXCEPTO | INTERSECARSEgramo
Select-Hauptteil ] [ ... ]
[ ORDENAR POR Ordnungsliste ]

Esta sintaxis es la siguiente: Ein Select-Befehl besteht aus einem Select-Hauptteil,


wahlfrei gefolgt von beliebig vielen weiteren Select-Hauptteilen, die über Unión,Excepto
oderIntersecarsemiteinander verknüpft sind. Nach dieser Verknüpfung darf das
Endresultat noch mittels derOrdenar por-Klausel sortiert werden.
Wir weisen darauf hin, dass die internamente Abarbeitungsreihenfolge eines Select-Befehls
nicht mit der Reihenfolge in der Syntax übereinstimmt. Jede Abarbeitung comenzó con el From-
Klausel. Schließlich wollen wir zuerst wissen, welche Relation verwendet wird. Anschließend
erfolgt mit der Where-Klausel eine Restriktion und erst dann mittels der Select-Klausel eine
Projektion zusammen mit einer eventuellen Gruppierung (Group-By-Klausel). Wir empfehlen,
einen Select-Befehl auch immer genau in dieser Reihenfolge zu lesen.

Bevor wir in den nächsten Unterabschnitten die einzelnen Teile des Select-Befehls im
Detail kennen lernen, wollen wir den Select-Befehl noch mit der relacionalen Algebra in
Tab.4.2vergleichen. Utilizamos rápidamente todos los operadores relacionales en
cualquier lugar en SQL. Nuestro operador de división no está implementado en SQL.
Además del álgebra relacional, sabemos que la división se puede realizar entre otros
operadores. Kreuzprodukt und Verbund sind im Bezeichnerlista de tablasenthalten. Auch
die Umbenennung ist in den BezeichnernSpaltenauswahllisteylista de tablasintegriert, wie
wie in den nächsten Abschnitten sehen werden.
104 4 Die Zugriffssprache SQL

Pestaña. 4.2 SQL y el álgebra relacional

Álgebra SQL
Vereinigung UNIÓN
Schnitt INTERSECARSE
diferencia EXCEPTO
Kreuzprodukt lista de tablas
restricción () DÓNDE
proyección () SELECCIONAR

Verbund lista de tablas


División ---

umbenennung _ Spaltenauswahlliste, Lista de tablas

La base es la norma SQL, generalmente: la norma SQL2. Auf die nur weigenigen
Abweichungen in Oracle, SQL Server y MySQL weisen wir jeweils gezielt hin.

4.1.2 Morir de Klausel

jederSeleccionar-Befehl enthält eineSeleccionar- y unoDe-Klausel. MorirDe-Klausel


verknüpft die in der Tabellenliste angegebenen Relationen mittels des Kreuzprodukts
oder des Verbunds, und dieSeleccionar-Klausel Führt eine Projektion auf die Spalten aus
der Auswahlliste durch. Beginnen wir mit derDe-Klausel. La lista de tablas es una lista
según las recomendaciones de las tablas:

Lista de tablas:
Referencias de tablas [ , ... ]

Im einfachsten Fall besteht die Tabellenliste nur aus einer Tabellenreferenz und diese
wiederum nur aus einem Tabellennamen. Dann bezieht sich der Select-Befehl también nur auf
eine einzige Relation. In einer durch Kommata getrennten Liste Werden bisagras die einzelnen
Tabellenreferenzen über das Kreuzprodukt, auch kartesisches Produkt genannt, miteinander
verknüpft. Wir kommen gleich darauf zurück. Zunächst wollen wir aber die Referencias de
tablas definir:

Referencia de tablas:
Nombre de la tabla [ [ COMO ] Apodo ]
| ( Select-Hauptteil ) [ [ COMO ] Apodo ]
| (Tabellenreferenz) [ [ COMO ] Apodo ]
| Únase a la impresión [ [ AS ] Apodo ]

Esta definición contiene una mezcla de varios elementos que se obtienen a través de tres
líneas simples. Eine Tabellenreferenz ist also im einfachsten Fall ein Tabellenname, wahlfrei
gefolgt von einem Aliasnamen. Los alias son a menudo sehr hilfreich. Es manejado
4.1 La selección de Abfragebefehl 105

sich hierbei um die aus der relacionalen Algebra bekannte Umbenennung eines Tabellnamens.
El TrennbezeichnerComoist ein reines Füllwort und darf weggelassen werden.

I consejoEn Oracle ist der wahlfreie BezeichnerComoin der From-Klausel grundsätzlich


nicht erlaubt.

Die zweite obige Angabe lautete:

( Select-Hauptteil ) [ [ AS ] Nombre de alias ]

Statt eines Tabellennamens darf auch ein in runden Klammern gesetzterSeleccionar-Befehl


verwendet werden. Schließlich erzeugt einSeleccionar-Befehl ja als Ausgabe eine Relation. ¡Y
todas las relaciones sind als Tabellenreferenz im Select-Befehl zugelassen! Wieder ist ein
Aliasname erlaubt. In einigen Fällen werden wir später diese doch recht komplex Variante der
Tabellenreferenz verwenden.

I consejoEn MySQL y SQL Server, debe seleccionar un botón de selección en el


teclado de origen para cambiar un nombre de alias.

Die dritte Angabe zeigt nur auf, dass auch jederzeit runde Klammern gesetzt werden
dürfen. Die vierte Angabe bezieht sich auf Joinausdrücke, also auf einen Verbund (Join) von
Relationen. Wir werden darauf ganz ausführlich in Abschn.4.1.7eingehen. Zu diesen vier
Varianten zeigen wir je ein Beispiel. Utilice una lista de tablas para hacer lo siguiente:

SELECCIONAR * DE Personal AS P;
SELECCIONAR * DE (SELECCIONAR * DE Personal) COMO P2;
SELECCIONAR * DE (Personal);
SELECCIONAR * DE Personal NATURAL INNER JOIN Auftrag ;
SELECCIONAR * DE Personal, Auftrag ;

Im ersten Befehl geben wir alle Tupel der RelationPersonalaus. La relación es el


nombre del aliasPAG. Im zweiten Beispiel wird intern die RelationPersonal
zwischengespeichert, en el nombreP2umbenannt und anschließend ausgegeben. Der
äußere Select-Befehl is hier überflüssig, und es erfolgt letztlich genau die gleiche Ausgabe
wie im ersten Beispiel. Wir wollen nur aufzeigen, dass in SQL Abfrageergebnisse
tatsächlich wie Basisrelationen verwendet werden dürfen. Im dritten Befehl wurde die
Relation Personalgeklammert, era aquí natürlich nicht erforderlich wäre y en SQL Server
auch nicht erlaubt ist. Das vierte Beispiel ist ein Joinausdruck zwischen den beiden
Relationen PersonalyAuftrag. Wir gehen darauf ausführlich in Abschn.4.1.7ein.
Zuletzt ist ein Kreuzprodukt zwischen den RelationenPersonalyAuftragangegeben. Das
Kreuzprodukt als einer der Operadoren der relacionalen Algebra wurde in Abschn.2.5
behandelt. Dabei wird jedes Tupel (Zeile) der RelationPersonalmit jedem Tupel der
106 4 Die Zugriffssprache SQL

Pestaña. 4.3 Kreuzprodukt zwischen den Relationen Personal und Auftrag

persona Nombre Ort AuftrNr Dato Kundnr persona


1 María Forster Ratisbona 1 04.01.13 1 2
1 María Forster Ratisbona 2 06.01.13 3 5
1 María Forster Ratisbona 3 07.01.13 4 2
1 María Forster Ratisbona 4 18.01.13 6 5
1 María Forster Ratisbona 5 06.02.13 1 2
2 Anna Kraus Ratisbona 1 04.01.13 1 2
2 Anna Kraus Ratisbona 2 06.01.13 3 5
2 Anna Kraus Ratisbona 3 07.01.13 4 2
2 Anna Kraus Ratisbona 4 18.01.13 6 5
2 Anna Kraus Ratisbona 5 06.02.13 1 2
3 Rango Úrsula Francfort 1 04.01.13 1 2

RelaciónAuftragverknüpft. Siga las combinaciones de atributos según las relaciones.


Relación de matrizPersonalbesitzt 9 Zeilen, la relaciónAuftrag5. Durch die Verknüpfung
jeder Zeile mit jeder anderen entstehen 45 neue Zeilen. Los primeros elf dieser 45 Zeilen
se encuentran en Tab.4.3angegeben, wobei einige Attribute der RelationPersonalaus
Platzgründen weggelassen wurden. Wir empfehlen dringend, diesen Befehl selbst
auszuführen und das Ergebnis zu analysieren. In der Tabelle sehen wir, dass Mitarbeiter 1
mit allen Zeilen der RelationAuftragverknüpft wird. Dann folgt Mitarbeiter 2 y así fuerte.
Zum Vergleich drücken wir noch den ersten und letzten dieser fünf Select-Befehle mit Hilfe
der relacionaalen Algebra aus, mittels einer Umbenennung und eines Kreuzprodukts:

Personal!PAG.Personal/

Asistencia personal

Es sei darauf bisagrawiesen, dass die Syntax der hier vorgestellten From-Klausel nicht
vollständig ist. Zu allen Feinheiten und Detalles sei auf Date und Darwen (1998) verwiesen.
Wirklich wertvoll werden obige Befehle erst in weiterer Kombination mit Projektion und
Resriktion. Beginnen wir mit der Projektion.

4.1.3 Die Select-Klausel

MorirSeleccionar-Klausel wurde en Abschn.4.1.1vorgestellt und lautet:

SELECCIONAR [TODO | DISTINTO ] Spaltenauswahlliste


4.1 La selección de Abfragebefehl 107

Die Spaltenauswahlliste es una lista de Spaltenausdrücken, die durch Kommata


voneinander getrennt sind:

Spaltenauswahlliste:
Spaltenausdruck [ [ AS ] Alias ] [ , ... ]

Explizit sind hier nicht nur Spaltennamen erlaubt, sondern beliebige Ausdrücke. Wir können
somit Attribute (Spalten) im Rahmen syntaktisch korrekter Ausdrücke beliebig miteinander in
Verbindung Bringen. Betrachten wir dazu wieder die RelationPersonaltambién Tab.4.1. Cuando
tenemos un nombre para todos los nombres y el tiempo que nos interesa, so erhalten wir diese
Angaben durch den Befehl

SELECCIONAR Nombre, 12 * Gehalt AS Jahresgehalt


DE Personal ;

Ausgegeben wird nun eine Tabelle mit dos Spalten, deren Spaltenbezeichnungen
NombreyJahresgehaltlauten. Aquí tenemos el nombre de alias asignado. El Bezeichner
Comoist wieder ein reines Füllwort, darf weggelassen werden und ist in der Select-Klausel
auch in Oracle erlaubt. Vergleichen wir diesen Befehl mit dem äquivalenten Befehl der
relacionalen Algebra, so schätzen wir die leichtere Lesbarkeit von SQL:

12Gehalt!Jahresgehalt.-Nombre;12Gehalt.Personal//

Im Spaltenausdruck sind als Variablen alle vorkommenden Spaltennamen erlaubt.


También se pueden utilizar todas las funciones implementadas en SQL. Neben
numerischen Ausdrücken sind auch Zeichenketten- und Datumsausdrücke möglich. Der
Vielfalt sind kaum Grenzen gesetzt. Werden im weiteren Verlauf viele Möglichkeiten
aufzeigen. Ähnlich wie in der From-Klausel dürfen sogar Select-Befehle, die eindeutige
Ergebnisse liefern, verwendet werden.
Sollen alle Atributo der in derDe-Klausel angegebenen Relationen ausgegeben
werden, so müssen diese nicht einzeln aufgelistet werden. Als Abkürzung dient hierfür
das Sternsymbol (““”). Sowohl dieses Sternsymbol als auch jede Spaltenangabe kann noch
qualifiziert werden, d. h. es kann noch angegeben werden, auf welche Tabelle sich eine
Spalte bezieht. Bei gleichen Spaltennamen in mehreren Tabellen ist diese Qualifizierung
sogar zwingend notwendig. Hierzu wird vor die Spaltenbezeichnung der Tabellenname
geschrieben, gefolgt von einem Punkt. Betrachten wir ein Beispiel. Todos los tres
folgenden Seleccionar-Befehle sind auf Basis der Relationen aus Tab.4.1y10.5gleichwertig,
wobei die RelaciónAuftragmorir atributoAuftrnr,Dato,personayKundnrenthält.

SELECCIONAR * DE Personal, Auftrag ; Personal.*,


SELECCIONAR Auftrag.* DESDE Personal, Auftrag;
SELECCIONE Personal.Persnr, Nombre, Ort, Vorgesetzt, Gehalt, AuftrNr,
Datum, Kundnr, Auftrag.Persnr
DE Personal, Auftrag ;
108 4 Die Zugriffssprache SQL

Los primeros Befehl kennen wir bereits aus dem letzten Abschnitt. Heer wird das
Kreuzprodukt zwischen den beiden Relationen gebildet. Wir sehen, dass sich das Sternsymbol
auf das gesamte Ergebnis der From-Klausel bezieht. Wir können das Sternsymbol aber auch
qualifizieren, indem wir den Relationennamen durch einen Punkt getrennt voranstellen. Damit
wird in unserem Beispiel sichergestellt, dass zunächst alle Personaldaten und dann erst die
Auftragsdaten ausgegeben werden, auch dann wenn in der From-Klausel die beiden Relationen
miteinander vertauscht werden sollten.

I consejoWir empfehlen, das Sternzeichen (“*“) in der Select-Klausel nur in der


direkten Eingabe undnoche en Programmen für den Zugriff auf Datenbanken zu
verwenden.

En los programas se utilizarán los nombres de atributos y se seleccionará el botón


Select-Befehl. Damit wird von vornherein vermieden, dass es beim späteren Einfügen
neuer Attribute in Relationen zu Zuordnungsproblemen kommt. In den beiden Relationen
PersonalyAuftragexistiert der gleiche Attributsnamepersona. Zwecks Unterscheidbarkeit
müssen wir dieses Attribut daher in SQL zwingend qualifizieren, alle other Attribute
dürfen, müssen aber nicht qualifiziert werden! Wieder erfolgt die Qualifikation durch
Voranstellen des Relationennamens und getrennt durch einen Punkt.
En SQL se utilizan operadores aritméticos de suma, resta, multiplicación y división,
etwa wie im obigen Beispiel im Ausdruck12 *Galtado. Ebenso sind einige skalare
Funktionen definido, die internalhalb von numerischen Ausdrücken und Zeichenketten-
und Datumsausdrücken erlaubt sind. Häufige Verwendung finden die Zeichenketten-
FunktionenSuperior,Más bajo,Recortar,RTrimySubcadena, vea también Tab.4.4. Die ersten
beiden Funktionen wandeln Kleinbuchstaben einer Zeichenkette in Großbuchstaben um
und umgekehrt, die dritte Funktion entfernt führende und schließende Leerzeichen einer
Zeichenkette, die vierte nur die schließenden Leerzeichen (RTrim=Ajuste derecho). La
funciónSubcadenawählt eine Teilzeichenkette aus. La sintaxis indicada:

Subcadena( Zeichenkette, Pos, Anzahl )


Subcadena( Zeichenkette DE Pos PARA Anzahl )

Pestaña. 4.4Funciones de escalado adicionales en SQL

Wandelt Kleinbuchstaben en Großbuchstaben um. Otros


SUPERIOR
lugares no están cubiertos.
Wandelt Großbuchstaben en Kleinbuchstaben um. Otros
MÁS BAJO
lugares no están cubiertos.
RECORTAR Führende und schließende Leerzeichen werden entfernt.
RTRIM Schließende Leerzeichen werden entfernt.
Aus einer Zeichenkette wird eine Teilzeichenkette
SUBCADE
extrahiert.
4.1 La selección de Abfragebefehl 109

En la norma hay dos variantes escritas, en SQL Server la primera y en MySQL su


segunda versión implementada. Oracle utiliza varias funcionessubstratoen la primera
variante. Es wird aus einer Zeichenkette ab der PositionPos.eine Teilzeichenkette der
LängeAnzahlausgeschnitten und als Funktionswert zurückgeliefert. Existen otras
funciones básicas, pero todas las implementaciones de Datenbank a Datenbank se
implementan de manera unterschiedlich. Aquí está el manual de instrucciones de este
Hersteller. La funciónRecortarsteht im SQL-Server no zur Verfügung. Reicht dort die
FunktionRTrimnicht aus, so kann zusätzlich auf die dort implementierte FunktionLTrim
(Recorte izquierdo) zugegriffen werden. La funciónRTrimSólo se utilizan los niveles de
rendimiento, pero no se modifican en la norma SQL2.
Zu den skalaren Funktionen kommen noch fünf Aggregatfunktionen hinzu, die in Tab.
4.5aufgeführt sind. Diese Funktionen ermitteln aus einem Spaltenausdruck statistische
Werte, die aus allen Tupeln (Zeilen) der Relation errechnet werden.
Als Parameter cann entweder eine Spalte oder ein beliebiger Spaltenausdruck
angegeben werden. Sollte sich das Gehalt eines Mitarbeiters aus seinem Monatsgehalt
und aus einer jährlichen Einmalzahlung zusammensetzen, abhängig von seiner
Beurteilung, so liefert der erste der beiden folgenden Select-Befehle eine Auflistung aller
Mitarbeiter mit Angabe aller Jahresgehälter. Der zweite Befehl suma el Gehälter und gibt
die Jahrespersonalkosten der Firma aus:

SELECCIONAR Persona, Nombre, 12*Gehalt+1000*(6-Beurteilung)


AS Jahresgehalt
DE Personal ;
SELECCIONAR SUMA( 12*Gehalt+1000*(6-Beurteilung))
Costos personales de AS
DE Personal ;

Mit Hilfe der Aggregatfunktionen ist es möglich, Statistiken aus den vorhandenen
Relationen zu berechnen. Wichtig ist, dass sich estas funciones agregadas auf alle Zeilen
einer Relation beziehen, und dass als Ergebnis genau ein Wert erzeugt wird. ¡Estas
funciones se mantienen juntas o juntas con otras funciones agregadas en el idioma
australiano! Dies sollte sofort klar sein, wenn wir bedenken, dass das Ergebnis eines
Seleccionar-Befehls wieder eine meist mehrzeilige Relation ist. Eine Aggregatfunktion in
der Auswahlliste liefert aber immer nur ein einziges Tupel zurück. uno

Pestaña. 4.5Funciones de agregación en SQL

AVG Promedio Mittelwert, ermittelt über alle Zeilen


CONTAR Contar Anzahl aller Zeilen
MÁXIMO Máximo Maximalwert aller Zeilen
MÍNIMO Mínimo Minimalwert aller Zeilen
SUMA Suma Summenwert, sumiert über alle Zeilen
110 4 Die Zugriffssprache SQL

Spaltenangabe und eine Aggregatfunktion gleichzeitig in der Spaltenliste einesSeleccionar-


Befehls vertragen sich daher nicht.

I consejoInMySQL darf bei den fünf Aggregatfunktionen zwischen


demFunktionsnamen und der öffnenden Klammer kein Leerzeichen stehen!

MorirContar-Funktion erlaubt im Parameter als Abkürzung das Sternsymbol („ “). Wir


zählen hier die Anzahl der Tupel, and dies ist in der Regel unabhängig vom Attribut. Zum
Beispiel liefert der erste der beiden folgenden Befehle die Anzahl der in der Tabelle
gespeicherten Mitarbeiter:

SELECCIONE CONTAR(*) COMO Mitarbeiteranzahl DESDE Personal;


SELECCIONE CONTAR(*) COMO Anzahl DESDE Personal, Auftrag;

Der zweite Befehl gibt die Zahl 45 zurück und zeigt, dass SQL erst die FROM-Klausel
und damit das Kreuzprodukt ausführt, bevor die Select-Klausel berechnet!
Zuletzt wollen wir nicht vergessen, dass in derSeleccionar-Klausel die beiden
Bezeichner DistintoyTodoerlaubt sind. WidDistintoangegeben, so werden gleiche
Ergebniszeilen nur einmal ausgegeben. Alle ausgegebenen Zeilen sind also eindeutig. Mit
der Angabe Todowerden alle erzeugten Ergebnisse einzeln ausgegeben. Este Angabe es
estándar y puede usarse en todas las clases. Eine Liste der Wohnorte aller Mitarbeiter
liefern beide folgenden Befehle. Allerdings wird im zweiten Befehl jeder Wohnort, auch
der OrtRatisbona, no hay ninguna recomendación:

SELECCIONE Ort DESDE Personal; SELECCIONAR


DISTINTO Ort DE Personal;

Die AngabenDistintoyTodoSind auch in allen Aggregatfunktionen erlaubt. Wiederum esTodo


estándarmäßig vorgegeben. WidDistintoverwendet, so werden gleiche Ausdrücke nur einmal
gezählt. Wenn wir beim letzten Beispiel bleiben, so liefert

SELECCIONE RECUENTO (DISTINTO Ort) DE Personal;

die Anzahl aller unterschiedlichen Wohnorte der Mitarbeiter. Wir sehen, dass der
BezeichnerDistintoin der Aggregatfunktion vor dem Attributnamen geschrieben wird.
Zum Verständnis ist es wichtig zu wissen, dass die drei folgenden Befehle jeweils
unterschiedliche Ergebnisse liefern:

SELECCIONE RECUENTO (*) DE Personal;


SELECCIONE RECUENTO (Vorgesetzt) DE Personal; SELECCIONE
RECUENTO (DISTINTO Vorgesetzt) DE Personal;

El primer Befehl zählt alle Tupel der RelationPersonal, der dos überliest dagegen die
beiden Tupel, die im AttributVorgesetzteinenNulo-Eintrag besitzen und der dritte zählt
4.1 La selección de Abfragebefehl 111

nur die unterschiedlichen Einträge (ohneNulo) soy atributoVorgesetzt. El primeroSeleccionar-


Befehl liefert daher den Wert 9, der zweite den Wert 7 und der dritte den Wert 2 zurück, da es
nur dos unterschiedliche Vorgesetzte mit den Personalnummern 1 und 6 gibt.
Todas las funciones agregadas realizadasNulo-Werte immer gleich: Sie werden
grundsätzlich nicht mitgezählt. Einzige Ausnahme von dieser Regel ist der Ausdruck
Contar(*), hier werden immer alle Tupel trachtet. Sollten alle Werte einer Spalte den Wert
Nulo besitzen, so ist die Aggregierung unbestimmt. Las funciones agregadas se unen a
las funciones agregadasNulozurück. Wieder gibt es eine Ausnahme: Die FunktionContar
gibt in diesem Fall die Zahl 0 aus.
Wir hätten damit die wichtigsten Fälle derSeleccionar- yDe-Klauseln behandelt. Más
opciones, insbesondere der Aggregatfunktionen, ergeben sich durch die Group-By-
Klausel desSeleccionar-Befehls und werden dort ausführlich untersucht (siehe Abschn.
4.1.5).

4.1.4 Muere donde-Klausel

Während die bisher behandeltenSeleccionar- yDe-Klauseln en jedemSeleccionar-Befehl


vorkommen, sind dieDónde- ebenso wie die weiteren Klauseln wahlfrei. Wegen cerquero
wichtigen Bedeutung zur Einschränkung einer Relation auf bestimmte Tupel (Restriktion)
finden wir dieDónde-Klausel in der Praxis trotzdem en nahezu allenSeleccionar-Befehlen.
MorirDónde-Klausel enthalt nur eine Bedingung: Alle diejenigen Tupel (Zeilen) werden
selektiert, diese Bedingung erfüllen. Alle other Tupel erscheinen in der Ergebnisrelation nicht.
Zu beachten ist, dass logisch gesehen erst dieDe-, que te muerasDónde- y zuletzt mueren
Seleccionar-¡Klausel ausgewertet wird! Die Aggregatfunktionen beziehen sich demnach nur auf
die Tupel, die in derDónde-Klausel ausgewählt wurden. Beispielsweise liefert der folgende
Befehl als Ergebnis das kleinste Gehalt größer als 3000 Euro, en unserer Beispielrelation
también 3300 Euro.

SELECCIONAR MIN ( En medio )


DE Personal
DÓNDE Medio ambiente > 3000;

Die Bedingung in derDónde-Klausel ist ein boolescher Ausdruck, der je nach Tupel wahroder
falsosein wird. Beliebige boolesche Ausdrücke sind zugelassen, insbesondere Verknüpfungen
mit den booleschen OperatorenNo ,Y yO . Wie in allen Programmiersprachen besitzen diese
Operatoren unterschiedliche Bindungsstärke,Nobindet am stärksten,OSoy geringsten. Todos
los operadores principales en SQL se encuentran en la pestaña.4.6aufgeführt, zu Detalles sei
auf Fecha y Darwen (1998), Van der Lans (2007), Melten y Simon (2001) und die weitere
Literatur am Ende des Kapitels verwiesen.
112 4 Die Zugriffssprache SQL

Pestaña. 4.6 Operadores en el lugar donde-Klausel

Operadores booleanos NO , Y , O
Vergleichsoperatoren < , <= , > , >= , = , <>
Intervalloperador [NO] ENTRE... Y
operador enthalten [ NO EN
operador Ähnlichkeits [ DIFERENTE A
operadores de wahl TODOS, CUALQUIER, ALGUNOS

Operador de existencia EXISTE


operador nulo NO ES NULO

Operadores Boolesche y VergleichsoperatorenLos operadores booleschen und die


Vergleichsoperatoren sollten aus der Programmierung hinreichend bekannt sein.
Aufmerksamkeit bedarf lediglich der Ungleichoperator (“< >“). En la práctica, todos los sistemas
de bancos de datos también están definidos por el operador „!=“, también en Oracle, SQL
Server y MySQL.

Intervalloperador: [NO] ENTRE . . . YAuch der Intervalloperator ist leicht nachvollziehbar.


Heer wird angegeben, ob ein Ausdruck zwischen dos Angaben liegt bzw. nicht liegt. Las
siguientes opciones de alojamiento son equivalentes:

A ENTRE B Y C A >= B Y
A <= C

Wir sehen, dass derEntre-Operador die Randwerte mit einschließt. In der letzten Bedingung
sind keine Klammern erforderlich, da von allen in Tab.4.6Los operadores genannten die
booleschen operatoren am geringsten binden. Selbstverständlich sind aber runde Klammern
zugelassen, was a menudo die Übersichtlichkeit erhöht und damit Fehler zu vermeiden hilft.
Auch folgende Bedingungen sind gleichwertig:

A NO ENTRE B Y C NO A
ENTRE B Y C

Im ersten Fall liegt eine Variante des Intervalloperators vor. Im zweiten Fall istNoder
boolesche Operador, der den folgenden Ausdruck verneint. Wollen wir nun beispielsweise alle
Mitarbeiter aufzählen, deren Gehalt zwischen 2000 und 3000 Euro liegt, so schreiben wir

SELECCIONAR *
DE Personal
DÓNDE Gehalt ENTRE 2000 Y 3000 ;

Operador Enthalten: [NO] ENWährend der Intervalloperator internalhalb eines Intervalls alle
Werte auswählt, entnimmt der Enthaltenoperator die gültigen Werte einer Menge.
4.1 La selección de Abfragebefehl 113

Eine Menge ist in SQL eine durch Kommata getrennte Aufzählung, die insidehalb runder
Klammern steht. Sollen beispielsweise nur diejenigen Mitarbeiter ausgegeben werden,
die genau 2300, 2700 o 3300 Euro verdienen, sollte der folgende Befehl verwendet
werden:

SELECCIONAR *
DE Personal
DONDE Gehalt EN (2300, 2700, 3300);

Das Komplement dieser Ausgabe erhalten wir, wenn wir entweder zwischen dem
BezeichnerDóndey los nombresGehaltoder zwischenGehalty el BezeichnerEn den
BezeichnerNoeinfugen. Im ersten Fall liegt der boolesche OperadorNo, im zweiten Fall die
Erweiterung des Enthaltenoperators vor.

Ähnlichkeitsoperator: [NO] ME GUSTAIn der Praxis ist es häufig erforderlich,


Zeichenketten zu analysieren. Aquí leistet der ÄhnlichkeitsoperatorComowertvolle Hilfe.
Wir können damit Zeichenketten vergleichen, wobei eine Wildcard-Syntax zur Verfügung
steht. Wollen wir etwa alle Mitarbeiter ausgeben, die in ihrem Vornamen den Namen
heinz enthalten, so können wir schreiben

SELECCIONAR *
DE Personal
DÓNDE Nombre COMO '%Heinz%';

Das Prozentzeichen (“%“) steht für beliebig viele Zeichen. Es wird daher jedes Tupel
ausgegeben, dessen Name mit beliebig vielen Zeichen beginnt, dann den Namenheinz enthält
und von beliebig vielen weiteren Zeichen gefolgt wird. El Begriffbeliebig viele zeichenschließt
die leere Zeichenkette mit ein. El símbolo comodín „%“ aparece en el periódico, die demComo
-Operador folgt, mehrfach vorkommen. Der Zeichenkettenausdruck vor demComo-Operador
bisagragen darf keine Wildcardzeichen enthalten. Neben dem Prozentzeichen besitzt auch das
Unterstreichzeichen (“_“) beimComo-Operador eine spezielle Bedeutung. Es esto paragenau ein
beliebiges Zeichen.

I Konstante Zeichenkettenwerden en SQL en Hochkommata ("'") gesetzt, nicht wie in


C oder Java in Anführungszeichen (""").
El símbolo comodín para diferentes tiempos está en SQL el Prozentzeichen
("%") y no en Windows o Unix el símbolo de estrella ("*").
El símbolo comodín para un solo tiempo está en SQL como unterstrichzeichen
("_"), y no en Windows o Unix das Fragezeichen ("?").

In einem weiteren Beispiel werden mit dem folgenden Befehl alle Personen ausgegeben,
die in ihrem Namen die Buchstabenaymienthalten, wenn diese beiden Buchstaben durch
genau ein Zeichen getrennt sind. Una abhängig von Groß- und Kleinschreibung
114 4 Die Zugriffssprache SQL

zu sein, setzen wir außerdem die in Tab.4.4Función descritaSuperiorgewinnbringend ein.


Las funciones de Skalare no se pueden seleccionar ni en el lugar de selección ni en el
lugar de uso.

SELECCIONAR *
DE Personal
DÓNDE Superior(Nombre) COMO '%A_E%' ;

En la relaciónPersonalist this Bedingung nur für die MitarbeiterinRenate Wolters


erfüllt. Esta persona se ausgegeben.

I Die Klein- und Großschreibung spielt in SQL keine Rolle. Dies gilt aber nicht
internalhalb von konstanten Zeichenketten in einem SQL-Befehl!

Operador nulo: ES [NO] NULOEn los juegos de prácticaNulo-Werte eine sehr große Rolle. Der
Nulloperator dient dazu, Tupel auszuwählen, dieNulo-Werte enthalten. Mit folgendem Befehl
können wir etwa alle Mitarbeiter ausgeben, die keinem Vorgesetzten zugeordnet sind:

SELECCIONAR *
DE Personal
DÓNDE Vorgesetzt ES NULO;

Das Komplement, nämlich alle Mitarbeiter, die einen Vorgesetzten haben, erhalten wir
durch eine der beiden folgenden Bedingungen:

NOT Vorgesetzt ES NULO


Vorgesetzt NO ES NULO

Vor einem häufigen Anfängerfehler sei gewarnt. Die folgende Bedingung sollte auf den
ersten Blick alle Tupel auswählen:

DONDE Vorgesetzt = NULL O Vorgesetzt <> NULO

Entweder enthält das AttributVorgesetztden wertNulooder eben nicht. ¡Aber tatsächlich


bleibt die Ausgabe leer! Dies liegt an der EigenschaftNulo. El mundoNulosteht en SQL para un
Wert unbekannten. Ein Vergleich mit unbekannten Werten bleibt unbekannt und liefert daher
in SQL immer den WertFALSOzurück!

I Nullwerte dürfen in SQL nicht mit Vergleichsoperatoren untersucht werden.


Estadísticas sin los operadoresEs nuloyNo es nulozu verwenden.
4.1 La selección de Abfragebefehl 115

UnterabfragenDie inmensa Bedeutung derDónde-Klausel ergibt sich erst dadurch, dass hier
auchUnterabfragen erlaubt sind. Während wir bisher im EnthaltenoperatorEn Mengen direkt
angegeben haben, können Mengen mit Hilfe vonSeleccionar-Befehlen auch erzeugt werden.
Möchten wir etwa alle Mitarbeiter ausgeben, die in den gleichen Orten wie die Mitarbeiterinnen
mit der Personalnummer 2 und 5 wohnen, so können wir dies in dos Schritten tun. Wir
ermitteln in Schritt 1 zunächst die Wohnorte:

SELECCIONAR Ort
DE Personal
DÓNDE Persona EN ( 2, 5 );

Wir erhalten die Orte Nürnberg und Regensburg und setzen diese in Schritt 2 ein:

SELECCIONAR *
DE Personal
DÓNDE Ort IN ('Núremberg', 'Ratisbona');

Dies kann mühsam werden, wenn wir in der Praxis im ersten Schritt sehr viele
Antworten erhalten. Dies kann auch verwirrend sein, wenn wir an dem Zwischenergebnis,
hier den Wohnorten, gar nicht weiter weiter sind. Wir dürfen in SQL den ersten Befehl als
sogenannten Unterselect-Befehl in the two Befehl integrieren and erhalten das
gewünschte Ergebnis in einem einzigen Schritt:

SELECCIONAR *
DE Personal
DÓNDE Ort IN ( SELECCIONAR Ort DESDE Personal
DONDE Persona EN ( 2, 5 ) );

Wir haben nach dem ersten Enthaltenoperator statt einer konstanten Menge eine durch
einen Unterselect-Befehl generierte Menge angegeben. Da es sich um eine Menge handelt,
sind die runden Klammern zwingend vorgeschrieben.

Auswahloperator: TODOS, CUALQUIERA, ALGUNOSLos operadores externosTodo,Algunoy


Cualquierdürfen nur zusammen mit Unterabfragen verwendet werden. Obigen Befehl hätten wir
auch wie folgt schreiben können:

SELECCIONAR *
DE Personal
DÓNDE Ort = CUALQUIER (SELECCIONE Ort DESDE Personal
DONDE Persona EN ( 2, 5 ) );

Einem Auswahloperador gehtsumergir ein Vergleichsoperator voraus, und es folgt die


Angabe einer Menge in Form eines Unterselect-Befehls. ObigerCualquier-Operador vergleicht
116 4 Die Zugriffssprache SQL

jeden durch den Unterselect-Befehl erzeugten Wert mittels des Gleichheitsoperators und
gibt genau dann den Wertverdaderozurück, wenn mindestens ein Wert gleich dem links
vom Vom Operador stehenden Ausdrucks ist. Hay otros operadores externos, como „>“ o
„<=“, que se utilizan de forma analógica.
El operadorAlgunoist nur eine andere Bezeichnung fürCualquier, bajoTodo-Operador liefert
genau dann den Wertverdaderozurück, wenntodos vom Unterselect-Befehl erzeugten Werte
die Vergleichsbedingung erfüllen. Wir beachten, dass die Verneinung von

Ort = CUALQUIER (SELECCIONAR...)

por las malas camas

NO Ort = CUALQUIER ( SELECCIONAR ... )


Ort <> TODOS (SELECCIONAR...)

wiedergegeben werden können,noche jedoch durch

Ordenar <> CUALQUIER (SELECCIONAR...)

Die letzte Bedingung ist immer wahr, wenn der Unterselect-Befehl mindestens dos
unterschiedliche Werte enthält. Schließlich kann ein Ort nicht gleichzeitig den Namen von
dos unterschiedlichen Orten besitzen.
Vertiefen wir diese Auswahloperatoren und betrachten ein weiteres Beispiel: Gesucht ist der
Mitarbeiter, der am meisten verdient. Wir erhalten ihn mit dem folgendenSeleccionar- Befehl:

SELECCIONAR *
DE Personal
DÓNDE Gehalt >= TODOS (SELECCIONE Gehalt FROM Personal);

Die Unterabfrage nach demTodo-Operador generiert alle Gehälter der Relation


Personal. Ausgewählt werden nun all diejenigen Tupel, dessen Gehalt größer als oder
mindestens gleich wie alle diese Gehälter ist. Dies entspricht genau der Definición eines
Máximos. Ausgegeben werden demnach alle Mitarbeiter, deren Gehalt maximal ist. Dies
trifft in unserem Fall nur für Mitarbeiter 1 zu. El siguiente modo de pago no está
disponible en SQL:

SELECCIONAR *
DE Personal
DÓNDE Alto = MAX( Alto ); - - ¡Fehler!

Las funciones de agregación se aplican a todas las relaciones. Die Where-Klausel


wird bisagragen Tupel für Tupel auf den Wahrheitsgehalt der darin enthaltenen
4.1 La selección de Abfragebefehl 117

Bedingung überprüft. ¡Las funciones agregadas no se pueden utilizar directamente en ningún lugar
donde se pueda hacer clic!

I Las funciones agregadasContar,Suma,mín.,máx.ypromediodürfen in der Where-


Klausel nicht direkt verwendet werden.

Wieder hilft uns jetzt die Unterabfrage weiter. Nichts spricht dagegen, dass eine Menge nur
ein Element enthält. Der folgende Befehl liefert daher ebenfalls unsere meistverdienende
Mitarbeiterin:

SELECCIONAR *
DE Personal
DÓNDE Entrada EN ( SELECT MAX(Entrada) DESDE Personal );

Einelementige Mengen können in SQL direkt mit other Werten verglichen werden. En
unserem Fall dürfen wir also obigen In-Operator auch durch das Gleichheitszeichen
ersetzen.
Muere variableGehaltim obigen Befehl bezieht sich beim ersten Vorkommen auf die
Hauptabfrage und beim zweiten Auftreten auf die Unterabfrage, in der das maximale Gehalt
berechnet wird. Die Gültigkeit von variablen Bezeichnern (Spalten- und Tabellennamen)
erstreckt sich immer auf die Umgebung des Vorkommens und alle darin enthaltenen
Unterabfragen. Ein lokaler Bezeichner einer Unterabfrage ist in einer übergeordneten Abfrage
grundsätzlich nicht sichtbar. Sollten ein localer Bezeichner und ein übergeordneter Bezeichner
den gleichen Namen besitzen, so überdeckt der lokale immer den globalen. Aquí se muestran
análogos de SQL a todos los demás programadores de alta velocidad. Gegebenenfalls muss der
übergeordnete Bezeichner qualifiziert werden, wir kommen gleich darauf zurück.

Naturalmente darf eine Unterabfrage weitere Unterabfragen enthalten, die Möglichkeiten


derDónde-Klausel sind enorm. Die bisher vorgestellten und die noch folgenden Beispiele sollen
einen Eindruck der Vielfalt dieser Klausel vermitteln. Einen Anspruch auf Vollständigkeit haben
sie nicht.
Betrachten wir jetzt ein etwas komplexeres Beispiel: Wir geben alle Mitarbeiter
aus, die weniger como Frau Rank (persona3) verdes. Este uso se debe a Hilfe einer
Unterabfrage, además de Hilfe eines Kreuzprodukts:

SELECCIONAR *
DE Personal
DÓNDE Medio < ( SELECCIONE Gehalt DE Personal
DONDE Persona = 3 );

SELECCIONAR P1.*
DE Personal AS P1, Personal AS P2 P1.Gehalt < P2.Gehalt AND
DÓNDE P2.Persnr = 3 ;
118 4 Die Zugriffssprache SQL

BeideSeleccionar-Befehle liefern das gleiche Ergebnis. Im zweiten Befehl haben wir ein
Kreuzprodukt einer Relation auf sich selbst verwendet. Si estos atributos caen en dos con
diferentes nombres existentes, debemos tener relaciones calificadas. Dies funktioniert
hier wegen der gleichen Relationennamen nur mit Hilfe von Aliasnamen.P2 ist hier eine
Hilfsrelation, die nur Mitarbeiterin 3 enthält. Das Gehalt dieser Mitarbeiterin (P2.Gehalt)
steht uns dank des Kreuzprodukts in jeder Zeile zur Verfügung.
¡Aber auch der erste der beiden Befehle bedarf einer Erklärung! Die Unterabfrage bezieht
sich in ihrer Where-Bedingung auf den Primärschlüssel und liefert daher garantiert nur
maximal ein Ergebnis. Es liegt also eine einelementige Menge vor. Nur deshalb darf hier der
Vergleichsoperator „<“ verwendet werden!
Estos Beiden Befehle wollen wir jetzt noch mit der relacionaalen Algebra vergleichen.
Im ersten Fall liegt eine Restriktion vor, im dos Fall ein Kreuzprodukt mit Resriktion,
Projektion und Umbenennung:

- Gehalt<GehaltvonPersnr3.Personal/
- 1 .-PAG1:Gehalt<P2:Gehalt̂PAG2:Persona=3.Pers.!PAG.1Pers./
PAG Pers.!PAG2.Pers.///

Der zweite Befehl zeigt eindrucksvoll die Abarbeitungsreihenfolge auf: Zunächst


erfolgen zwei Umbenennungen und dann die Ausführung des Kreuzprodukts. Esto está
en SQL de From-Klausel. Danach erfolgt die Resriktion, also die Where-Klausel und erst
dann die Projektion und damit die Select-Klausel! Habremos aus Platzgründen die
RelationPersonalpor el nombrepersabgekürzt. Es wird dringend empfohlen, beide
Befehle im Detail nachzuvollziehen und auch auszuprobieren.

Operador de existencia: EXISTEIn unserer Aufzählung der Operatoren der Where-Klausel in


Tab.4.6fehlt noch der Existenzoperator. Con el operadorexistewird überprüft, ob eine
Unterabfrage mindestens ein Tupel zurückliefert. Wir können den letztenSeleccionar-Befehl
auch mit Hilfe desexiste-Operadores formulados:

SELECCIONAR *
DE Personal como P1
DÓNDE EXISTE ( SELECCIONAR * DE Personal
DONDE Persnr = 3 Y P1.Gehalt < Gehalt);

Zum Verständnis der Funktionsweise dieses Select-Befehls sei darauf junctionwiesen,


dass in der Where-Bedingung Tupel für Tupel einzeln überprüft wird. Der Unterselect-
Befehl wird daher für jedes Tupel ausgeführt. Bisher war der Unterselect-Befehl
unabhängig vom betrachteten Tupel. Die Datenbank wird daher vermutlich diesen
Unterselect-Befehl berechnen und dann das Ergebnis in den Gesamtbefehl einsetzen. In
unserem letzten Beispiel ist dies nicht mehr möglich: Der Unterselect-Befehl liefert für
jedes Tupel ein anderes Ergebnis!
Die Unterabfrage ist eine Restriction auf die RelationPersonal. Sie gibt nur die Mitarbeiterin
3 aus (Persona =3) und auch nur dann, wenn diese mehr alsP1.Galtadoverdente.
4.1 La selección de Abfragebefehl 119

Die beiden nicht Qualifizierten NamenpersonayGehaltin der Unterabfrage beziehen sich


auf die RelationPersonalin der Unterabfrage! El nombreP1.Galtadobisagra identificada
das Gehalt aus der übergeordneten RelaciónP1. Esta relaciónP1es un alias para la relación
Personalund wird Tupel für Tupel abgearbeitet.P1.Galtadoenthält also nacheinander die
Werte 4800, 2300, 2700, 3300, usw., siehe Tab.4.1. Wir sehen folglich, dass die
Unterabfrage für jedes Tupel der Hauptabfrage ein anderes Ergebnis liefert. Genau
genommen liefert diese Unterabfrage Mitarbeiterin 3 zurück, falls der Mitarbeiter der
aktuellen Zeile weniger as Mitarbeiterin 3 verdient. Im other Fall ist die Unterabfrage leer.

Der Exists-Operador liefert den WertVerdaderozurück, wenn die Unterabfrage mindestens


ein Ergebnis liefert, sonst den WertFALSO. Folglich werden nur die Tupel der Mitarbeiter
ausgegeben, die weniger as Mitarbeiterin 3 verdienen. Genau das gleiche Ergebnis hatten wir
bereits bei den beiden vorhergehenden Befehlen.
Wir weisen noch darauf hin, dass dieSeleccionar-Klausel einer Unterabfrage bisher nur
genau einen Spaltenausdruck enthielt. Dies war auch immer zwingend vorgeschrieben. Es
sollen ja nur jeweils die Tupel eines Attributwerts weiterverarbeitet werden. Die einzige
Ausnahme von dieser Regel finden wir beimexiste-Operador, da aquí la existencia de Tupeln y
nicht nur die von Attributen interessiert.
El operadorexisteHat keine Entsprechung in der relacionalen Algebra. Er kann
immer durch andere Bedingungen ersetzt werden. El operador siempre estará
disponible, insbesondere in der FormNo existe.

4.1.5 El grupo por grupo y por tener Klausel

MorirGrupo por Klausel ermöglicht das Zusammenfassen von Tupeln nach bestimmten
Eigenschaften. Este Klausel funciona exactamente como el BezeichnerDistintoin der Select-
Klausel. Wir können daher auch mitAgrupar pordie Wohnorte aller Mitarbeiter aus Tab.4.1
auflisten, wobei jeder Wohnort nur einmal erscheint:

SELECCIONAR Ort
DE Personal
GRUPO POR Ort ;

El KlauselAgrupar porgruppiert nach den angegebenen Attributen. Im Unterschied zur


Select-Klausel darf in dieser Klausel nur eine Aufzählung von Attributen (Spaltennamen) stehen,
komplex Spaltenausdrücke sind nicht erlaubt. Zu beachten ist ferner, dass in der Select-Klausel
nur Attributnamen vorkommen dürfen, nach denen gruppiert wird. Esta configuración es
doble: Stünde nämlich in der Select-Klausel des obigen Beispiels noch das AttributNombre, so
wäre das Gruppieren nicht möglich, weil sowohl Frau Forster als auch Frau Kraus und Herr
Noster in Regensburg wohnen, andererseits aber Regensburg wegen der Gruppierung nur
einmal in der Ergebnisrelation vorkommen soll.
120 4 Die Zugriffssprache SQL

Für die obige Gruppierung reicht die Distinct-Angabe in der Select-Klausel voll aus. Die
Mächtigkeit der Group-By-Klausel erschließt sich erst im Zusammenwirken mit den
Aggregatfunktionen. Wenn wir uns beispielsweise nicht nur für die unterschiedlichen
Wohnorte der Mitarbeiter interessieren, sondern auch dafür, wie viele Mitarbeiter in den
jeweiligen Orten wohnen, so liefert der folgende Befehl das Gewünschte:

SELECCIONAR Ort, CONTAR (*) COMO Anzahl


DE Personal
GRUPO POR Ort;

Das dazugehörige Ergebnis ist in Tab.4.7wiedergegeben. Im Zusammenhang mit der


Group-By-Klausel bekommen die Aggregatfunktionen eine erweiterte Bedeutung: Sie
beziehen sich nicht mehr auf die gesamte Relation, sondern nur auf die zu gruppierenden
Teile. Daher können die Aggregatfunktionen jetzt auch zusammen mit anderen
Spaltenausdrücken in der Select-Klausel verwendet werden, was ohne Group-By-Klausel
grundsätzlich verboten war. Si el parámetro de la función de agregación es natural y el
atributo no se activa, no se activará en el grupo por grupo. Sie beeinflussen ja nicht die
Gruppierung, sondern nur die Aggregierungen.
Interessieren uns jetzt nur die Orte, in denen mindestens dos Mitarbeiter wohnen, so
können wir diese Restriction nicht mittels der Where-Klausel ausführen, denn die Wherewird
vor der Group-By-Klausel abgearbeitet. Wir benötigen eine weitere Restriktiondespués der
Gruppierung. Este zusätzliche Gruppierung geschieht mit Hilfe derTener-Klausel . Este Have-
Klausel no está en Zusammenhang mit der Group-By-Klausel erlaubt und dient ausschließlich
der Restriktion nach einer Gruppierung. Wir wollen diese Anwendung an einem Beispiel zeigen:

SELECCIONAR Ort, COUNT (*) Como Anzahl, SUM (12*Gehalt)


AS Jahresgehalt, 12 * MAX (Gehalt) AS MaxJahresgehalt Personal
DE
GRUPO POR ORT
TENER CUENTA (*) > 1;

Pestaña. 4.7Ausgaberelation nach der Gruppierung

Ort Anzahl
Ratisbona 3
Francfort 1
Núremberg 2
Landshut 1
Augsburgo 1
Stuttgart 1
4.1 La selección de Abfragebefehl 121

Nun werden nur die Orte ausgegeben, in denen mindestens zwei Mitarbeiter wohnen.
Zusätzlich erhalten wir das aufsummierte Jahresgehalt und das höchste Jahresgehalt aller
Mitarbeiter, die hier leben. Werden also ausschließlich Statistikangaben zu den
Mitarbeitern aus Regensburg und Nürnberg vorfinden. In der Have-Klausel sind, im
Gegensatz zur Where-Klausel, Aggregatfunktionen erlaubt, da sich diese immer auf die
vorher durchgeführte Gruppierung beziehen. Die Arbeitsweise der Have-Klausel wird
besonders durch folgenden Befehl ersichtlich, der das gleiche Ergebnis wie der
vorhergehende liefert:

SELECCIONAR *
DE ( SELECCIONAR Ort, COUNT (*) Como Anzahl, SUM (12*Gehalt)
Como Jahresgehalt, 12 * MAX (Gehalt) Como
MaxJahresgehalt Personal
DE
GRUPO POR Ort ) AS Zwischentabelle
DÓNDE Anzahl> 1;

Heer wir in der From-Klausel mittels eines Select-Befehls eine temporäre Tabelle
namensZwischentabelleerzeugt. This enthält alle Orte, gruppiert nach Ortschaften.
En estas tablas temporales se eliminan todas las oraciones, en el atributo Anzahl
einen Wert größer 1 besitzen. Dies entspricht genau der vorherigen Angabe in der
Have-Klausel.
Betrachten wir ein weiteres Beispiel mit einem Select-Befehl Innerhalb der From-Klausel. Ein
Auftrag enthält mehrere Auftragspositionen, die in der RelationAuftragspostenaufgelistet sind.
Wollen wir das Auftragsvolumen jedes Auftrags ermitteln, so müssen wir die Summe der
Auftragspositionen jedes einzelnen Auftrags berechnen. Dies lässt sich ganz einfach mit der
Group-By-Klausel ermitteln. Interessieren wir uns zusätzlich für das mittlere Auftragsvolumen
aller Aufträge, así que bilden wir aus this ersten Select-Befehl noch den Mittelwert. Insgesamt
führt dies zu folgendem Befehl:

SELECCIONE 'Mittleres Auftragsvolumen:', AVG (Auftragsvolumen)


DESDE ( SELECCIONAR SUM( Gesamtpreis ) Como Auftragsvolumen
DE Auftragsposten
GRUPO POR Auftrnr) AS Auftragspreis;

Relación temporalPrecio de ventawird das Auftragsvolumen jedes einzelnen Auftrags


und daraus im umfassenden Select-Befehl der Mittelwert berechnet.
Die Group-By-Klausel no tiene ninguna comprensión en el álgebra relacional. Die relacionale
Algebra hat zum Ziel, Daten aus einer Datenbank zu extrahieren. Wie wir sehen, geht SQL noch
einen Schritt weiter: Die ermittelten Daten werden gleich noch bearbeitet. Para las estadísticas,
el Group-By-Klausel sehr häufig eingesetzt. Im Data Warehouse ist sie beispielsweise no
wegzudenken.
122 4 Die Zugriffssprache SQL

4.1.6 Unión, excepto e intersección

En Abschn.4.1.1haben wir gesehen, dass ein Select-Befehl aus beliebig vielen Hauptteilen des
Select-Befehls bestehen darf, die durch die Vereinigung (Unión), la diferencia (Excepto) o
guaridaSchnitt (Intersecarse) miteinander verbunden sind. Estos tres operadores se
encuentran en el álgebra relacional (siehe Abschn.2.5). Den Hauptteil des Select-Befehls haben
wir bis auf den Verbund, der im nächsten Abschnitt folgt, bereits vollständig behandelt. Mit
Hilfe dieser drei „Mengenoperatoren“ wollen wir den Select-Befehl nun im Wesentlichen
abschließen. Bei der Verwendung dieser Operatoren müssen wir beachten, dass die beiden
involvierten Hauptteile zueinander verträglich sind:

- Der Grad der beiden Hauptteile muss gleich sein.


- Die Attribute der einzelnen Hauptteile müssen typ-kompatibel sein. Insbesondere dürfen
numerische Werte nicht mit Zeichenketten oder einem Datum kombiniert werden.
- Bei der Verknüpfung von mehr als dos Hauptteilen bindet der OperadorIntersecarsestärker
como los operadoresUniónoderExcepto. Los operadoresUniónyExceptobesitzen die gleiche
Bindungsstärke. Runde Klammern sind jederzeit erlaubt, um etwa die Bindungsreihenfolge
zu beeinflussen.

In der Praxis spielen der Schnitt und die Differenz kaum eine Rolle. En MySQL también hay
ninguna implementación implementada. Zu beachten ist, dass en Oracle der Bezeichner
Excepto por el gleichwertigen BezeichnerMenosersetzt werden muss. Die Vereinigung finden
wir relativ häufig, insbesondere im Zusammenhang mit dem äußeren Verbund, siehe dazu
auch den nächsten Abschnitt. Hier wollen wir noch eine Besonderheit der Vereinigung
betrachten und sehen uns den folgenden Befehl an:

SELECCIONAR Ort
DE Personal
UNIÓN
SELECCIONAR Ort
DE Kunde;

Otras relacionesPersonalyKundeBesitzen ein Attribut mit NamenOrt. Este atributo es una


joya definida como Zeichenkette. Die Vereinigung también es erlaubt. Relación de matriz
Personalbesitzt neun Tupel, die RelationKundesecs. Wir erwarten daher eine Ausgabe von 15
Zeilen. Es sind jedoch deutlich weniger, da der OperadorUnión¡Automáticamente todos los
mehrfachen Einträge entfernt! SQL aquí también se adapta a la teoría de las relaciones, ya que
no hay ningún doble en la relación. Der obige Select-Befehl ist demnach identisch zum
relacionaalen Ausdruck:
- Ort.Personal/ [ -Ort.Kunde/

In Einzelfällen kann es beispielsweise zwecks Aggregierung durchaus sinnvoll sein, die


mehrfach vorkommenden Tupel nicht zu entfernen. Dies ermöglicht SQL, indem direkt
4.1 La selección de Abfragebefehl 123

Insinuación dem BezeichnerUniónla hierbaTodoangefügt wird. Jetzt unterbleibt das Entfernen


von doppelten Tupeln. Wir weisen darauf hin, dass die Verwendung des OperadoresUnión
Todosen seguidaUniónWesentlich performanter ist, da die teuere Überprüfung auf Gleichheit
von Tupeln im ersten Fall entfällt, siehe hierzu auch Absatz7.5.

4.1.7 Der Verbund (Unirse)

Bereits im Abschn.4.1.2wurde der Joinausdruck als eine Möglichkeit der Tabellenreferenz


in derDe-Klausel vorgestellt. Der Joinausdruck beinhaltet den OperadorUnirse y este
wiederum es el equivalente en SQL del Verbundoperator en el álgebra relacional. El
operadorUnirseEsto se utiliza con la restricción y la proyección con el operador Abstand
wichtigste en SQL. Este operador ist in der Praxis zusammen mit der Unterabfrage das
Verbindungsglied zwischen den Relationen.
El operadorUnirseist sehr mächtig und entsprechend umfangreich und wurde en SQL2 (
1992) eingeführt. Um diesen Operador en cerquero Vielfalt zu verstehen, benötigen wir zum
einen dieDónde-Klausel und zum anderen die Vereinigung (Unión). Dies ist der Grund, warum
wir diesen wichtigen Operador erst so spät behandeln. Eine leicht vereinfachte Sintaxis lautet:

Únase a nosotros:
Referencias de tablasf [NATURAL ] [ INTERIOR ]
| [ NATURAL ]FIZQUIERDA | DERECHA | LLENOgramo [EXTERIOR ]gramo
ÚNETE a Tabellenreferenz
[ EN Bedingung | USANDO ( Lista de Spalten ) ]

Konzentrieren wir uns auf den Kern dieses Befehls, aufTabellenreferenz Únete a
Tabellenreferenz. Dos relaciones se realizan en medio de una relación de compromisos. Eine
Tabellenreferenz kann aber auch ein Select-Befehl sein oder eben wieder ein Joinausdruck,
siehe die Definición der Tabellenreferenz in Abschnitt4.1.2. Es sind folglich beliebig viele
Verknüpfungen mittels des OperadoresUnirseduda.
Die obige Definición de operadoresUnirseist eine Vereinfachung gegenüber der recht
komplexen Definición original. In der Praxis reicht diese Definición vollständig aus, und wir
behalten die Übersicht. In unserer Definición muss aber zusätzlich eine Bedingung erfüllt sein:

I Genau einer der drei BezeichnerNatural,EnyUsandomuss im Joinausdruck


verwendet werden!

Este Joinausdruck se incluye en este formulario únicamente por Oracle. En MySQL es el


BezeichnerLlenonicht erlaubt, ebenso darf das FüllwortInternonicht verwendet werden,
wenn der BezeichnerNaturalbenutzt wird. Beides ist keine wesentliche
124 4 Die Zugriffssprache SQL

Einschränkung. Soy SQL Server bisagra sind the BezeichnerNaturalyUsandoGrundsätzlich


verboten. Heer müssen wir immer den BezeichnerEnverwenden. Auch dies ist keine
inhaltliche Einschränkung, aber viele der hier vorgestellten Befehle müssen dann
entsprechend umgeschrieben werden.
Wir vergleichen den OperadorUnirsemit dem Verbundoperator in der relacionalen Algebra.
Die beiden SQL-Ausdrücke

R1 UNIÓN INTERIOR NATURAL R2 R1


UNIÓN INTERIOR R2 EN Bedingung

entsprechen in der relacionalen Algebra:

R1‰R2 bzw.R1‰camaR2

Im ersten Fall sprechen wir von einem natürlichen Verbund oder einemUnión natural. Die
Funktionsweise dieses Verbunds haben wir bereits in Abschnitt2.5.4kenn gelernt. Wir wollen
dies hier kurz wiederholen:
Der (naturalmente) VerbundR1‰R2setzt voraus, dass in den beiden RelationenR1y R2
mindestens ein Attribut gleichen Namens existiert. Diese gleichen Attribute dienen nun
als Verbindungsglied. Es werden alle Tupel beider Relationen miteinander kombiniert, in
denen die Einträge der verbindenden Attribute der beiden Relationen gleich sind. Die
verbindenden Attribute in beiden Relationen besitzen natürlich nach der Ausführung des
Verbunds die gleichen Einträge und werden daher nur einmal ausgegeben. Ein Beispiel
eines einfachen Verbunds ist in Abb.2.5angegeben. Besitzen die beiden RelaciónR1y R2
bisagragen keine Attribute gleichen Namens, so entartet der natürliche Verbund zum
Kreuzprodukt.
Betrachten wir die beiden RelationenPersonal(Pestaña.4.1) yAuftrag(Pestaña.10.5). Beide
Relationen besitzen das Attributpersona. Wir können also einen natürlichen Verbund
anwenden:

SELECCIONAR *
DE Auftrag UNIÓN INTERIOR NATURAL Personal ;

Das Ergebnis dieses Befehls se encuentran en la pestaña.4.8. El atributoVorgesetzt


wurde aus Platzgründen allerdings weggelassen. Die ersten vier Attribute entsprechen
exakt der RelationAuftrag. Dies ist kein Zufall. Erstens enthält das Attributpersonaen la
relación Auftragkeine Nullwerte und zweitens verweist ein Fremdschlüssel, aquípersona,
nur auf existierende Einträge. Folglich existiert zu jedem Tupel der RelationAuftraggenau
ein Verweis auf einen Mitarbeiter. Der natürliche Verbund gibt nur Zeilen aus, deren
Personalnummern in beiden Relationen gleich sind. Somit werden letztendlich zu jedem
Eintrag der RelationAuftragalle Mitarbeiterdaten aus der RelationPersonalzusätzlich mit
ausgegeben. Dies zeigt uns schon die enorme Bedeutung des Verbunds: Praktisch jede
Fremdschlüsselbeziehung lässt sich óptimo con el operadorUnirseausdrücken.
4.1 La selección de Abfragebefehl 125

Pestaña. 4.8Natürlicher Verbund der Relationen Auftrag und Personal

AuftrNr Dato Kundnr persona Nombre Gehalt Ort


1 04.01.13 1 2 Anna Kraus 3400.00 Ratisbona
2 06.01.13 3 5 Juan. Koster 3200.00 Núremberg
3 07.01.13 4 2 Anna Kraus 3400.00 Ratisbona
4 18.01.13 6 5 Juan. Koster 3200.00 Núremberg
5 06.02.13 1 2 Anna Kraus 3400.00 Ratisbona

Alternativas pueden ser también otras variantes de los productos de unión con las
bezeichnernEnyUsandoverwenden:

SELECCIONAR *
DE Auftrag INNER JOIN Personal
ON Auftrag.Persnr = Personal.Persnr ;
SELECCIONAR *
DE Auftrag INNER JOIN Personal USING (Persnr);

Estas beiden Befehle funcionan con el operador vorhergehende natürliche VerbundUnión


natural. Der letzte Befehl entspricht exakt dem OperadorUnión natural. In der Spaltenliste nach
dem BezeichnerUsandogeben wir hier die gemeinsamen Attributnamen explizit an. Dies ist
dann besonders hilfreich, wenn es in den beiden verknüpften Relationen weitere Spalten
gleichen Namens gibt, dies aber nicht zum Verbund dazugehören.
Der Verbund zusammen mit dem BezeichnerEnist universell einsetzbar. Aquí utilizará el
atributo Zusammengehörigen y el operador Verknüpfungs directamente. Wir sind nicht mehr
darauf angewiesen, dass Attribute gleiche Namen besitzen müssen. Wir können uns
gegebenenfalls eine vorherige Umbenennung saven. Auch ist hier nicht zwingend das
Gleichheitszeichen zu setzen, andere Vergleiche sind ebenfalls erlaubt, ja sogar andere
Operatoren, die wir aus der Where-Klausel kennen, siehe Tab.4.6. Als einziger kleiner Nachteil
dieser Variante sei erwähnt, dass jetzt beide verbindenden Attribute ausgegeben werden.
También debemos tener en cuenta una proyección completa, um die überflüssige dos
Personalnummernspalte zu entfernen:

SELECCIONAR Auftrnr, Datum, Kundnr, Personal.* Auftrag


DE INNER JOIN Personal
ON Auftrag.Persnr = Personal.Persnr ;

En el álgebra relacional se ha escrito en abschn.2.5.5gezeigt, dass der Verbund mit


Hilfe des Kreuzprodukts, der Restriktion und der Projektion ausgeführt werden kann. es

- -
dorado:

R1‰R2D -R1:X;R1:Y;R2:Z-R1:SDR2:S.R1 R2/ ;


WobeiR1en el atributoXyYyR2nosotrosYyzmejor. El entsprechende äquivalente
Select-Befehl lautet:
126 4 Die Zugriffssprache SQL

SELECCIONAR Auftrnr, Datum, Kundnr, Personal.* Personal,


DE Auftrag
DÓNDE Personal.Persnr = Auftrag.Persnr ;

Wir erhalten mit dem Kreuzprodukt der beiden Relationen9 5D45Tupel, aquí también
Tab.4.3. Mit der Where-Klausel wählen wir daraus die Zeilen aus, deren
Personalnummern in den Personalspalten übereinstimmen. Es bleiben somit nur noch
fünf Zeilen übrig. In der Select-Klausel entfernen wir schließlich noch eine der beiden
doppelten Personal-Attribute. Este Befehl ist völlig gleichwertig zu den obigen drei
Varianten des Joinausdrucks mitNatural,EnyUsando. Insbesondere fällt sofort die
Ähnlichkeit zur Variante mit dem BezeichnerEnauf.
Neben dem natürlichen Join existieren weitere Joins, sogenannteUniones Theta. Wir
sprechen immer dann von Theta-Joins, wenn statt des Gleichheitszeichens in der obigenEn-
oderDónde-Bedingung ein beliebiger Vergleichsoperator verwendet wird. Estas uniones Theta
sind relativ selten, können aber gelegentlich recht hilfreich sein.

4.1.8 Der äußere Verbund (Unión exterior)

Neben dem Verbund spielt auch derVerbund adicional oderUnión externa Un rollo ligero.
Comenzamos con un juego de palabras con un sonido y una relación más ampliaPersonal
yAuftragtambién Tab.4.1y10.5. Interessiert sich der Verkaufsleiter dafür, wie viele
Verkäufe jeder einzelne Mitarbeiter bisher abwickelte, so wird sein Wunsch durch den
folgendenSeleccionar-Befehl nur unvollständig erfüllt:

SELECCIONAR Persnr, Nombre, COUNT (*) Como AnzahlAuftrag


DE Personal NATURAL INNER JOIN Auftrag
GRUPO POR Persona, Nombre;

Das Ergebnis está en la pestaña.4.9angegeben und sieht korrekt aus: Nur die Mitarbeiter 2
und 5 kamen ja in unserer kleinen Auftragsliste vor. Der Verkaufsleiter wünscht aber eine Liste
aller ¡Mitarbeiter! Es fehlen folglich alle anderen sieben Mitarbeiter. Dieser Wunsch, zusätzlich
zum Verbund auch alle nicht verknüpften Tupel einer der beiden oder sogar beider Relationen
mit auszugeben, ist relativ häufig und wird durch den äußeren Verbund erfüllt.

Esta versión adicional está integrada en la norma SQL. Im Gegensatz dazu sprechen wir
beim bisher verwendeten Verbund auch vom internalen Join. Wir haben dies bisher auch

Pestaña. 4.9Beispiel eines insideen Únete

persona Nombre AnzahlAuftrag


2 Anna Kraus 3
5 Johanna Koster 2
4.1 La selección de Abfragebefehl 127

por el BezeichnerInternoausgedrückt. Nur die gemeinsamen „inneren“ Tupel wurden verwendet. El


BezeichnerInternoist wahlfrei und muss nicht explizit angegeben werden. Darüber hinaus gibt es den
BezeichnerExterior, genauer die BezeichnerExterior izquierdo,exterior derechoyExterior completo. Es
dorado:

- R1 Unión exterior izquierda R2(R1 R2): Dieser äußere Verbund ist die Vereinigung des
internalen Verbunds (R1 Unión interior R2) mit allen weiteren Tupeln vonR1. El atributo de R
2zu diesen weiteren Tupeln werden mit Nullwerten gefüllt.
- R1 Unión exterior derecha R2(R1 R2): Dieser äußere Verbund ist die Vereinigung des
internalen Verbunds (R1 Unión interior R2)con allen weiteren Tupeln vonR2. El atributo
deR1zu diesen weiteren Tupeln werden mit Nullwerten gefüllt.
- R1 Unión exterior completa R2(R1 R2): Dieser äußere Verbund ist die Vereinigung des linken äußeren
Verbunds (R1 Unión exterior izquierda R2) con los derechos(R1 Unión exterior derecha R2).

Analog zum internalen Verbund müssen wir auch beim äußeren Verbund genau einen
der drei BezeichnerNatural,EnyUsandoangeben. Dorado trivial:

R1 Unión exterior izquierda R2 = R2 Unión exterior derecha R1(R1 R2=R2 R1)

Kommen wir zu unserem Beispiel mit der Anzahl der Verkäufe zu jedem Mitarbeiter
zurück. Der folgende Befehl liefert nun das gewünschte Resultat:

SELECCIONAR Persnr, Nombre, COUNT (AuftrNr) COMO AnzahlAuftrag


DE Personal NATURAL IZQUIERDA EXTERIOR JOIN Auftrag
GRUPO POR Persona, Nombre;

Das Ergebnis zu diesem Select-Befehl se encuentran en la pestaña.4.10. Zusätzlich zu den


beiden Mitarbeitern 2 y 5 sind jetzt auch alle weiteren aufgezählt. Este resto de Mitarbeiter ha
sido natural noch keine Aufträge betreut, die Einträge in der dritten Spalte sind daher auf 0
gesetzt. Wieder muss en SQL Server der BezeichnerNaturaldurch die entsprechende On-
Angabe ersetzt werden.
Der obige Befehl besitzt eine kleine Falle: Verwenden wir in der Select-Klausel Contar(*)
en seguidaContar(Auftrnr), tan extraño en der SpalteAnzahlAuftragEn lugar de Wertes
korrekten 0 die Zahl 1 angezeigt. Schließlich kommt ja jedes Attribut mindestens einmal
vor, und der FunktionsaufrufContar(*)zählt die Anzahl des Vorkommens von Attributen!
Wir nutzen jetzt aus, dass fehlende Attributwerte im äußeren Verbund mit Nullwerten
aufgefüllt werden. Sieben Mitarbeiter haben nichts verkauft. Soy atributoAuftrnrsteht
nach dem Outer Join in diesen Tupeln der WertNulo. La función de conteo no se cancela.
Somit liefert der Aufruf vonContar(Auftrnr)den richtigen Wert 0!
El mostoExteriorist ein Füllwort und darf weggelassen werden. El operadorUnión externaist
also allein durch die BezeichnerIzquierda,BienyLlenobereits eindeutig gekennzeichnet. Wird
keiner dieser Bezeichner angegeben, so liegt der OperadorUnir internamentevor. El operador
Unión externaist sehr leistungsfähig. Da er aber meist viele Nullwerte erzeugt,
128 4 Die Zugriffssprache SQL

Pestaña. 4.10 Beispiel eines äußeren Joins

persona Nombre AnzahlAuftrag


2 Anna Kraus 3
5 Johanna Koster 2
1 María Forster 0
3 Rango Úrsula 0
4 Heinz Rolle 0
6 Marianne Lambert 0
7 Thomas Noster 0
8 Renate Wolters 0
9 Ernst Pach 0

sollte ihn der Anfänger mit Bedacht einsetzen. Es wird daher dringend empfohlen, den äußeren
Verbund auch mittels des internalen Verbunds und der Vereinigung nachzubilden:

SELECCIONAR Persnr, Nombre, COUNT (*) COMO AnzahlAuftrag


DE Personal NATURAL INNER JOIN Auftrag
GRUPO POR Persona, Nombre
UNIÓN
SELECCIONAR Persona, Nombre, 0
DE Personal
DÓNDE Persnr NO EN (SELECCIONE Persnr FROM Auftrag);

Dieser Befehl verdeutlicht die Wirkungsweise des äußeren Verbunds: Es werden zum
internalen Verbund alle Mitarbeiter hinzugefügt, die noch nichts verkauft haben, die also nicht
in der RelationAuftragauftauchen.
Zuletzt wollen wir noch wichtige Empfehlungen aussprechen. Eine erste Empfehlung lautet:

I consejoWir empfehlen, den OperadorUnión externa completazu vermeiden.

El operadorUnión externa completakann in praktisch allen Fällen durch die performanteren


OperadoresIzquierdabzw.Unión exterior derechaersetzt werden. Nur in Fremdschlüsseln, in
denen Nullwerte vorkommen, macht der OperadorUnión externa completaen wenigen
Einzelfällen Sinn. En MySQL, este operador no está oculto. Wir verwenden diesen Operador
también nur, wenn wir ihn definitiv benötigen. En SQL Server, debemos tener una conexión
natural mediante la escritura. Wir schreiben in unserem letzten Beispiel daher:

SELECCIONAR Personal.Persnr, Nombre, COUNT (AuftrNr) COMO AnzahlAuftrag Personal


DE LEFT OUTER JOIN Auftrag
ON Personal.Persnr = Auftrag.Persnr
GRUPO POR Personal.Persnr, Nombre;

Wir warnen ausdrücklich vor der Verwendung des BezeichnersNaturalin der


Datenbankprogrammierung. Die Gefahr besteht, dass im Laufe der Zeit in einer Relation ein
4.1 La selección de Abfragebefehl 129

Attribut hinzugefügt wird, das mit gleichem Namen bereits in otra relación existente. Ein
natürlicher Verbund zwischen diesen Relationen würde dieses Attribut nun mit einbinden,
was so nie beabsichtigt war! Oracle ab Version 10 optimiert komplex Select-Ausdrücke
durch Entfernen nicht mehr benötigter Attribute aus Teilausdrücken. Dies führt in Oracle
in Einzelfällen zu Fehlern, da dann der natürliche Verbund zum Kreuzprodukt entarten
kann. Daraus siguió:

I consejoWir vermeiden in Anwendungsprogrammen den OperadorUnión natural


und verwenden stattdessen die Varianten mit dem BezeichnernEnyUsando.

Noch eine Besonderheit weist der OperadorUnión naturalauf: Alle Attribute der
Ergebnisrelation besitzen eindeutige Namen, da Attribute gleichen Namens
zusammengefasst werden. Dos relaciones son por una relación natural casi
verschmolzen, por lo que dass in diesem Select-Befehl diese Relationennamen nicht mehr
zur Verfügung stehen. Eine Qualifizierung von Attributnamen, beispielsweise durch
Personal.PersnroderNombre personal, ist daher grundsätzlich nicht mehr möglich. Bei
Verwendung des Bezeichners Usandosind die Einschränkungen geringer: Nur die im
BezeichnerUsandoangegebenen Attribute dürfen nicht mehr qualifiziert werden. Dies
macht auch Sinn. Es gibt eben nur nochpersonay nochePersonal.PersnryAuftrag.Persnr,
um beim obigen Beispiel zu bleiben.

4.1.9 Orden por Klausel

Wir wissen, dass in related Datenbanken alle Relationen ungeordnet sind. Andererseits
wünscht der Anwender fast immer geordnete Daten. El álgebra relacional se adapta a este
problema sin respuesta. Aquí están los Ermitteln der Daten im Vordergrund. Las bisagras de la
norma SQL se establecen en la práctica, indem es als abschließende Klausel im Select-Befehl
eineOrdenar por-Klausel anbietet. Este Klausel sortiert den komplettenSeleccionar-Befehl nach
entsprechenden Angaben. Soll etwa zunächst nach der dritten Spalte und bei Gleichheit noch
nach der zweiten Spalte geordnet werden, so werden diese Vorgaben, durch Komma getrennt,
nacheinander geschrieben. Als Bezeichner werden entweder die Spaltennamen oder die
Spaltennummern verwendet. En la relaciónPersonalwürden die beiden folgendenOrdenar por
-Klauseln die gewünschte Sortierung durchführen:

ORDENAR POR 3, 2
ORDENAR POR Ort, Nombre

en derOrdenar por-Klausel sind nur Namen oder Spaltennummern (¡comienza en 1!)


erlaubt, jedoch keine Ausdrücke. Ein komplexer Spaltenausdruck kann daher zum Sortieren nur
verwendet werden, wenn entweder direkt die Spaltennummer oder im Spaltenausdruck der
Spaltenliste noch ein Aliasname mit angegeben wird.
130 4 Die Zugriffssprache SQL

SQL unterstützt aufsteigendes wie auch absteigendes Sortieren, wobei in Zeichenketten


standardmäßig nach dem zugrundeliegenden Zeichencode (z. B. ASCII, Unicode) sortiert wird.
Die Sortierreihenfolge wird durch die Angabe der Bezeichnerasc(ascendente, aufsteigend) und
Descripción(descendente, absteigend) festgelegt. Bei fehlender Angabe wird immer eine
aufsteigende Sortierung vorgenommen. Wollen wir beispielsweise alle Wohnorte der
Mitarbeiter sortiert ausgeben, wobei uns vor allem interessiert, in welchen Orten die meisten
Mitarbeiter wohnen, so könnten wir schreiben:

SELECCIONAR Ort, CONTAR (*) COMO Anzahl


DE Personal
GRUPO POR ORT
PEDIDO POR Anzahl DESC, Ort;

Zunächst wird absteigend nach der Anzahl sortiert. Bei gleicher Anzahl werden die
Wohnorte alfabético ausgegeben. Die letzte Zeile hätten wir auch wie folgt schreiben
können:

ORDENAR POR 2 DESC, 1 ;

Letzteres trägt aber nicht unbedingt zur Lesbarkeit des Programmcodes bei. Wir empfehlen,
die Attributnamen zu verwenden und nicht die Spaltennummern.

4.1.10 Función nula y fusión

In der Praxis gibt es in einer Datenbank oft mehr Nullwerte als einem lieb is. Hemos
tenido estos problemas nulos en el manejo de los operadoresEs nuloen Abschn.4.1.4y bei
den Attributfunktionen en Abschn.4.1.3trachtet und dort auf Probleme bisagrawiesen.
Wir gehen aquí en los detalles y zeigen insbesondere einige Fallen auf. Der Anfänger fragt
sich vermutlich, warum sich in SQL alle Nullwerte voneinander unterscheiden. Bei der
Behandlung des OperadoresEs nuloHaben wir eine Falle bereits kennen gelernt: Wir
dürfen den WertNulonie mit Vergleichoperatoren kombinieren. Wir verwenden
stattdessen immer die OperadoresEs nulooderNo es nulo, aber nie „= nulo“. Dass dieses
Verbot von Nullwerten zusammen mit Vergleichsoperatoren durchaus Sinn macht, zeigen
wir an einem Beispiel:

SELECCIONAR Nombre, Gehalt, Vorgesetzt


DE Personal
DÓNDE Vorgesetzt = ( SELECCIONAR Vorgesetzt
DE Personal
DÓNDE Persona = 1 );
4.1 La selección de Abfragebefehl 131

Hier geben wir alle Mitarbeiter aus, die den gleichen Vorgesetzten wie Mitarbeiterin 1
haben. Mitarbeiterin 1 hat aber keinen Vorgesetzten, folglich gibt es keinen weiteren
Mitarbeiter mit dem gleichen Vorgesetzten. Wir erwarten daher eine leere Ausgabeliste.
Und genau dies leistet SQL: Der Unterselect-Befehl liefert den WertNulo. Mitarbeiterin 6
besitzt im AttributVorgesetztzwar ebenfalls den WertNulo, aber ein Vergleich mit
Nullwerten liefert schließlich immer den WertFALSOzurück. Entsprechend wird auch
Mitarbeiterin 1 selbst nicht ausgegeben.
Eine weitere Falle wurde in Abschn.4.1.3gestellt. Dort haben wir die
Jahrespersonalkosten mit dem folgenden Befehl ausgegeben:

SELECCIONAR SUMA( 12*Gehalt+1000*(6-Beurteilung))


AS Jahrespersonalkosten
DE Personal ;

¡Dieser Befehl liefert ein falsches Ergebnis! Betrachten wir dazu die Relación original
Personalen la pestaña.10.4. Soy atributobeurteilunggibt es einen Nullwert für Mitarbeiter 9. In
diesem Fall ist der Ausdruck1000 * (6-Beurteilung)indefiniert und damit ebenfallsNulo. Das
Hinzufügen von zwölf Gehältern ändert daran nichts. Somit ist der Gesamtausdruck für
Mitarbeiter 9 gleich Null. En Aggregatfunktionen werden Nullwerte nicht mit gezählt. ¡Als
Summe erhalten wir also die Jahrespersonalkosten ohne Mitarbeiter 9! Dies war so natürlich
nicht vorgesehen.
Um den obigen Befehl zu retten, müssen wir angeben, wie mit Nullwerten umzugehen
ist. Erhält jeder Mitarbeiter ohne Beurteilung eine kleine Provision von 1000 Euro, so
können wir mit Hilfe der in SQL definierten FunktionJuntarseschreiben:

SELECCIONAR SUMA (12 * Gehalt + COALESCE(1000*(6-Beurteilung), 1000))


AS Jahrespersonalkosten
DE Personal ;

La funciónJuntarseüberprüft den ersten Parameter. Ist dieser Wert ungleichNulo, so


wird er als Funktionswert zurückgegeben. Esta es la bisagraNulo, por lo que el segundo
parámetro se cambiará como función. Ist der Ausdruck für die Provision in unserem
Beispiel also gleichNulo, así que estaremos Nullwert aquí por el Wert 1000 ersetzt.

Sehr häufig benötigen wir die FunktionJuntarseen Zusammenhang mit dem äußeren
Verbund. Ein kleines Beispiel soll dies aufzeigen. In einer kleinen Erweiterung zum letzten
Abschnitt wollen wir nicht ausgeben, wie viele Aufträge jeder Mitarbeiter betreut, sondern wie
hoch die Gesamtsumme aller betreuten Aufträge ist. Jetzt müssen wir zusätzlich auf die
RelationAuftragspostenZugreifen:

SELECT Persnr, Nombre, COALESCE( SUM (Gesamtpreis), 0) AS Summe


DESDE Personal UNIÓN EXTERNA IZQUIERDA NATURAL
(Auftrag NATURAL INNER JOIN Auftragsposten)
GRUPO POR Persona, Nombre;
132 4 Die Zugriffssprache SQL

Veremos aquí la función de agregaciónSuma. Esta liefert den WertNulo, wenn


ausschließlich über Nullwerte summiert wird. Für die sieben Mitarbeiter, die keinen
Auftrag betreut haben, ist dies der Fall. Wir ersetzen mit Hilfe der Coalesce-Funktion
diesen Nullwert durch die Zahl 0. Als Übung sei empfohlen, diesen Befehl ohne den
äußeren Verbund zu erstellen. Wir benötigen in this Fall no tiene función Coalesce. Wir
empfehlen zusätzlich, den Natural Join durch den BezeichnerEnoderUsandozu ersetzen.

4.1.11 Arbeitsweise des Select-Befehls

Der Select-Befehl ist extrem umfangreich und erfordert daher viel Übung, um ihn wirklich zu
beherrschen. Wir wollen hier einige Hilfestellungen geben. Enorme es el
Abarbeitungsreihenfolge des Select-Befehls. Esto está en la pestaña.4.11angegeben und ist
dringend zu beachten. Im ersten Schritt wird die From-Klausel ausgewertet, eventuelle
Kreuzprodukte und Verbunde werden durchgeführt. Im zweiten Schritt wird die Where-Klausel
behandelt und erst dann die Select-Klausel. Wir empfehlen auch, einen Select-Befehl genau in
dieser Reihenfolge zu lesen.
Im vierten und fünften Schritt erfolgt die Group-By- und die Have-Klausel. Más
seguidores de los operadores masculinosUnión,IntersecarseyExceptound abschließend
die Sortierung. Este manual es también útil, ya que tenemos un banco de datos
actualizado y todas las opciones seleccionadas son válidas. Wir gehen dann in der
gleichen Reihenfolge vor:
Wer ermitteln die involvvierten Relationen und erstellen die notwendigen Verbindungen
mittels des Verbunds oder Kreuzprodukts. Si se aplican restricciones, es posible que estas se
implementen con un código de ubicación. Weiter geben wir mittels einer Projektion nur die
gewünschten Attribute aus. Eventuell folgen Gruppierungen und Vereinigungen. Ganz zum
Schluss beschäftigen wir uns mit der Sortierung.

Pestaña. 4.11Logische Abarbeitungsreihenfolge des Select-Befehls

Kreuzprodukt, Verbund: Alle in der Tabellenliste angegebenen


1
Relationen werden miteinander verknüpft.
Restricción: Aus dieser verknüpften Relation werden die Tupel
2
ausgewählt, die die die angegebene WHERE-Bedingung erfüllen.
Proyección: Mittels der Spaltenauswahlliste werden die angegebenen
3
Spalten ausgewählt.
Grupo: Jeweils gleiche Tupel werden zusammengefasst. Angegebene
4
Aggregierungen werden durchgeführt.
2. Restricción: Nach der Gruppierung werden die Tupel gewählt, die die die
5
angegebene HAVING-Bedingung erfüllen.
Vereinigung, Schnitt, Differenz: Alle in Schritt 1 bis 5 erstellten
6
Hauptteile des Select-Befehls werden miteinander verknüpft.
Sortierung: Die Ergebnisrelation wird gemäß der Order-By-Klausel
7
sortiert.
4.2 Mutaciones befehle en SQL 133

4.2 Mutaciones befehle en SQL

So umfangreich und komplex derSeleccionar-Befehl ist, so einfach und übersichtlich sind die
weiteren Zugriffsbefehle. Estas nuevas condiciones y las fechas especificadas. En la pestaña.
4.12sind die drei Mutationsbefehle aufgeführt.
Beginnen wir mit demEliminar-Befehl . La sintaxis indicada:

ELIMINAR DE Nombre de tabla [ [ COMO ] Nombre de alias ]


[ DÓNDE Bedingung ]

Die Where-Klausel entspricht exakt der gleichnamigen Klausel im Select-Befehl,


insbesondere sind Unterabfragen zugelassen. El nombre de la tabla puede contener un
alias. Así es sichergestellt, dass die globale Relation immer in Unterabfragen verwendet
werden kann. Der Delete-Befehl löscht alle Tupel der angegebenen Relation, die die
Bedingung in der Where-Klausel erfüllen. Scheidet etwa Frau Rank aus der Firma aus, so
wird der entsprechende Eintrag in der Personaltabelle durch den folgenden Befehl
entfernt:

ELIMINAR DE Personal
DONDE Nombre = 'Rango Úrsula';

Wir müssen mit diesem Befehl vorsichtig umgehen. Der folgende Befehl löscht
beispielsweise alle Einträge in der RelationPersonal, da keine Restriction vorliegt:

ELIMINAR DE Personal;

Wir denken daher immer daran, dass wir nicht versehentlich am Ende der ersten Zeile eines
komplexen Delete-Befehls ein Semikolon setzen!
Geringfügig komplexer ist derActualización-Befehl . Schließlich müssen wir jetzt zusätzlich
wissen, welche Attribute wir auf welche Weise ändern wollen. La sintaxis es la frase de Befehls:

ACTUALIZAR Nombre de tabla [ [ AS ] Nombre de alias ] Spalte =


COLOCAR Spaltenausdruck [ , ... ]
[ DÓNDE Bedingung ]

Pestaña. 4.12Mutaciones befehle en SQL

ACTUALIZAR Ändert bestehende Einträge


INSERTAR Fügt neue Tupel (Zeilen) ein
BORRAR Löscht bestehende Tupel (Zeilen)
134 4 Die Zugriffssprache SQL

Ein Update-Befehl bezieht sich immer auf eine zu ändernde Relation, die nach dem
BezeichnerActualizaranzugeben ist. Die zu ändernden Attribute werden, voneinander durch
Kommata getrennt, nach dem BezeichnerColocarzusammen mit den neuen Werten
angegeben. Sollen nicht alle Tupel geändert werden, so kann mittels derDónde-Klausel eine
Restriction erfolgen. EstoDónde-Klausel entspricht wieder eins zu eins derDónde-Klausel des
Seleccionar-Befehls.
Nuevo sind die BezeichnerSpalteySpaltenausdrucknicht. Wir kennen sie bereits aus der
Syntax des Select-Befehls. Unter Spalte verstehen wir einen Spaltenname und der
BezeichnerSpaltenausdruckwurde en Abschn.4.1.3bei der Behandlung der Select-Klausel
ausführlich besprochen. Sogar ein Select-Befehl, der einen eindeutigen Wert liefert, ist
hier erlaubt. Tanto Oracle, SQL Server y MySQL completan esta sintaxis completa.

Wir zeigen die Funktionsweise dieses Befehls an einem Beispiel auf. Um etwa allen
Mitarbeitern, die weniger as 3000 Euro verdienen, eine Gehaltserhöhung von 5% zukommen zu
lassen, genügt ein einzigerActualizar-Befehl:

ACTUALIZAR Personal
COLOCAR Gehalt = 1,05 * Gehalt Gehalt
DÓNDE < 3000;

Die Mächtigkeit dieses Befehls liegt in den vielfältigen Möglichkeiten, Tupel mittels der
Dónde-Klausel auswählen zu können. Übrigens darf ein Attribut auch auf den Wert Nulogesetzt
werden, etwa in der Form „Establecer estado = nulo“.
Zuletzt betrachten wir noch den EinfügebefehlInsertar . Damit können wir einen oder
mehrere neue Tupel in eine bestehende Relation hinzufügen. Eine vereinfachte Sintaxis lautet:

INSERTAR EN Nombre de tabla [ ( Spaltenliste ) ]


FVALORES ( Auswahlliste ) [, ... ] | Seleccione-
Befehlgramo

Para completar la sintaxis SQL2 entre Fecha y Darwen (1998) verwiesen. Die hier vorgestellte
Syntax ist in der Praxis voll ausreichend. Wir fügen también mit demInsertar- Befehl entweder
neue Zeilen mit den in der Auswahlliste angegebenen Werten ein, oder wir generieren mit Hilfe
eines beliebigenSeleccionar-Befehls (ohneOrdenar por-Klausel) die gewünschten Zeilen. Eine
Auswahlliste ist eine Kommaliste von einzelnen Angaben. Sind in der Auswahlliste weitere
Elemente vorhanden als in der Spaltenliste angegeben, so werden die weiteren Attribute mit
Nullwerten aufgefüllt. Estas funciones se encuentran también para el atributo en lugar de ellas,
pero no se incluyen en la lista de spalten. Wird die Spaltenliste weggelassen, so werden die
Attribute in der Reihenfolge angenommen, in der sie in der Definition der Relation festgelegt
wurden. Es versteht sich von selbst, dasser dieser Einfügebefehl mit einer Fehlermeldung
zurückgewiesen wird, wenn die Datentypen in der
4.2 Mutaciones befehle en SQL 135

Auswahlliste oder im Select-Befehl nicht mit den Datentypen in der Spaltenliste


kompatibel sind. Dies gilt ebenso, wenn Spalten nicht angegeben werden, die keine
Nullwerte erlauben.
Wir können beispielsweise dos nuevos Mitarbeiter wie folgt in unsere Personaltabelle (siehe
Tab.4.1) aufnehmen:

INSERTAR EN Personal (Persnr, Nombre, GebDatum, Ort)


VALORES (10, 'Lars Anger', FECHA '1980-01-13', 'Augsburgo'), (11, 'Karl Meier',
FECHA '1983-05-15', 'Darmstadt');

Die Reihenfolge der Angaben in der Spaltenliste und der Auswahlliste muss
aufeinander abgestimmt sein. Die weiteren existierenden AtributoVorgesetztyGehalt
werden durch Nullwerte vorbelegt und können durch einenActualizar-Befehl jederzeit
nachträglich gesetzt werden. Este Befehl incluye MySQL y SQL Server en su forma
preferida. En Oracle ist bisagragen immer nur eine einzelne Auswahlliste erlaubt. Der
Befehl muss in Oracle in zwei Einzelbefehle zerlegt werden:

INSERTAR EN Personal (Persnr, Nombre, GebDatum, Ort)


VALORES (10, 'Lars Anger', FECHA '1980-01-13', 'Augsburgo');

INSERTAR EN Personal (Persnr, Nombre, GebDatum, Ort)


VALORES (11, 'Karl Meier', FECHA '1983-05-15', 'Darmstadt');

Heer sei kurz auf das Problem der Datumswerte eingegangen. Wir können ein
Datum immer as Zeichenkette der Form'JJJJ-MM-TT’Schreiben und davor den
OperadorFecha setzen. En este caso, garantizamos la norma, y estos datos están
corregidos en el país de origen. Estoy en SQL Server con el operadorFecha allerdings
weglassen. Wir gehen ausführlicher auf Datumsangaben in Abschn.5.1ein.
Sind in einer Relation Werte aufzunehmen, die bereits in einer anderen Relation existieren,
so empfiehlt sich die Verwendung derSeleccionar-Abfragio. Soll etwa der neue Mitarbeiter Lars
Anger das gleiche Gehalt und den gleichen Vorgesetzten wie Herr Noster (Persnr 7) erhalten,
so können diese Daten direkt aus der RelationPersonalübernommen werden:

INSERTAR EN Personal(Persnr, Nombre, GebDatum, Vorgesetzt, Gehalt)


SELECCIONAR 10, 'Lars Anger', FECHA '1980-01-13', Vorgesetzt, Gehalt Personal
DE
DÓNDE Persona = 7 ;

Wir erkennen, dass wir bestehende Angaben aus anderen Relationen übernehmen und
fehlende entsprechend den Möglichkeiten der Select-Klausel direkt als Konstante einsetzen
können. Mit Hilfe der Select-Abfrage im Insert-Befehl können natürlich auch mehrere Tupel auf
einmal eingefügt werden.
Zu weiteren Detalles sei auf Date und Darwen (1998), Faeskorn-Woyke (2007), Van der
Lans (2007), Melten y Simon (2001), Unterstein y Matthiessen (2012) und weitere
Literaturhinweise am Ende des Kapitels verwiesen.
136 4 Die Zugriffssprache SQL

4.3 Transacciones con SQL

Die Mutationsbefehle aus dem letzten Abschnitt müssen gegenüber dem reinen Abfragebefehl
Seleccionarsehr sorgfältig überlegt werden. Schließlich ändern wir jetzt den Inhalt einer
Datenbank! Jede dieser Änderungen kann zu Inkonsistenzen führen, ganz zu schweigen vom
kompletten Löschen ganzer Relationen. Wir möchten daher versehentliche Änderungen
ungeschehen machen können und landen sofort bei den Transaktionen aus den Abschn.1.5y1.6
. Transaktionen sind die Basis jedes modernen und sicheren Datenbankbetriebs. Die
Zugriffssprache SQL unterstützt den Transaktionsbetrieb hervorragend. La fiesta legal de la
norma ISO, con los registros en un banco de datos comienza automáticamente una
transacción. Mit jedem Befehl

COMPROMETER [ TRABAJO ] ;

wird eine Transaktion erfolgreich abgeschlossen. Das Datenbankverwaltungssystem wird dafür


sorgen, dass mit diesem Befehl alle während dieser Transaktion durchgeführten Mutationen
endgültig und persistente (dauerhaft) in der Datenbank gespeichert werden. Wir können uns
bildlich vorstellen, dass alle geänderten Daten mit dem BefehlComprometerse en Stein
gemeißelt werden. Ein einfaches Zurücknehmen der Änderungen ist jetzt nicht mehr möglich.

Umgekehrt können alle noch nicht mit dem BefehlComprometersegeänderten Daten ganz
einfach annulliert werden. Mit dem Befehl

RETROCEDER [ TRABAJO ] ;

werden alle Mutationen der aktuell laufenden Transaktion zurückgesetzt, unabhängig


davon, ob und wie viel wir schon eingefügt, gelöscht oder geändert haben. Es ist die Aufgabe
des Datenbankverwaltungssystems, dies immer zu ermöglichen und zu garantieren. Dass die
Datenbank deshalb eine Fülle von Daten sicher zwischenspeichern muss, können wir uns
vorstellen. Darum kümmern müssen wir uns als Anwender aber nicht.
Con esta función garantizada SQL, dass ein Datenbankbetrieb ausschließlich als
Transaktionsbetrieb abläuft. La primera transacción comenzó después de los registros en el banco de
datos, la segunda después del primer compromiso (bzw. Rollback) y así sucesivamente. Dabei ist zu
beachten, dass eine Transaktion immer genau an Konsistenzpunkten endet.
Wir greifen nochmals das Beispiel aus Abschn.1.5auf and betrachten eine Buchung von
1000 Euro von KontoAdespués del contactoB. Wir benötigen dazu vermutlich einige
Lesezugriffe und genau dos Mutationen. Estas mutaciones se realizan de forma vereinfacht:

ACTUALIZAR Banco SET Saldo = Saldo - 1000 SET DONDE Konto = 'A';
ACTUALIZAR Banco Saldo = Saldo + 1000 DONDE Konto = 'B';

Es ist offensichtlich, dass nach dem erstenActualizar-Befehl die Datenbank es inconsistente.


Wir dürfen daher erst nach dem dosweitenActualizar-Befehl einen Konsistenzpunkt mittels
4.4 Álgebra relacional y SQL 137

desComprometerse-Befehls setzen. Beide Befehle zusammen werden también als eine Einheit
betrachtet und laufen atomar ab. El BuchstabeAfür Atomarität im ACID-Konzept, siehe Abschn.
1.6, wird monja voll erfüllt.
En la práctica, se incluyen las transacciones de Oracle, Microsoft SQL Server y
todos los grandes bancos de datos como DB2 de IBM. También MySQL actualiza las
transacciones con la versión 5.1 en el motorInnoDBein. Erfreulicherweise es InnoDB
inzwischen sowohl en Windows y también en Unix como modelo estándar. Es muy
útil, MySQL ahora no utiliza este motor. Una pequeña abweichung von der SQL-
Norm liegt en SQL Server para: Aquí debe una transacción explícita con el Befehl

COMENZAR LA TRANSACCIÓN;

Begonnen und dann mit dem BefehlComprometerseoderRetrocederbeendet werden.


Este Ausnahme gibt es teilweise auch bei der Internet-Programmierung. Beispielsweise
bietet PHP eine datenbankunabhängige Schnittstelle an: PHP Database Objects (PDO). No
todos los bancos de datos tienen mecanismos de transacción ocultos, como SQL Server, y
deben realizarse explícitamente en estas transacciones de compatibilidad. Estamos en
Kap.6darauf zurück.

4.4 Álgebra relacional y SQL

SQL unterstützt Kreuzprodukt, Restriktion, Projektion, Vereinigung, Differenz und


Umbenennung. Estos operadores son relevantes para el álgebra relacional, como
Abschn.2.5.5. Con SQL también se puede utilizar el álgebra relacional. Als kleine
Ergänzung se encuentran en la Tab.4.13Estos fünf operadores de joyasSeleccionar-
Befehlen gegenübergestellt. Dabei stehenR1yR2para relaciones, morirXipara
atributos ybpara una cama beliebige. Zusätzlich haben wir auch die Operadores
Verbund ySchnittmit aufgeführt.
Cuando estamos en los bancos de datos, sollten wir uns immer die Operadores de
álgebra relacional und ihre Wirkungsweise in Erinnerung rufen. Los operadores de SQL
que utilizan SQL solucionan un problema que no se puede resolver.
Wir sehen mit this Zusammenfassung, dass in SQL the Grundoperativeen der
relacionaalen Algebra immer nachgebildet werden können. Dies bedeutet, dass SQL eine
umfassende Zugriffssprache ist, mit der wer alle relevanten Daten einer relacionalen
Datenbank abfragen können.
Die Division fehlt in der Aufzählung in Tab.4.13, pero esto en SQL no se implementa.
Gegebenenfalls müssen wir auf die nicht ganz einfache Ersatzdarstellung zurückgreifen.
Este lautet, siehe Abschn.2.5.5:

-- - -
R1 R2D -R1:X.R1/norte -R1:X-R1:X.R1/ R2 norteR1
138 4 Die Zugriffssprache SQL

Pestaña. 4.13 Vergleich: Álgebra relacional – SQL

Operador Álgebra SQL2


SELECCIONAR * DE R1 UNIÓN
Vereinigung 1∪2
SELECCIONAR * DE R2
Kreuzprodukt 1 ×2 SELECCIONAR * DE R1, R2
restricción () SELECCIONE * DESDE R DONDE b
proyección () SELECCIONE x1, ..., xn DESDE R
SELECCIONAR * DE R1 EXCEPTO
diferencia 1∖2
SELECCIONAR * DE R2
Verbund 1⨝2 SELECCIONAR * DE R1 UNIÓN NATURAL R2
SELECCIONAR * DESDE R1 INTERSECTAR
Schnitt
SELECCIONAR * DESDE R2

Más aquíR1yR2Relaciones yR1:Xsind die Attribute, die in der RelationR2nicht


vorkommen. En Abschn.2.5.4Hatten wir eine Anfrage mittels relacionaaler
Operatoren e insbesondere der Division gelöst. Diese Anfrage lautete: „Geben Sie
alle Lieferanten an, die mindestens die gleichen Artikel wie Lieferant 3 ausliefern.“
Wir wollen this Anfrage auch mit SQL lösen und greifen dazu auf the RelationLieferung
también Tab.10.11zu. Esta relación enthält zu jedem Lieferanten (Liefnr) el artículo (anr),
den dieser Lieferant ausliefert. Die weiteren Attribute dieser Relation benötigen wir hier
nicht. Wir betrachten zunächst die Lösung aus Abschn.2.5.4con Hilfe del álgebra
relacional:
R1D -ANr;Liefnr.Lieferung/
R3D -ANr.-Liefnr=3.R1//
R4DR1 R3
Dabei esR1Una proyección de la relación.LieferungAuf die für uns wesentlichen Atributo
anryLiefnr.R3enthält alle vom Lieferanten 3 gelieferten Artikel undR4ist schließlich die
gesuchte Lösung. Cuando se incorporan las modificaciones necesarias para la división,
podemos crear un complejo de SQL Server erforderliche. Dies sei als Übung empfohlen!

Además, SQL no compatible con el grupo y los componentes integrados. Wir


stellen hier eine recht interessante Lösung unserer Anfrage mittels eben dieser
Gruppierung und Unterabfragen vor:

SELECCIONAR Liefnr
DE Lieferung
DONDE Anr EN ( SELECCIONAR Anr
DESDE Lieferung
DONDE Liefnr = 3)
GRUPO POR Liefnr
TENER CUENTA(*) = (SELECCIONE CUENTA(*)
DESDE Lieferung
DONDE Liefnr = 3);
4.5 Fassammenfassung 139

In der Where-Klausel berechnen wir im Unterselect-Befehl alle Artikel, die Lieferant 3 liefert,
also genau die RelationR3. Wir schränken también muere la relaciónLieferungauf alle Tupel ein,
die einen dieser Artikel aus RelationR3enthalten. Nur ein Lieferant, der die gleichen Artikel wie
Lieferant 3 ausliefert, kommt genauso oft in dieser Restriktion vor wie Lieferant 3. Und genau
diese estos Lieferanten werden mit Hilfe der Gruppierung und anschließender Restriktion in
der Have-Klausel ausgewählt.
Este es un SQL típico: Es gibt fast immer mehrere Wege, die zum Ziel führen. Hemos tenido
aquí un nuevo producto Kreuzprodukt und die Differenz gespart. Andererseits musten dos
Unterabfragen durchgeführt werden. Und es gehört schon etwas Feingefühl und vor allem
Erfahrung dazu, solche Lösungen zu finden.

4.5 Fassammenfassung

Nur vier Befehle sind zum Zugriff auf Datenbanken erforderlich:Seleccionar,Actualizar,Insertar


yBorrar. Jeder Anwendungsprogrammierer kann damit lesend und schreibend Datenbanken
Bearbeiten. Si weitere Befehle benötigt er nur noch die BefehleComprometersey Retroceder,
um den Transaktionsbetrieb sicher zu stellen.
Während die ManipulationsbefehleActualizar,InsertaryBorrarsowohl in ihrem syntaktischen
Aufbau als auch in ihrer Handhabung relativ leicht verständlich sind, ist der Abfragebefehl
Seleccionarkomplex und umfangreich. Zur Beherrschung dieses Befehls müssen wir mit
folgenden Punkten vertraut sein:

- Wir kennen die Abarbeitungsreihenfolge desSeleccionar-Befehls, así como en Tab.4.11


angegeben ist.

Pestaña. 4.14Abweichungen von der SQL-Norm bei DML-Befehlen

Abweichungen von der SQL-Norm


BézeichnerComoist en From-Klausel nicht erlaubt.
Fehlerhafte Ausgabe bei geschachteltem Natural Join.
Oráculo OperadorExceptoes porMenoszu ersetzen.
Sintaxis propia para la funciónSubcadena:Substr(str,pos,anz). Im
Insert-Befehl ist nur eine Values-Angabe erlaubt.
Select-Befehl in der From-Klausel erfordert einen Aliasnamen. El
BezeichnerNaturalyUsandowerden nicht unterstützt. Sintaxis propia
SQL
para funcionesSubcadena:Subcadena (cadena, pos, anz). Operador de
Servidor
repartoFechaist nicht erlaubt.
La transacción debe realizarseComenzar transaccióneingeleitet werden.
Select-Befehl in der From-Klausel erfordert einen Aliasnamen.
Den Aggregatfunktionsnamen darf kein Leerzeichen folgen. Beim
Natural Inner Join ist der BezeichnerInternonicht erlaubt. La
mysql
unión externa completa no se altera.
OperadoresExceptoyIntersecarsewerden nicht unterstützt. Las
transacciones se realizan únicamente en el motor.InnoDBunterstützt.
140 4 Die Zugriffssprache SQL

- Wir setzen den Verbund (Unirse) gezielt ein. Er wird in der Praxis in fast jeder zweiten
Abfrage benutzt.
- Wir verwenden Unterabfragen in der Where-Klausel. Wir beachten dabei die Gültigkeit der
lokalen und globalen Attribute.
- Wir verwenden bei Bedarf die Gruppierung zusammen mit den Aggregatfunktionen, um
sehr einfach statsische Auswertungen zu erhalten.

Durante intensivos y fleißiges Üben wird derSeleccionar-Befehl schnell seinen Schrecken


verlieren. Im Gegenteil, es wird bald sehr viel Freude bereiten, mit diesem wirklich mächtigen
Werkzeug anspruchsvolle Aufgaben zu lösen.
Eine Normierung ist immer wünschenswert. Los registros de datos del banco de datos
no son compatibles con la norma SQL. Wir geben en la pestaña.4.14Aquí hay un pequeño
resumen, como Oracle, SQL Server y MySQL entre las normas SQL. Im Vergleich mit der
Mächtigkeit der SQL-Befehle bleiben diese Unterschiede aber tolerierbar. Alle
aufgezählten Abweichungen können umgangen werden.

4.6 Übungsaufgaben

Aufgaben
Die folgenden Aufgaben beziehen sich ausnahmslos auf die Relationen der
BeispieldatenbankBicicletaanexo.

1. Schreiben Sie einenSeleccionar-Befehl, der aus der RelationPersonalLos nombres de las


personas autorizadas cuestan más de 3.000 euros.
2. Geben Sie mittels einesSeleccionar-Befehls die Gesamtanzahl der für Aufträge
reservierten Artikel aus (die benötigten Informationen stehen in der Relation
Reserva).
3. Geben Sie mittels einesSeleccionar-Befehls alle Artikel der Relationcerveza dorada(Pestaña.10.9)
aus, dessen Bestand abzüglich des Mindestbestands und der Reservierungen unter den Wert
3 gesunken ist. Als Ausgabe werden Artikelnummer und Artikelbezeichnung erwartet.

Lager: Esta relación enthält neben dem Artikel den Lagerort und den Bestand. Weiter
wird ein Mindestbestand, die Anzahl der reservierten sowie der bereits bestellten
Stücke gespeichert. Nicht jedes in der RelationArtículoangegebene Teil muss in dieser
Relation enthalten sein. Teile, die weder auf Lager, noch reserviert oder bestellt sind,
brauchen hier nicht aufgeführt werden.
4. Aus wie vielen Einzelteilen bestehen alle zusammengesetzten Artikel? Bestimmen
Sie diese Stückzahlen mittels einesSeleccionar-Befehls. Falls ein Einzelteil wieder
aus noch kleineren Einzelteilen besteht, so ist dies nicht weiter zu berücksichtigen.
Ausschlaggebend zur Ermittlung der Anzahl der Einzelteile ist das AttributAnzahl
ohne Rücksichtnahme auf die Einheit ("ST" o "CM").
Literatura 141

5. Geben Sie alle Artikel aus, die vom Auftrag mit der Auftragsnummer 2 reserviert sind.
Geben Sie dazu zu jedem Artikel die Artikelnummer, die Artikelbezeichnung und die
Anzahl der für diesen Auftrag reservierten Artikel aus. Lösen Sie die Aufgabe einmal
unter Verwendung des OperadoresUnirseund einmal ohne diesen Operador (también
mit Kreuzprodukt und Resriktion).
6. Modifique las opciones de encendido 5 días, dasstodos Artículo de la relaciónArtículo
ausgegeben werden (äußerer Verbund) und nicht nur die reservierten. Für die nicht für
Auftrag 2 reservierten Teile is die entsprechende Spaltenangabe zu den
Reservierungen auf den Zahlenwert 0 zu setzen. Schreiben Sie denSeleccionar-Befehl
einmal ohne und einmal mit Verwendung des OperadoresUnión externa. Achtung: Ein
Where-Teil nach dem Outer Join zerstört diesen. Die benötigte Restriktion muss
deshalb vor dem Outer Join ausgeführt werden!
7. Es sind sieben neue Sättel eingetroffen. Modifique los datos del banco de datos.
8. Es wird ein Damen-Mountainbike ins Sortiment aufgenommen. Weitere Angaben
sind: ANr 100003, Preis 650.00, Nettopreis 560.34, Steuer 89.66, Mass 26 Zoll,
Einheit ST, Typ E. Nehmen Sie dieses Fahrrad in die RelationArtículoauf.
9. Die Lieferantin „Firma Gerda Schmidt“ wird auch Kundin mit der Kundennummer 10.
Nehmen Sie die Lieferantin auch in die Kundenrelation auf. Die benötigten Daten
sind direkt der Lieferantenrelation zu entnehmen.
10. Löschen Sie alle Artikel aus der Relationcerveza dorada, deren Bestand auf 0 gesunken ist.
11. Erhöhen Sie das Gehalt aller Mitarbeiter um 100 Euro, bei denen die Beurteilung 1
eingetragen ist. Senken Sie gleichzeitig die Beurteilung um eine Notenstufe.
12. Geben Sie zu allen Mitarbeitern (persona,Nombre) die Gesamtumsatzsumme der von
ihnen betreuten Aufträge an. Es liegt ein äußerer Verbund vor. Schreiben Sie diesen
Befehl ohne Verwendung des BezeichnersNaturaly einmal mit und einmal ohne
Verwendung des Outer-Join-Operators.
13. Geben Sie alle Lieferanten an, die mindestens die gleichen Artikel liefern wie
Lieferant 3. Verwenden Sie dazu die Division. Bilden Sie die Division mit der
Ersatzdarstellung mittels Kreuzprodukt und Differenz nach.
14. Testen Sie den Transaktionsbetrieb. Löschen Sie alle Mitarbeiter en relación
Personal. Überprüfen Sie, ob das Löschen erfolgte. Beachten Sie wegen der
Fremdschlüssel auch die RelationAuftrag. Setzen Sie jetzt die Transaktion zurück.
¿Wie wirkt sich dies aus?

Literatura

Adams, R. (2012).SQL – Eine Einführung mit vertiefenden Exkursen. Hanser.


Buchmann, A., & Smolarek, R. (2005).SQL y MySQL 5 interactivo. Omnigéna.
Churcher, C. (2016).Inicio de consultas SQL. Presione.
Connolly, T., & Begg, C. (2015).Sistemas de bases de datos(6. Aufl.). Pearson.
Fecha, CJ (2003).Una introducción a los sistemas de bases de datos(8. Aufl., Bd. 1). Addison-Wesley.
142 4 Die Zugriffssprache SQL

Fecha, C. J., &Amp; Darwen, H. (1998).SQL – El estándar. Addison-Wesley. Eirund,


H., & Kohl, U. (2010).Datenbanken – leicht gemacht. Springer Vieweg.
Elmasri, R., & Navathe, S. (2009).Grundlagen von Datenbanksystemen(3. Aufl.). Addison-Wesley.
soltero
Faeskorn-Woyke, H., Bertelsmeier, B., Riemer, P., & Bauer, E. (2007).Datenbanksysteme – Teoría
y Praxis con SQL2003, Oracle y MySQL. Pearson.
Gulutzan, P., & Pelzer, T. (1999).SQL-99 completo – De verdad. Libros de I + D. Kemper,
A., & Eickler, A. (2015).Datenbanksysteme – Eine Einführung. Oldenburgo. Kähler, W.-M.
(2008).SQL con Oracle. Vieweg-Teubner.
Kifer, M., Bernstein, A., & Lewis, P. (2005).Sistemas de bases de datos. Addison-
Wesley. van der Lans, RF (2007).Una introducción a SQL. Pearson. Loney, K. (2009).
Oracle11 g – La referencia universal. Hanser.
Marsch, J., & Fritze, J. (2002).Erfolgreiche Datenbankanwendung con SQL3. Saltador.
Meier, A. (2003).Bancos de datos relacionales: Eine Einführung für die Praxis. Springer Taschenbuch.
Meier, A. (2010).Bancos de datos relacionales y postrelacionales. Saltador. Melten, J., & Simón, A.
(2001).SQL: 1999. Morgan Kaufman. Schubert, M. (2007).Bancos de datos. Teubner.

SQL1 (1987).SQL87: lenguaje de base de datos SQL (SQL1)ISO 9075. SQL2


(1992).SQL92: lenguaje de base de datos SQL (SQL2)ISO 9075. SQL3
(1999).SQL99: Lenguaje de base de datos SQL (SQL3)ISO 9075. SQL (2003).
SQL03: Lenguaje de base de datos SQLISO 9075. SQL (2006).SQL06:
Lenguaje de base de datos SQLISO 9075. SQL (2008).SQL08: Lenguaje de
base de datos SQLISO 9075. SQL (2011).SQL11: lenguaje de base de datos
SQLISO 9075.
Sunderraman, R. (2007).Programación Oracle10: introducción. Addison-Wesley.
Unterstein, G., & Matthiessen, M. (2012).Bancos de datos relacionales y SQL en teoría y práctica.
Saltador.
Vossen, G. (1991).Modelos de datos, lenguajes de bases de datos y sistemas de gestión de bases de datos..
Addison-Wesley.
La descripción general de SQL
5

Supervisión
En Kap.4griffen wir auf Datenbestände existierender Datenbanken zu. Wir verwendeten
dazu vier SQL-Befehle,Seleccionar,Insertar,BorraryActualizar. Der Select-Befehl war dabei
besonders umfangreich. Fijamos estos Befehle unter dem Begriff Datenzugriffssprache
(Lenguaje de manipulación de datos, DML) zusammen.
Die Datenbeschreibungssprache (Lenguaje de descripción de datos, DDL) verhält sich
konträr dazu: Heer gibt es relativ viele Befehle, die dann allerdings im Aufbau einfach
sind. Es existieren Befehle zum Erzeugen, Ändern und Löschen von Tabellen und Sichten,
ebenso Befehle zum Setzen und wieder Entziehen von Zugriffsrechten auf diese Tabellen
und Sichten. Darüber hinaus gibt es Befehle, um die Integrität einer Datenbank zu
sichern, um Bedingungen zu setzen und eigene Gebiete zu definieren.

Sicherheit und Integrität sind uns sehr wichtig und werden in je einem eigenen
Abschnitt behandelt. debajoseguridad , genauer Zugriffssicherheit, verstehen wir die
Überprüfung jedes Benutzers, ob er berechtigt ist, die Dinge zu tun, die er gerade
versucht. Mittels derintegridad gewährleisten wir, dass die Dinge, die gerade versucht
werden, auch korrekt ablaufen.vor jedem Zugriff también morirá Zugriffsberechtigung
überprüft, und beim Zugriff no controlará el Korrektheit. Mit dem Setzen von
Zugriffsrechten sorgen wir die benötigte Secherheit, und beim Erzeugen der Relationen
berücksichtigen wir die Integrität.
Die Beschreibungssprache umfasst auch spezielle Befehle zur Verbesserung der
Performance. Wir vertiefen muere en Kap.7. Hinzu kommen zahlreiche Befehle zur
Datenbankadministration. Heer verweisen wir auf die Literatur der Datenbankanbieter, da
diese Befehle herstellerabhängig sind.
144 5 La descripción general de SQL

Bei den DML-Befehlen gab es bei den einzelnen Datenbankanbietern nur wenige
Abweichungen von der SQL-Norm. In der Beschreibungssprache DDL sind diese
Abweichungen leider deutlich spürbar. Estamos presentes en las principales fuentes de
información en Oracle, SQL Server y MySQL. La norma SQL contiene todos los detalles
DDL. Werden hier gezielt nur auf the wirklich wichtigen Themes eingehen, dann aber sehr
ausführlich. Für weiterführende Themen verweisen wir auf die Literatur. Es seien
insbesondere Conolly und Begg (2015), Adams (2012), Fecha y Darwen (1998), Elmasri y
Navathe (2002), Gulutzan y Pelzer (1999), Van der Lans (2007), Marsch y Fritze (2002) y
Melton y Simon (2001) empfohlen.
Este Kapitel enthält wieder viele Beispiele, die mit Hilfe der DatenbankBicicletaDirekt
geübt werden können. Hinweise zu este DatenbankBicicletaund zur Installation dieser
Datenbank gibt es im Anhang.

5.1 Relaciones con los demás

Der wichtigste Befehl der Beschreibungssprache ist der BefehlCrear mesa. Damit werden
die grundlegenden Basisrelationen erzeugt. Boinas en Abschnitt3.2hatten wir einige
einfache Beispiele aufgezeigt. Jetzt wollen wir diesen Befehl ausführlich besprechen. La
sintaxis de Create-Table-Befehls dice:

CREAR TABLA Nombre de tabla


( FSpalteFTipo de fecha | Nombre Gebietsgramo
[ Spaltenbedingung [ ... ] ] | Tabellenbedingung [ , ... ] gramo

)
[ Opciones Herstellerspezifische ]

Die verwendete Notation wurde bereits zu Beginn des Kap.4vorgestellt. Wir


wiederholen, dass wir reservierte Bezeichner in Großbuchstaben angeben. Alle weiteren
Bezeichner sind entweder Namen oder werden im Weiteren noch näher specizifiziert. Die
in eckigen Klammern stehenden Werte sind wahlfrei, und bei Angabe des senkrechten
Strichs zusammen mit geschweiften Klammern ist genau eine der Möglichkeiten
auszuwählen. Obiger Sintaxis entnehmen wir also, dass ein Create-Table-Befehl mit der
Angabe des Tabellennamens Befehl, gefolgt von una lista de atributos. Estos atributos se
identificarán según un nombre de spalten, se seleccionarán un tipo de fecha y pueden
usarse según las necesidades específicas del spaltenbedingungen. Wahlweise können in
der Attributliste auch Tabellenbedingungen verwendet werden. Sowohl die Spaltenals
auch die Tabellenbedingungen (im english:restricción de columnabzw.restricción de tabla
) legen zusätzliche Eigenschaften und damit Einschränkungen (restricciones) fest, etwa
Primärund Fremdschlüsselangaben.
5.1 Relaciones con los demás 145

5.1.1 Tipos de fecha

Los tipos de datos definidos en el estándar SQL se encuentran en la pestaña.5.1


aufgelistet. Darüber hinaus lassen sich eigene Datentypen mit Hilfe vonGebieteny el
Befehl Crear dominioDefinieren. Wir kommen in den nächsten Abschnitten darauf zurück.
Mit den objektrelationalen Datenbanken y SQL3 können Attribute auch als Felder (
Formación), Reihen (Fila) y objetos (Objeto) definiert werden, siehe hierzu Kap.9.
Die Größe der DatentypenEnteroyPequeñoist implementierungsabhängig, wobei
sichergestellt ist, dassEntero-Zahlen piensa tan groß wiePequeño-Zahlen sind. En SQL
Server y MySQL funcionanEntero-Zahlen como 4-Byte-Zahlen yPequeño-Zahlen como 2-
Byte-Zahlen abgespeichert. En Oracle hay además 38 Zeichen lang!
Alle y-Werte bei den Dezimalzahlen aus Tab.5.1dürfen auch weggelassen werden. Es wird
dann die Zahl 0 angenommen, die Dezimalzahlen sind dann also ganzzahlig. Das zusätzliche
Weglassen der x-Werte ist ebenfalls möglich, wobei dann implementierungsbedingte Werte
angenommen werden. Darüber hinaus entspricht die AngabePersonaje sin parámetros dem
VorgabewertPersonaje(1)ebenso besitztPocoSin parámetro de configuraciónPoco(1). Los
componentes de compatibilidad se utilizan en SQL2 y en los tipos de datos RealyPrecisión doble
unterstützt. Sie entsprechen beide dem TypFlotarmit einer implementierungsabhängigen
Anzahl von Nachkommastellen. Los tipos de datos creados son todos los de Oracle
modificados, MySQL conoce el tipo de datosPocoNo, SQL Server no tiene tipo de fechaPrecisión
doble.
El tipo de fechaFechaist für Datumsangaben enorme wichtig. Variable del tipoFecha können
miteinander verglichen werden. Ebenso können estas variables voneinander subtrahiert
werden. Das Ergebnis ist dann eine Integerzahl, die die die Anzahl der Tage zwischen diesen
Daten enthält. También la suma o la resta de una variable de datos con ei-

Pestaña. 5.1Lista de tipos de datos más grandes en SQL

ENTERO Ganzahl
EN T Kurzform de INTEGER
PEQUEÑO Ganzahl
NUMÉRICO(x,y) x stellige Zahl mit y Nachkommastellen
DECIMALES(x,y) x stellige Zahl mit y Nachkommastellen
FLOTADOR(x) Gleitpunktzahl mit x Nachkommastellen
CARÁCTER(n) Zeichenkette der festen Länge n
CARACTERÍSTICA (n) Kurzform de PERSONAJE (n)
CARÁCTER VARIABLE(n) Variable Zeichenkette mit bis zu n Zeichen
VARCHAR(n) Kurzform von PERSONAJE VARIABLE (n)
bit(n) Bitleiste der festen Länge n
FECHA Datum (año, mes, etiqueta)
TIEMPO Uhrzeit (Stunde, Minuto, Sekunde)
FECHA Y HORA Combinación de FECHA y HORA
146 5 La descripción general de SQL

ner Ganzzahl ist erlaubt. Das Datum wird entsprechend um die Anzahl Tage erhöht bzw.
erniedrigt. Zusätzlich zum Datum gibt es auch den DatentypTiempopara la hora diaria y
Fecha y horapara una variable, el datum y el tiempo enthält. Estas variables de datos son
muy breves y también se deben utilizar zonas horarias. Eine ausführliche Beschreibung zu
den Datentypen Fecha, Hora y Fechahora se encuentran entre otros en Fecha y Darwen (
1998) y Marsch y Fritze (2002).
Häufig wird in Abfragen das aktuelle Datum benötigt. Deshalb wurde en SQL2 el
constanteFecha actualpor tipo de fechaFechadefinido. Esta constancia contiene el dato
actual. La guerra occidental tambiénFecha_actual – 1y morgen esFecha_actual+ 1, um dos
einfache Beispiele zu nenen. Esta configuración incluye MySQL y Oracle, pero SQL Server
cambia automáticamente la funciónObtener la fecha.
Es sei noch erwähnt, dass mit Hilfe der FunktionElencoEin Datentyp in einen other
explizit umgewandelt werden kann. Dies ist insbesondere beim Umwandeln von
Datumsin Zeichenkettenfelder und umgekehrt wichtig. Die folgende Funktion erzeugt ein
Datumsfeld aus der angegebenen Zeichenkette:

REPARTO ('2013-12-24' COMO FECHA)

Esta función Cast está implementada en Oracle, SQL Server y MySQL. Alle
Datenbankhersteller besitzen darüber hinaus eigene Implementierungen, um
Zeichenketten, die ein gültiges Datum enthalten, in den DatentypFechaa convertir:hasta
la fechaen oráculo, convertiren SQL Server ystr_to_dateen MySQL.
También está incluido el operador de fecha, tanto Oracle como MySQL. La norma SQL
utilizada no permite utilizar el formato de formulariojjjj-mm-ttautomatisch in das
internamente Datumsformat der Datenbank umgewandelt. Beispielsweise wird Silvester
2013 bei der folgenden Eingabe unabhängig von länderspezifischen Einstellungen immer
akzeptiert:

FECHA '2013-12-31'

En SQL Server debe usar el operadorFechaWeggelassen werden, die Umwandlung


funktioniert hier one diesen Operador. Zu Datums- und Zeitangaben gibt es viele Funktionen,
einschließlich zahlreicher herstellerspezifischer Möglichkeiten der Umwandlung. Beispielsweise
kann aus einem Datum der Tag, das Monat, die Kalenderwoche oder das Jahr extrahiert
werden. Aquí encontrará el manual de datos del banco de datos.
Extremadamente cierto sind Zeichenketten. Aquí sollten wir den Unterschied zwischen den
ZeichenkettendatentypenCarácter (n)yVarchar(n)Kennen. Beide Datentypen unterscheiden sich
nicht nur in der Art der Speicherung: Der DatentypCarbonizarsebelegt immer genau den
angegebenen Speicherplatz, auch wenn weniger Zeichen benötigt werden. Die restlichen
Zeichen werden mit Leerzeichen aufgefüllt! Viele Datenbanken belegen auch beim Datentyp
Varcharpasante en maximalen Speicherplatz. Mit Sicherheit werden aber Leerzeichen am
Zeichenkettenende nicht hinzugefügt. Vielmehr wird die aktuelle Länge der
5.1 Relaciones con los demás 147

Zeichenkette in einem eigenen Längenfeld gemerkt. Aus diesem Grund liefern die beiden
folgenden Befehle nicht immer das gleiche Ergebnis:

SELECCIONE * DESDE Personal DONDE Nombre COMO '%e_'; SELECCIONE


* DESDE Personal DONDE Recortar(Nombre) COMO '%e_';

Der zweite Befehl gibt alle Personen aus, deren Namen im vorletzten Zeichen den
Buchstabenmienthalten. Beim ersten Befehl ist dies nur der Fall, wenn der Datentyp Varchar
verwendet wurde. Tipo de fecha BeimCarbonizarsewird eine Zeichenkette mit Leerzeichen
aufgefüllt, so dass das vorletzte Zeichen wohl meist eben ein solches Leerzeichen und keinmi
sein wird. Muere dorado zumindest en Oracle. Vor der Verwendung von Variablen vom
DatentypCarbonizarseMySQL selecciona automáticamente el tiempo de lectura. SQL Server
interpreta el carácter Wildcart,_‘ am Ende eigenwillig und gibt im obigen ersten Beispiel auch
Heinz Rolle mit aus, unabhängig von der Anzahl der folgenden Leerzeichen.

5.1.2 Spalten- und Tabellenbedingungen

Enorme medida para la integridad de un banco de datos sind dieespalten- yCamas de mesa.
Empezamos con la guaridaSpaltenbedingungen(en inglés:restricciones de columna), die
directamente con la definición eines Attributs angegeben werden. Las mejores camas son:

[ RESTRICCIÓN Bedingungsname ] NO NULO


[ RESTRICCIÓN Bedingungsname ]FCLAVE PRINCIPAL | ÚNICOgramo
[ RESTRICCIÓN Bedingungsname ]
REFERENCIAS Nombre de tabla [ ( Spalte [ , ... ] ) ]
[ AL BORRARFSIN ACCIÓN | CASCADA | ESTABLECER NULOgramo] EN
[ ACTUALIZACIÓNFSIN ACCIÓN | CASCADA | ESTABLECER NULOgramo]
[ RESTRICCIÓN Bedingungsname ] VERIFICAR ( Bedingung )

Cualquier atributo puede cambiarse por uno o más de estos atributos. Wir können
damit den Primärschlüssel mittels des Bezeichners Clave primariaFestlegen und
Alternative Schlüssel mittelsÚnico. La identificación del Fremdschlüssel einschließlich der
referentiellen Integritätsregeln comienza con el BezeichnerReferencias. Ferner können
wir Variablen mittels einer Check-Bedingung einschränken, und mittels des Bezeichners
No nuloNullwerte in diesem Attribut verbieten. Für den Primärschlüssel gilt die
BedingungNo nulode forma natural y automática.
unoControlar-Bedingung entspricht der Bedingung in derDónde-Klausel desSeleccionar-
Befehls, allerdings sind Unterabfragen auf other Relationen nicht zulässig. Mittels der Controlar
-Bedingung wird festgelegt, welche Bedingungen ein Attribut erfüllen muss. Sol
148 5 La descripción general de SQL

un atributoatributoetwa immer zwischen 10 und 90 liegen, so wird dies mittels der


Spaltendefinition

attr VERIFICACIÓN DE ENTEROS (attr ENTRE 10 Y 90)

sichergestellt. Weitere Beispiele folgen in diesem Kapitel. Es sei aber erwähnt, dass sich die
Einschränkung in der Check-Bedingung ausschließlich auf das jeweilige Attribut selbst beziehen
muss, in unserem Beispiel also auf das Attributatributo!
Mit der wahlfreien Angabe von Bedingungsnamen zusammen mit dem reservierten
WortRestricciónerhalten die einzelnen Bedingungen einen eindeutigen Namen zwecks
späterer Identifikation. Dies ist dann wichtig, wenn eine Bedingung eventuell wieder
gelöscht werden soll. Wir kommen beimAlterar tabla-Befehl darauf zurück.
Zusammengesetzte Schlüssel können nicht as Spaltenbedingung definiert werden, da ein
Attribut durch die AngabenClave primariaoderReferenciasfür sich alleine bereits als Schlüssel
festgelegt wäre. Bei spaltenübergreifenden Bedingungen und Schlüsseln müssen wir daher auf
Tabellenbedingungen (inglés:restricciones de la tabla) zurückgreifen. Estos elementos de
Spaltenbedingungen se adaptan según los nombres de atributos a los que se refieren. La
sintaxis de las mesas de trabajo es una lista completa:

[ RESTRICCIÓN Bedingungsname ]
FCLAVE PRINCIPAL | ÚNICOgramo ( Spalte [ , ... ] )
[ RESTRICCIÓN Nombre de Bedingung ]
CLAVE EXTERNA ( Spalte [ , ... ] )
REFERENCIAS Nombre de la tabla [ ( Spalte [ , ... ] )]
[ AL BORRARFSIN ACCIÓN | CASCADA | ESTABLECER NULOgramo] EN
[ ACTUALIZACIÓNFSIN ACCIÓN | CASCADA | ESTABLECER NULOgramo]
[ RESTRICCIÓN Nombre de Bedingung ]
VERIFICAR ( Bedingung )

Grundsätzlich steht es dem Datenbankdesigner bei nicht zusammengesetzten Schlüsseln


frei, ob er Tabelleno- oder Spaltenbedingungen benutzen möchte. Schließlich sind beide
Definiciones gleichwertig. Bei zusammengesetzten Schlüsseln bisagragen sind
Tabellenbedingungen zwingend erforderlich.
Werden die BezeichnerAl eliminaroderEn actualizaciónnicht angegeben, so wird
automatisch die VorgabeNinguna accióngesetzt, das Ändern bzw. Löschen también
gegebenenfalls unterbunden. Wird eine Check-Bedingung als Tabellenbedingung definido, por
lo que darf sie sich auf beliebige Attribute dieser Relation beziehen.
Analog zu Spaltenbedingungen können wir auch hier mittels des BezeichnersRestricción
einen Bedingungungsnamen angeben. Ein späteres Löschen mittels einesAlterar tabla- Befehls
ist dann jederzeit möglich.
Es gibt in Datenbanken Einschränkungen zu dieser SQL-Norm. Esto se encuentra en la pestaña.5.2
aufgelistet. In allen drei Datenbanken sind Unterabfragen in einer Check-Bedingung nicht erlaubt
beziehungsweise werden nicht überprüft.
5.1 Relaciones con los demás 149

Pestaña. 5.2Abweichungen von der SQL-Norm bei Bedingungen

Abweichungen
La camaAl eliminar ninguna acciónkann nicht angegeben
werden. Sie gilt aber standardmäßig.
Oráculo
La camaEn actualización…kann nicht angegeben werden. Es
dorado immerAl eliminar ninguna acción.
servidor SQL Keine Abweichung
Bedingungsnamen sind nur in Tabellenbedingungen erlaubt.
Fremdschlüsselangaben müssen as Tabellenbedingungen
mysql geschrieben werden.
Die Spalten, auf die sich der Fremdschlüssel bezieht, müssen
angegeben werden.

Als abschließendes Beispiel wollen wir die bereits früher verwendete RelationPersonal
(ver Tab.4.1) definen:

CREAR MESA Personal


( persona EN T PRIMARIO LLAVE,
Nombre CARACTERÍSTICA(25) NO NULO,
Ort CARACTERÍSTICA(15),

Vorgesetzt REFERENCIAS ENTERAS Personal


AL ELIMINAR ESTABLECER NULO EN CASCADA DE ACTUALIZACIÓN,

Gehalt VERIFICACIÓN NUMÉRICA(8,2)(Entre 800 Y 9000), CHAR,


beurteilung
RESTRICCIÓN MinVerdienst
VERIFICAR( Gehalt >= Coalesce((6-Beurteilung)*400,
800) )
);

Wir haben den Primär- und Fremdschlüssel angegeben, ebenso wurde das Gehalt auf ein
Intervall eingeschränkt und mittels einer Tabellenbedingung in Abhängigkeit von der
Beurteilung nach unten beschränkt.
Wer beachten, dass ein späteres Ändern der Struktur von Relationen immer mit einem
hohen Aufwand verbunden ist. Todos los Zugriffe auf estas relaciones en todos los
programas deben realizarse correctamente. Un diseño óptimo de datos bancarios es el
mejor diseño. Aquí gilt die bereits erwähnte Diseñar:einmal schlechtes Diseño – immer
schlechte Anwendung. Nach dem wohlüberlegten Design der Datenbank ist dann das
eigentliche Erzeugen der Relationen relativ einfach, die erforderlichenCrear mesa-
Befehle sind schnell geschrieben. Es sollte der Aufwand nicht gescheut werden, alle
bekannten Einschränkungen mittels Spalten- und Tabellenbedingungen anzugeben. Nur
so kann das Datenbankverwaltungssystem von sich aus Integritätsverletzungen
erkennen. Esta einmalige Aufwand es la mejor inversión para la integridad del banco de
datos.
150 5 La descripción general de SQL

An dieser Stelle sei noch erwähnt, dass Verletzungen der angegebenen Spalten- und
Tabellenbedingungen im laufenden Datenbankbetrieb zur Zurückweisung des entsprechenden
Zugriffsbefehls führen. Es wird eine Fehlermeldung mit entsprechendem Returncode
zurückgeliefert. Es versteht sich von selbst, dass ein gutes Zugriffsprogramm auf diese Fehler
geeignet reagiert. Wir verweisen hier auf Kap.6, wo wir SQL-Befehle in Program einbetten und
Fehler abfangen werden.

5.2 Relaciones entre ellos y las personas

Además de un diseño óptimo, debemos considerarlo adecuado, ya que la estructura del banco
de datos manchmal an Änderungen in der realen Umgebung angepasst werden muss. Para
este uso, meist handelt es sich um Erweiterungen, steht der SQL-BefehlModificar tabla zur
Verfügung. La sintaxis indicada:

ALTERAR TABLA Nombre de tabla


F AÑADIR COLUMNA ] Spalte FTipo de fecha | Nombre Gebietsgramo
[ Spaltenbedingung [ ... ] ] F
| SOLTAR [ COLUMNA ] Spalte RESTRINGIR | CASCADAgramo
| AGREGAR Tabellenbedingung
| RESTRICCIÓN DE CAÍDA Nombre de Bedingung FRESTRINGIR | CASCADAgramo

Wir können mit einemAlterar tabla-Befehl entweder genau ein nuevo Attribut (Spalte)
hinzufügen oder ein bestehendes Attribut entfernen oder eine weitere Tabellenbedingung
einfügen oder eine existente Tabelleno- oder Spaltenbedingung löschen. Wir erkennen, wie
wichtig es sein kann, eine Bedingung mit einem Bedingungsnamen zu versehen. Ahora no se
pueden hacer estos mediosRestricción de caídawieder entfernt werden.
Beim Löschen von Attributen oder Tabellen- und Spaltenbedingungen muss laut SQL-Norm
eine der BedingungenRestringirodercascadaangegeben werden. beiRestringirWird das
Löschen verhindert, wenn noch Sichten existieren, dieses Attribut verwenden, oder wenn noch
Integritätsbedingungen zu diesem Attribut vorliegen. beicascadawird das entsprechende
Attribut auch in diesen Sichten gelöscht, ebenso darauf verweisende Integritätsbedingungen.
Ist das zu löschende Element eine Tabellenbedingung, so hatRestringirnur bei
Fremdschlüsselbedingungen eine Bedeutung. Gibt es noch Verweise, so wird das Löschen
unterbunden. beicascadawerden die Verweise ebenfalls gelöscht. Wieder gibt es bei den
Datenbankanbietern erhebliche Abweichungen zur Norm, siehe Tab.5.3.
Soll, aus welchen Gründen auch immer, eine Relation samt der darin gespeicherten
Tupel entfernt werden, so ist dies mit demMesa plegable-Befehl möglich. La sintaxis es
einfach und lautet:

MESA PLEGABLE Nombre de la tabla FRESTRINGIR | CASCADAgramo


5.3 Relaciones temporales 151

Pestaña. 5.3Abweichungen von der SQL-Norm im Alter-Table-Befehl

Abweichungen
AÑADIR: Der BezeichnerColumnadarf nicht verwendet werden.
GOTA: Der BezeichnerColumnamuss verwendet werden, oder die
Spalte ist zu klammern. El BezeichnerRestringirist nicht erlaubt.
Oráculo Standardmäßig wird das Löschen abgewiesen. Estado de los
BezeichnerscascadaesRestricciones en cascadazu verwenden.
RESTRICCIÓN DE CAÍDA: Der BezeichnerRestringirist nicht erlaubt.
Standardmäßig wird das Löschen abgewiesen.
AÑADIR: Der BezeichnerColumnadarf nicht verwendet werden. GOTA:
Der BezeichnerColumnadarf nicht verwendet werden, ebenso nicht:
Restringirycascada. Los ajustes estándar se realizarán de forma
SQL
estándar.
Servidor
RESTRICCIÓN DE CAÍDA: Die BezeichnerRestringirycascadadürfen
nicht verwendet werden. Los ajustes estándar se realizarán de forma
estándar.
mysql RESTRICCIÓN DE CAÍDA: Sintaxis de EigeneÍndice de caídaysoltar clave.

WidRestringirGesetzt, wird ein Löschen der Relation verweigert, falls noch Verweise auf
diese Relation existieren. Soy Falle voncascadawerden entsprechende Verweise (Tupel)
ebenfalls gelöscht. Im praktischen Einsatz ist das Löschen ganzer Relationen oder auch nur das
Löschen einzelner Attribute oder Tabellenbedingungen selten. Nur im Entstehungsprozess
einer neuen Datenbank während der Implementierungs- und Testphase besitzt einMesa
plegable-Befehl eine Existenzberechtigung.
MySQL ignora la sintaxis y se ignora según las fuentesRestringirycascada. Oracle y
SQL Server utilizan el BezeichnerRestringirycascadanicht. En Oracle kann stattdessen
der AusdruckRestricción en cascadaverwendet werden.

5.3 Relaciones temporales

Gelegentlich sollen Zwischenergebnisse in eigenen Relationen gespeichert werden.


Estas relaciones pueden realizarse según la acción más dura. Esto puede aumentar,
por lo que las relaciones con el estándar SQL se mantienen temporalmente. La idea
es:
Una relación temporal se activará automáticamente y al final de esta sesión se
activará automáticamente. Weiterhin besteht die Möglichkeit, dass am Ende jeder
Transaktion der Inhalt this Relation gelöscht wird. La sintaxis de estas relaciones
temporales es idéntica a la de BefehlCrear mesay lautet:

CREARFLOCALES | GLOBALgramoTABLA TEMPORAL Nombre de tabla (


FSpalte FTipo de fecha | Nombre Gebietsgramo
[ Spaltenbedingung [ ... ] ] | Tabellenbedingung gramo

[ , ... ]
)
[ EN COMPROMISO FCONSERVAR | BORRARgramo FILAS ]
152 5 La descripción general de SQL

Por la mañana AngabeLocalWird sichergestellt, dass die temporäre Relation nur für den
aktuellen Benutzer sichtbar ist. Vamos a morir AngabeGlobalverwendet, so kann diese Relation
auch von otras benutzt werden. Wichtig ist, dass jeder Benutzer grundsätzlich nur seine
eigenen Daten sieht. También se incluye una sincronización compleja en paralelo con los grifos.
Zuletzt kann im Befehl angegeben werden, ob der jeweilige Inhalt am Ende iner Transaktion
erhalten bleibt oder gelöscht wird. Standardmäßig wird der Inhalt bei jedem Transaktionsende
gelöscht.
Las relaciones temporales se realizan en dos direcciones diferentes: Primero se
activará la relación automática con el banco de datos, y las dos opciones son de
rendimiento: Las relaciones temporales no se pueden sincronizar con otros usuarios, y
también se sincronizan con el registro (siehe Abschn.8.1) nicht berücksichtigt, was
erheblichen Aufwand einspart.
Wieder gibt es in der Praxis einige Einschränkungen. En Oracle gibt es nur die Angabe
Global, en SQL Server sind Relationen, die mit dem Zeichen ,#‘ startnen, lokal temporär.
Las relaciones temporales globales comienzan con la cultura del tiempo ,##‘. Ansonsten
gilt die Syntax des BefehlsCrear mesa. En MySQL duren los AngabenLocalyGlobalnicht
verwendet werden. Es gibt nur locale temporäre Relationen. Die AngabeEn compromiso
Esto se hace en SQL Server y MySQL, y tampoco lo será al final del compromiso de
seguridad.

5.4 Sichten (Vistas)

Soy Abschn.2.2Haben wir darauf bisagrasen, dass auch Sichten Relationen sind. In diesem
Abschnitt wollen wir dieseSichten vorstellen. Sichten oderRelaciones virtudes (en inglés:
Vista) sind von Basisrelationen abgeleitete Relationen, wobei in der Datenbank nicht
deren Inhalt, sondern nur die Ableitungsregeln gespeichert werden!
Der Sinn von Sichten liegt darin, jedem Benutzer nur das zu zeigen, was für ihn wichtig e
interessant ist. Genau genommen gibt es vier Gründe Sichten einzuführen:

- Datenschutz: Der Benutzer sieht nur die für ihn bestimmten Daten.
- Supervisión: Der Benutzer sieht nur die für ihn relevanten Daten. Somit behält er den
Überblick im Datendschungel.
- Lesbarkeit: Dem Benutzer werden die Daten so aufbereitet, dass er sie einfach
nachvollziehen kann.
- Zwischenspeicherung: Komplexe Select-Befehle werden persistente gespeichert, um sie in
weiteren Select-Befehlen einzusetzen.

Wir wollen zu allen vier Anwendungsfällen Beispiele geben, zunächst beginnen wir
aber mit der Syntax zum Erzeugen und Löschen von Sichten:
5.4 Sichten (Vistas) 153

CREAR VISTA Sichtname [ ( Spalte [ , ... ] ) ] AS Select-Befehl


[ CON OPCIÓN DE CHEQUE ]
DROP VIEW Nombre de usuarioFRESTRINGIR | CASCADAgramo

Eine Sicht ist also nichts anderes als ein Select-Befehl, der einen Namen erhält. Este nombre
de asiento debe incluirse en el interior del banco de datos y sich von otros tabellenoder
nombres de banco unterscheiden. Wollen wir eigene Attributnamen verwenden, so können wir
diese wahlfrei angeben. Opción de morirCon opción de chequewerden wir auf den nächsten
Seiten behandeln. Es sei erwähnt, dass hier im Select-Befehl die KlauselOrdenar pornicht
erlaubt ist. Werden in der Select-Klausel Spaltenausdrücke ohne Aliasnamen verwendet, so ist
die Spaltenliste nach dem Sichtnamen zwingend anzugeben.
zumbido analógicoMesa plegable-Befehl ist beimVista desplegable-Befehl eine der beiden
Angaben Restringirodercascadazwingend. Bei der Angabe vonRestringirwird das Löschen der
Sicht zurückgewiesen, wenn other Sichten oder Tabellen- und Spaltenbedingungen existieren,
die auf diese Sicht verweisen. Widcascadaangegeben, so werden auch diese Sichten und
Bedingungen mit entfernt.
Wie beim BefehlMesa plegabledorado: MySQL ignora la sintaxis, se ignora según
las fuentesRestringirycascada. Oracle y SQL Server utilizan el Bezeichner Restringiry
cascadanicht. En Oracle darf aber stattdessen der AusdruckRestricción en cascada
verwendet werden.
Beginnen wir mit einem einfachen Beispiel zum Datenschutz bzw. zur Übersichtlichkeit: la
relaciónPersonalEnthält personenspezifische Daten wie Gehalt und Beurteilung, die nicht für
die Augen Dritter bestimmt sind. Auch andere Angaben sind vielleicht nicht wichtig, wie
Personenstand oder Aufgabe. Wir könnten daher eine sichtPersonal1 Como se define a
continuación:

CREAR VISTA Personal1


AS SELECT Persnr, Nombre, Ort AS Wohnort, Vorgesetzt AS Chef FROM
Personal ;

Esta relaciónPersonal1ist klein und übersichtlich und enthält keine internanen


sensiblen Daten. Wir geben jetzt den Benutzern außerhalb der Personalabteilung nur
Zugriffsrechte auf diese Relation und nicht auf die ursprüngliche RelationPersonal. Der
Datenschutz ist damit gewährleistet. Por Eingabe des Befehls

SELECCIONAR * DE Personal1;

erhält der Anwender die Ausgabe gemäß Tab.5.4. Er wird nicht wissen, dass es una
relaciónPersonalgibt, und er wird auch rein äußerlich nicht bemerken, dass die Relation
Personal1keine Basisrelation, sondern eine Sicht ist.
Betrachten wir jetzt als nächstes ein Beispiel zur Lesbarkeit und Zwischenspeicherung.
Relación de matrizAuftragtambién Tab.10.5ist für den Anwender kaum lesbar, da Personal- und
154 5 La descripción general de SQL

Pestaña. 5.4 Relación Personal1

persona Nombre Wohnort Cocinero

1 María Forster Ratisbona NULO


2 Anna Kraus Ratisbona 1
3 Rango Úrsula Francfort 6
4 Heinz Rolle Núremberg 1
5 Johanna Koster Núremberg 1
6 Marianne Lambert Landshut NULO
7 Thomas Noster Ratisbona 6
8 Renate Wolters Augsburgo 1
9 Ernst Pach Stuttgart 6

Kundennummern in der Regel nicht auswendig bekannt sind. Zusätzlich könnte noch die
Auftragssumme interessieren. Heer könnte folgende Sicht weiterhelfen:

CREAR VER VAuftrag (AuftrNr,Datum,Kundname,Persname,Summe) COMO


SELECCIONAR AuftrNr, Datum, K.Name, P.Name, SUM (Gesamtpreis) Auftrag AS A
DE JOIN Kunde AS K ON K.Nr = A.Kundnr
ÚNETE Personal AS P USANDO (Persnr)
ÚNETE Auftragsposten USANDO (Auftrnr)
GRUPO POR Auftrnr, Datum, K.Nombre, P.Nombre;

Das Ergebnis dieser SichtVAuftragestá en la pestaña.5.5wiedergegeben. Jeder Auftrag


erscheint zusammen mit dem Personal- und Kundennamen und der Auftragssumme statt den
in der Regel nicht bekannten Nummern.
Esta seguridad también puede realizarse de forma práctica. Cuando no hay ropa
tejida, la señora Köster tätigte, por lo que genügt folgender Befehl:

SELECCIONAR * DE VAuftrag
DÓNDE Nombre personal LIKE '%Köster%';

Eine Datenbank behandelt Relationen gleichwertig, zumindest aus Sicht des


Anwenders. Der Anwender weiß daher nicht, dass es sich bei der RelationVAuftragnur um
eine Sicht handelt. Además, esta sensación física no existe. Das Datenbanksystem wird
intern nur den Select-Befehl der Sicht speichern und diesen bei Bedarf verwenden,

Pestaña. 5.5Sicht VAuftrag

AuftrNr Dato Kundname Nombre personal verano


1 04.01.2013 Tienda Fahrrad Anna Kraus 800
2 06.01.2013 Maier Ingrid Johanna Koster 2350
3 07.01.2013 Rafa – Seger KG Anna Kraus 800
4 18.01.2013 Fahrräder Hammerl Johanna Koster 824
5 06.02.2013 Tienda Fahrrad Anna Kraus 70
5.4 Sichten (Vistas) 155

um einen Zugriffsbefehl auf die BasisrelationAuftragzu generieren. Obiger Befehl wird


vermutlich wie folgt expandiert:

SELECCIONAR * DE (
SELECCIONAR AuftrNr, Datum, K.Name AS Kundname, P.Name AS
Persname, SUM(Gesamtpreis) AS Summe Auftrag AS A JOIN
DE Kunde AS K ON K.Nr = A.Kundnr
ÚNETE Personal AS P USANDO (Persnr)
ÚNETE Auftragsposten USANDO (Auftrnr)
GROUP BY AuftrNr, Datum, K.Name, P.Name WHERE )
Persname LIKE ’%Köster%’;

Sichten haben sich in der Praxis bewährt und werden vielfach eingesetzt.
Insbesondere aus Datenschutzgründen sind sie nicht mehr wegzudenken. No utilice el
sistema debido a redundancias innecesarias.
Ganz wichtig ist folgender Sachverhalt: Nehmen wir Änderungen in den zugrunde liegenden
Basisrelationen vor, so wirken sich diese sofort auf alle Sichten aus. Schließlich greifen ja
Sichten immer auf die Basisrelationen zu. Umgekehrt dürfen wir auch in Sichten ändern. Wir
müssen allerdings beachten, dass sich diese Änderungen eindeutig auf die darunterliegende
Basisrelation abbilden lassen. Nur wenn alle folgenden Bedingungen in der Definición der Sicht
erfüllt sind, ist daher das Ändern, Löschen oder Einfügen in der Sicht erlaubt:

- Die From-Klausel enthält nur una relación


- Es gibt keine Group-By-Klausel
- Die Select-Klausel enthält keine Distinct-Angabe
- Die Spaltenliste besteht nur aus einzelnen Spaltennamen
- Los operadoresUnión,IntersecarseoderExceptokommen nicht vor

Ist eine dieser Aufzählungen verletzt, so kann es vorkommen, dass Tupel der
zugrundeliegenden Relation in der Sicht zusammengefasst werden. Damit kann ein einzelnes
Attribut mehreren realen Attributen entsprechen. Ein Ändern in der Sicht ließe sich damit nicht
mehr eindeutig auf die Basisrelation zurückrechnen. Jede Datenbank verbietet daher generell
das Ändern, wenn auch nur eine der obigen fünf Bedingungen verletzt ist.
Relación de matrizPersonal1erfüllt alle fünf Bedingungen. Zieht etwa Frau Kraus nach
Hannover um, so dürfen wir schreiben:

ACTUALIZAR Personal1
COLOCAR Wohnort = 'Hannover'
DÓNDE Persona = 2 ;

Jetzt wird nicht die RelationPersonal1geändert, diese existiert ja gar nicht. Vielmehr
ändern wir das AttributOrtvon Mitarbeiter 2 en la relaciónPersonal.
156 5 La descripción general de SQL

La nocheVAuftragLas bisagras no están sujetas a ninguna acción. Sie verletzt gleich mehrere
der obigen Bedingungen: Es wird auf vier Relationen zugegriffen, un Group-By-Klausel wird
verwendet und die Spaltenliste enthält eine Funktion und nicht nur Namen. Dass diese Sicht
nicht änderbar ist, ist leicht nachvollziehbar: Möchten wir beispielsweise in Auftrag 4 die
Auftragssumme von 824 Euro auf 800 Euro reduzieren, so stünde die Datenbank vor einer
schweren Entscheidung: Soll nur eine Auftragsposition um 24 Euro gesenkt werden, oder sollen
alle Positionen anteilig reduziert werden? Cuando aquí también hay cambios de ropa, dann
müssen wir dies in den zugrunde liegenden Basisrelationen tun.
Sichten sind Universell einsetzbar. In der Zugriffssprache dürfen wir generell Sichten
verwenden, wo wir bisher nur Tabellen benutzt hatten. Además, según la definición, una noche
dura se encuentra en la sala de estar de Klausel. Es versteht sich dabei von selbst, dass eine
solche Sicht nur änderbar sein kann, wenn die zugrundeliegende Sicht dies ebenfalls ist.

Zuletzt wollen wir die OptionCon opción de chequetraicionar. Nehmen wir


beispielsweise eine BasisrelationVereinsmitglieder, die die dieten der Mitglieder eines
Vereins enthält. Wird in diesem Verein eine intensivo Jugendarbeit betrieben, könnte eine
Sicht jovenvon Interesse sein. Esto se debe a la relación básica abgeleitet:

CREAR VISTA Jugend AS


SELECCIONAR * DESDE Vereinsmitglieder DONDE Alterar < 21;

Heer wurde vorausgesetzt, dass die Relation ein AttributAlterarbesitzt. Dem Leiter der
Jugendarbeit wird der Zugriff auf die Relationjovengestattet, jedoch nicht auf die Relation
Vereinsmitglieder. Esta vistajovenEsto está ahí, todos los DML-Befehle sind erlaubt y
wirken sich direkt auf the BasisrelationVereinsmitgliederaus. Der Jugendleiter führt auch
regelmäßig Änderungen durch: An jedem Geburtstag eines Mitglieds erhöht er das Alter.
Estas funciones están totalmente libres. Wird ein Jugendmitglied jedoch 21 Jahre alt, tritt
eine Anomalie auf: Obwohl der Jugendleiter nur Änderungen vornimmt, hat er den
Eintrag in der Sicht gelöscht. Das Mitglied ist selbstverständlich weiter in der Basisrelation
enthalten, und sein Alter wurde auch erhöht. Doch der Jugendleiter sieht dies nicht. Auch
ein versehentliches Ändern kann von ihm nicht mehr rückgängig gemacht werden.

Aquí está la opciónCon opción de chequejuego ins. Esta opción no se ajusta a los
requisitos, pero la seguridad no será mayor que la de la noche. In unserem Beispiel
versehen wir daher den Create-View-Befehl mit esta opción:

CREAR VISTA Jugend AS


SELECCIONE * DESDE Vereinsmitglieder DONDE Modificar CON < 21
OPCIÓN DE VERIFICACIÓN;

Jetzt wird der Versuch, das Alter in der SichtjovenAuf 21 Jahre zu setzen, mit einer
Fehlermeldung zurückgewiesen. La anomalía está acosada. Este setzen auf den Wert 21
está directamente en la relación básicaVereinsmitgliederdurchzuführen.
5.5 Zusicherungen (Afirmaciones) 157

5.5 Zusicherungen (Afirmaciones)

La integridad es enorme en los bancos de datos. Nicht erlaubte Inhalte müssen soweit
wie möglich vom Datenbankverwaltungssystem verhindert werden. Dies führt unter
anderem zu Einschränkungen in den Attributen, den Spalten- und Tabellenbedingungen.
Damit werden die Entitäts- und Referenzintegrität garantiert. La integridad semántica se
modifica mediante comprobaciones de datos. Doch diese Check-Bedingungen reichen
nicht immer aus. Betrachten wir dazu ein Beispiel:
Wir möchten, dass ein verkaufter Artikel nicht versehentlich teurer angeboten wird, también
in der Artikelliste ausgezeichnet ist. Dies lässt sich durch das Hinzufügen der folgenden
Tabellenbedingung verhindern:

ALTER TABLE Auftragsposten AGREGAR


RESTRICCIÓN Auftragspreis CHECK
( Gesamtpreis <= ( SELECCIONAR Anzahl*Preis
DE Artículo
DÓNDE ANr = Artnr) );

Esta cama tiene un significado diferente: Sie verhindert zwar einen unerlaubten Eintrag in
der RelationAuftragsposten, jedoch nicht eine fehlerhafte Preisangabe in der dazu
korrespondierenden RelaciónArtículo. ¡Wir benötigen also eine datenbankumfassende
Bedingung, keine Relationen spezifische!
La norma SQL hat darauf schon sehr früh reagiert und bereits in SQL2 Zusicherungen
(engl.: afirmaciones) eingeführt. Estos Zusicherungen werden mit dem BefehlCrear
asercióndefinido. Obige Tabellenbedingung würde mit Hilfe dieser Zusicherung wie folgt
lauten:

CREAR ASERCIÓN AssertionPreis COMPROBAR (NO EXISTE


( SELECCIONAR * DESDE Auftragsposten INNER JOIN Artículo
ON ANr = Artnr
DÓNDE Gesamtpreis > Anzahl*Preis));

Zu beachten ist die unterschiedliche Wirkung der letzten beiden Befehle. Soy Falle des
BefehlsModificar tablaWird die Bedingung immer beim Ändern von Daten in der Relation
Auftragspostengeprüft. Soy Falle des BefehlsCrear asercióngeschieht dies auch bei einer
Preisänderung eines Artikels in der RelationArtículo.
La sintaxis de Create-Assertion-Befehls lautet ganz allgemein:

CREAR ASERCIÓN Bedingungsname VERIFICAR ( Bedingung )

Eine Zusicherung drückt aus, dass die Datenbank bestimmte Bedingungen garantiert. Morir
Controlar-Bedingung soyCrear-Afirmación-Befehl comenzó meist con el operadorNo
158 5 La descripción general de SQL

existe. Allgemeine Bedingungen können mit demAfirmación de caída-Befehl wieder


gelöscht werden. La sintaxis aquí es:

Afirmación de caída Bedingungsname

Es ist sehr wichtig, dass bereits beim Entwurf einer Datenbank bekannte Einschränkungen
mit in das Design einfließen. So wird sichergestellt, dass zur gesamten Lebenszeit diese
Bedingungen automatisch überprüft werden.
Die heutige Praxis sieht leider other aus, da viele Datenbankhersteller einen anderen
Weg gingen: Zusicherungen sind kaum implementiert, auch nicht in Oracle, SQL-Server o
MySQL. Estos hersteller no están autorizados y no pueden recibir ningún error en el
interior de una cama de cheques. Una alternativa sind Prozeduren y Trigger. Desde 1999
se publicó la norma SQL3.
Trigger sind meist kleine Unterprogramme, die bei bestimmten Ereignissen, etwa beim
Einfügen oder Ändern, automatisch aufgerufen werden. Wir kommen später in diesem Kapitel
darauf zurück. Wir wollen aber noch eine Möglichkeit angeben, wie mit Hilfe von Sichten unser
Beispiel zumindest teilweise gelöst werden könnte. Dazu definieren wir eine sicht
VAuftragspostenzusammen mit einer With-Check-Option:

CREAR VER VAuftragsposten AS


SELECCIONE * DESDE Auftragsposten
DONDE Gesamtpreis <= ( SELECCIONE Anzahl * Preis
DE Artículo
DÓNDE ANr = Artnr)
CON OPCIÓN DE CHEQUE ;

En la vistaVAuftragspostenwerden jetzt alle Änderungen abgewiesen, die dieDónde-


Bedingung nicht erfüllen.

5.6 Gebiete

Soy BefehlCrear mesaWird jedem Attribut ein Datentyp zugeordnet. Este Zuordnung ist meist
viel zu grob. Wir setzen daher Check-Bedingungen oder Zusicherungen ein, um die Freiheiten
gezielt einzuschränken. Es gibt für viele Fälle auch eine Alternative:Gebiete . Seit SQL2 puede
definir las definiciones y los atributos en lugar de un tipo de fecha y un tipo de información. La
definición de los Gebiets der Hauptstädte einiger Euro-Länder lautet beispielsweise:

CREAR DOMINIO EURO_Hauptstadt COMO PERSONAJE (15)


VERIFICAR ( VALOR EN (’Berlín’, ’París’, ’Rom’, ’Madrid’,
'Lissabon', 'Wien', 'Amsterdam', 'Dublín', 'Brüssel', 'Luxemburg', 'Atenas',
'Helsinki' ) );
5.7 Activador 159

El BezeichnerValorist neu und ermöglicht eine konstante Aufzählung.


En un Create-Table-Befehl darf statt eines Datentyps auch ein Gebietsname
verwendet werden, siehe Abschn.5.1en este Kapitel. Mit dem GebietsnamenEU-
RO_Hauptstadtdürfen in den Variablen dieses Datentyps nur Städte aus dieser
Aufzählung verwendet werden. La sintaxis desCrear dominio-Befehls ist im
Folgenden angegeben:

CREAR DOMINIO Nombre de usuario [AS] Tipo de fecha


[ [ CONSTRAINT Bedingungsname ] CHECK ( Bedingung ) ] [ ... ]

Ein Gebiet bezieht sich auf einen Datentyp, der durch ein oder mehrere Check-
Bedingungen eingeschränkt wird. Soll eine Bedingung einen Namen erhalten, so ist der
BezeichnerRestriccióngefolgt von diesem Namen anzugeben. Die Norm erlaubt in der
Controlar-Bedingung auch Unterabfragen. Eine Gebietsdefinition kann wie folgt auch
wieder gelöscht werden:

SOLTAR DOMINIO GebietsnameFRESTRINGIR | CASCADAgramo

No queremos cambiar las formas y las características de las tecnologías, y aquí


también se practican otras prácticas: Los bancos de datos disponibles no están
relacionados con PostgreSQL, Oracle, SQL Server y MySQL. Wie schon im letzten
Absatz verweisen wir wieder auf Sichten und Trigger, um etwaige komplex
Einschränkungen zu ermöglichen. Einfachere Einschränkungen können durch Check-
Bedingungen in jeder einzelnen Relation erfüllt werden. Globale
Einstellmöglichkeiten gibt es nur über Trigger.

5.7 Activador

Para mejorar la integridad semántica, las normas SQL incluyen varias opciones: verificar,
incluir con opción de verificación en lugares, opciones y direcciones. Während
Zusicherungen und Gebiete kaum implementiert sind, bieten alle Datenbankhersteller
Desencadenar an, ein weiteres wichtiges Werkzeug zur Sicherstellung der semantischen
Integrität.
Trigger sind Aktionen, die zu bestimmten Ereignissen angestoßen werden, etwa beim
Einfügen oder Ändern von Daten in bestimmten Relationen. Sie können überprüfen, ob die
Eingaben im erlaubten Rahmen liegen, ob bestimmte Integritätsbedingungen erfüllt sind oder
ob das Löschen wegen bestimmter Vorgaben nicht erlaubt werden soll. Auch kann ein Hinweis
ausgegeben werden, etwa dass Artikel nachbestellt werden sollten. Trigger sind enorme
vielfältig einsetzbar und haben sich in der Praxis sehr bewährt.
160 5 La descripción general de SQL

El disparador se activa por primera vez en SQL3 y se activa automáticamente en SQL2003.


La sintaxis es umfangreich, las anwendungsmöglichkeiten sind extrem vielfältig. Wir
beschränken uns hier auf wenige Beispiele und verweisen zur Vertiefung insbesondere auf
Kifer et al. (2005) y Gulutzan y Pelzer (1999). La sintaxis indicada:

CREAR DISPARADOR Nombre del activador

FANTES | DESPUÉSgfBORRAR | INSERTAR | ACTUALIZARgramo [O... ] ON


Nombre de tabla
[ REFERENCIA [ ANTIGUO COMO NameAlt ] [ NUEVO COMO NameNeu ] ]
[ PARA CADA DECLARACIÓN | POR CADA FILA ]
[ CUÁNDO Bedingung ]
Anweisungen

Legen wer die in eckigen Klammern stehenden wahlfreien Angaben zunächst beiseite, so
sehen wir, dass ein Trigger vor oder nach einer Änderung in ainer Relation bestimmte
Anweisungen, meist SQL-Befehle, ausführt.
Beginnen wir mit einem einfachen Beispiel. Wir wollen dafür sorgen, dass bei einem neuen
Auftrag immer das aktuelle Datum eingetragen wird und schreiben:

CREAR TRIGGER Auftragsdatum1_Trigger


DESPUÉS INSERTAR

EN Auftrag
COMENZAR ATÓMICO

ACTUALIZAR AUFTRAG
ESTABLECER Dato = FECHA_ACTUAL;
FIN;

Este Befehl geht einen Schritt zu weit: Bei jedem Einfügen in die RelationAuftrag
werden alle Datumsangaben aller Aufträge auf das heutige Datum gesetzt.
Ausschlaggebend está aquí die AngabePara cada declaración. Esto es estándar. Sie
veranlasst, dass der auszuführende Befehl, hier der Update-Befehl, genau einmal für die
gesamte Relation angestoßen wird. Nach jedem Einfügen in die RelationAuftragwird
damit das Datum aller Aufträge auf das aktuelle Datum gesetzt. Dies ist mit Sicherheit
nicht gewünscht.
Mit der häufig gesetzten AngabePor cada filawird der Trigger für jede einzelne
betroffene Zeile ausgelöst. Desde principios de 1999 se incorporó el disparador en la
norma SQL según la implementación de diversas implementaciones. Wir wollen daher
este Beispiel speziell für Oracle losen. Mit dem folgenden Befehl erhalten wir das
Gewünschte:

CREAR DISPARADOR Auftragsdatum2_Trigger


ANTES DE INSERTAR
EN Auftrag
5.7 Activador 161

REFERENCIA NUEVO COMO neu


PARA CADA FILA
COMENZAR

:neu.Datum := FECHA_ACTUAL ; FIN ;

Oracle weicht an drei Stellen von der Norm ab: Der Beginn des Anweisungsteils heißt laut
NormComenzar atómicoen seguidaComenzar. Dem Aliasnamen für ein Tupel wird in Oracle der
Doppelpunkt vorangestellt, und der Zuweisungsoperator ist im Standard das
Gleichheitszeichen ,=‘ und nicht ,:=‘.
Wir geben hier mittels der AngabeReferenciandoallen geänderten Tupel den Namen
nuevo y führen für jede zu ändernde Zeile die angegebene Zuweisung aus. Hemos
activado el disparador de inserción anterior, pero después de eso no podemos usar el
dispositivo.
Oracle, SQL Server y MySQL activan los Triggers, que se superponen en las
normas SQL modificadas constantemente. Leader weicht die Sintaxis teilweise
erheblich ab. Esto está incluido para SQL Server, así como para MySQL. Wir
verweisen auf die Handbücher und gehen nicht weiter darauf ein. Oracle Hinggen
unterstützt die Norm bis auf einige Feinheiten weitgehend.
Wir wollen noch ein Beispiel aufzeigen, über das wir bereits im Abschn.5.5bei den
Zusicherungen gesprochen hatten: Der Auftragspreis darf nicht höher sein als der
Listenpreis. Falls dies versehentlich doch passieren sollte, wollen wir den Listenpreis
verwenden und eine Meldung ausgeben. Esto es lo último en Oracle como sigue:

CREAR DISPARADOR Auftragspreis_Trigger


ANTES DE INSERTAR O
ACTUALIZAR EN Auftragsposten
REFERENCIAR NUEVO COMO neu POR CADA FILA
DECLARAR
escucharpreis NUMERIC(8,2) ;
BEGIN
SELECCIONAR :neu.Anzahl*Preis - - Berechnung des Listenpreises
EN escuchapreis
DE Artículo
DONDE Anr = :neu.Artnr ;
SI (:neu.Gesamtpreis > listeningpreis)
ENTONCES
:neu.Gesamtpreis := escucharpreis ; dbms_output.put_line (’Preis in
Posnr ’ || :neu.posnr ||
'geändert');
FIN SI;
FIN ;
162 5 La descripción general de SQL

Oracle utiliza Triggern y Prozeduren en su lenguaje interno PL/SQL. Wir sehen, dass in
diesem Beispiel der Trigger vor dem Einfügen oder Ändern ausgeführt wird. Es una
variableescuchapreisDeklariert und in diese Variable mittels eines Select-Into-Befehls der
Listenpreis aus der RelationAuftrageingetragen. Ist dieser niedriger als der eingegebene
Preis, so wird der Preis auf den Listenpreis gesenkt und eine Meldung ausgegeben.

El disparador también se activará. La sintaxis aquí es:

DROP TRIGGER Nombre del activador

In unserem Beispiel löschen wir den TriggerPrecio adicional_Triggercómo seguir:

DROP TRIGGER Auftragspreis_Trigger ;

Trigger es un enorme dispositivo con múltiples ajustes de configuración, incluidos en


Oracle y SQL Server. Sie werden nicht nur zur Einhaltung der semantischen Integrität
eingesetzt. Zusätzliche Anwendungen ergeben sich in der Protokollierung von
Ereignissen oder auch durch zusätzliche Hinweise. Sinken beispielsweise Warenbestände
auf ein Maximum, so kann mittels eines geeigneten Triggers sofort eine Warnung
ausgegeben werden.

5.8 Secuencia

Allein in unserer kleinen BeispieldatenbankBicicletagibt es zahlreiche Números:persona,


Auftrnr,Artnr,Liefnr,Kundnrnosotros. Estos zahlen pueden ser relativamente libres de errores y
sin meist auch Primärschlüssel und damit eindeutige Identifikatoren. Werden neue Einträge
hinzugefügt, so müssen wir sicherstellen, dass wir auch eine neue Nummer wählen. Um dies zu
garantieren, sollten wir das Datenbanksystem zu Hilfe nehmen. En SQL2003, se incluye un
elemento hervorragend geeignetes Hilfsmittel:secuencia .
Sequenzen ermöglichen eine automatische Nummerierung nach gegebenen Regeln.
La sintaxis SQL para definir y seleccionar una secuencia lautet:

CREAR SECUENCIA Nombre de secuencia [AS Datentyp]


[ COMENZAR CON Konstante ] [ INCREMENTAR POR Konstante ] DROP
SEQUENCE Sequenzname

Esta sintaxis se entiende por SQL Server. Oracle erlaubt das Festlegen eines Datentyps nicht.
Las secuencias se encuentran en Oracle en 38stellige Ganzzahlenwerte. MySQL no modifica
ninguna secuencia y está configurada automáticamente de forma automática. Aquí puedes
crear una tabla de creación de un atributo de la camaautoincrementozugeordnet werden.
Entonces se activa automáticamente cuando se introduce este atributo en un nuevo estado.
5.9 Zugriffsrechte 163

Wollen wir beispielsweise unsere Auftragsnummern automatisch vergeben, und sollen


diese Nummern mindestens vierstellig sein, sollen wer definieren:

CREAR SECUENCIA Auftragssequenz


COMENZAR CON 1000;

Fügen wir jetzt einen neuen Auftrag mit dem heutigen Datum, Kundennummer 3 y
Personalnummer 5 in unserer RelationAuftraghinzu, so könnte dieser Einfügebefehl wie
folgt lauten:

INSERTAR EN Auftrag (Auftrnr, Datum, Kundnr, Persnr) VALORES (SIGUIENTE


VALOR PARA Auftragssequenz, CURRENT_DATE, 3, 5);

Standardmäßig wird bei jeder Verwendung des AusdrucksSiguiente valor parazur


angegebenen Sequenz ein um 1 erhöhter Wert erzeugt und verwendet. Das obige
Beispiel muss für Oracle leicht modifiziert werden. Heer verwenden wir stattdessen:
Auftragssequenz.Nextval.
Wir empfehlen insbesondere bei Primärschlüsseln dringend, von Sequenzen regen
Gebrauch zu machen. Verbessern damit die Integrität einer Datenbank deutlich. Wir
kommen im Abschn.5.11zur Integrität darauf zurück.

5.9 Zugriffsrechte

Bei der Definición de Sichten en Abschn.5.4Haben wir bereits über Datenschutz gesprochen.
Wir hatten Sichten definido und angesprochen, dass der Anwender nur Zugriff auf diese
Sichten und nicht auf die zugrunde liegenden Basisrelationen erhält. Estos Zugriffsrechte
werden en SQL con ellosConceder-Befehl vergeben und mit demRevocar-Befehl wieder
entzogen. Um Missbrauch zu verhindern, ist das Ausführen vonConceder- yRevocar-Befehlen
nur einem dazu autorisierten Benutzerkreis gestattet.
Grundsätzlich gilt, dass der Eigentümer einer Basisrelation, einer Sicht oder eines Gebiets
alle Rechte aufseinEigentum besitzt. Estos derechos pueden ser dem Eigentümer auch nicht
entzogen werden und erlöschen erst mit dem Entfernen der entsprechenden Relationen oder
Gebiete aus der Datenbank.
En SQL ist der Benutzer, der einen entsprechenden Create-Befehl ausführt,
automáticamente Eigentümer estos nuevos elementos del banco de datos. Der
Systemverwalter wiederum legt beim Erzeugen einer Datenbank fest, welche Benutzer
überhaupt dieses Privileg zum Erzeugen von Relationen und Gebieten erhalten.
Da der Eigentümer alle Rechte besitzt, kann er nach BeliebenjábegaRelationen oder Gebiete
mittels eines Alter-Befehls ändern oder eines Drop-Befehls löschen. Er vergibt mit dem
Conceder-Befehl gezielt Zugriffsrechte an andere Benutzer und entzieht sie bei Bedarf mit dem
Revocar-Befehl wieder. Wegen dieser weitreichenden Rechte wird der Eigentümer
164 5 La descripción general de SQL

einer Datenbank in der Praxis meist der Systemverwalter selbst oder ein entsprechend
autorisierter Benutzerkreis sein.
Umgekehrt besitzen alle Benutzer aus Sicherheitsgründen standardmäßig keinerlei
Rechte auf das Eigentum other Benutzer. Eine Datenbank macht in der Praxis aber
natürlich erst dadurch Sinn, dass neben dem Eigentümer auch andere Personen auf die
Inhalte von Basisrelationen und Sichten zugreifen dürfen. Deshalb wird der Eigentümer
entsprechende Zugriffsrechte an other vergeben. Es sei hervorgehoben, dass sich diese
Rechte allein auf den Zugriff beziehen. Ein Eigentümer kann, auch wenn er es wollte,
keine DDL-Rechte weitergeben, also Rechte, die den Aufbau seiner eigenen Relationen
beeinflussen. Rechte zum Erzeugen, Löschen und Ändern von Relationen und Gebieten
kann nur der Systemverwalter gewähren.
Zur Weitergabe von Zugriffsrechten auf die Dateninhalte steht dem Eigentümer einer
Relation derConceder-Befehl zur Verfügung. La sintaxis desConceder-Befehls lautet:

CONCEDER FZugriffsrecht [ , ... ] | TODOS [ PRIVILEGIOS ]gramo


EN LA MESA ] FNombre de la tabla | nombre de usuariogramo

A Benutzer [ , ... ]
[ CON OPCIÓN DE SUBVENCIÓN ]

CONCEDER Zugriffsrecht
EN DOMINIO Nombre Gebiets
A Benutzer [ , ... ]
[ CON OPCIÓN DE SUBVENCIÓN ]

Im ersten Fall werden Zugriffsrechte auf Relationen (die AngabeMesaist wahlfrei und nur
ein Füllwort) und im zweiten Fall Rechte auf Gebiete vergeben. Da Gebiete nur in ganz wenigen
Datenbanksystemen implementiert sind, werden wir darauf nicht weiter eingehen. Die zu
vergebenden Zugriffsrechte werden in einer Kommaliste aufgezählt. Los derechos reservados
se encuentran en la pestaña.5.6zusammengefasst. Ebenfalls können, durch Komma getrennt,
mehrere Benutzer gleichzeitig angegeben werden, diese aufgeführten Rechte erhalten sollen.
El Klausel opcionalCon opción de subvenciónerlaubt das Weitergeben der erworbenen Rechte
und wird weiter unten besprochen.

Pestaña. 5.6Zugriffsrechte en SQL

Zugriffsrecht duda...
Seleccionar den lesenden Zugriff auf eine Relation
Actualizar das Ändern von Inhalten una relación
Actualización (x1,…) das Ändern der Attributwert x1,… una relación
Borrar das Löschen von Tupeln una relación
Insertar das Einfügen neuer Tupel in eine Relation
Insertar (x1,…) das Einfügen der Attributwerte x1,… en una relación
Referencias (x1,…) das Referenzieren der Attribute x1,… una relación
Uso das Verwenden eines Gebietes
5.9 Zugriffsrechte 165

Las primeras páginas en Tab.5.6aufgeführten Zugriffsrechte sind leicht nachvollziehbar.


Hiermit werden auf die angegebenen Relationen und Sichten Zugriffe zum Lesen (Seleccionar),
en adelante (Actualizar), Löschen (Borrar) y Einfügen (Insertar) vergeben. Estos Zugriffsrechte
stimmen también genau mit den Namen der entsprechenden SQL-Zugriffsbefehle überein. Das
Recht zum Ändern und zum Einfügen kann zusätzlich auf bestimmte Attribute eingeschränkt
werden, die in einer durch Komma getrennten Attributliste aufgeführt sind. Wird das
EinfügerechtInsertarnicht für alle Attribute gewährt, so werden die weiteren Attribute beim
Einfügen mit demNulo-Wert belegt. Weiter von Interesse ist das Referenzrecht. Nur wer dieses
Recht besitzt, kann mittels Integritätsbedingungen die angegebenen Attribute dieser Relation
referenzieren. Von untergeordneter Bedeutung ist das Usage-Recht, da Gebiete kaum
implementiert sind. Dieses Recht bezieht sich auf Gebiete. Nur wer das entsprechende Usage-
Recht besitzt, darf dieses Gebiet im Create-Table-Befehl benutzen.

I elConceder-Befehl dio un,welche benutzer aufrelación welche (oder welches


Gebiet)welche Zugriffsrechte erhalten.

Im Allgemeinen kann ein Benutzer Rechte, die er von einem other Benutzer erhält, nicht an
einen Dritten weiterreichen. Nur wenn ihm auch diese Erlaubnis ausdrücklich gegeben wird,
steht ihm dieses Weitergaberecht zu. Ein Benutzer drückt dieses Recht zur Erlaubnis der
Weitergabe von Zugriffsrechten imConceder-Befehl mittels der optionen KlauselCon opción de
subvenciónaus.
Dank dieser KlauselCon opción de subvenciónkönnen Zugriffsrechte hierarchisch
vergeben werden. Beispielsweise vergibt der Eigentümer einer Relation Rechte an einen
Projektverantwortlichen mit esta opción. Esto significa que estos derechos se aplicarán en
el futuro de sus proyectos.
Will ein Benutzer alle Rechte an einer Relation an andere Benutzer weitergeben, so kann er
statt der komplett aufgeführten Zugriffsliste kurz

TODOS [ PRIVILEGIOS ]

schreiben. Es sei angemerkt, dass natürlich nur die Rechte weitergegeben werden, die der
Benutzer, der diesen Befehl eingibt, tatsächlich besitzt. Nach Ausführung estasesConceder-
Befehls haben también die in der Benutzerliste aufgeführten Benutzer genau die gleichen
Rechte wie der gewährende Benutzer. Auch die Benutzerliste kann mittels des Bezeichners
Públicoabgekürzt werden. En este otoño erhaltentodos Benutzer der Datenbank die
aufgeführten Zugriffsrechte auf das entsprechende Objekt.
Un mínimo de 100 registros de llamadas pueden reducir el tiempo de uso de SQL-BefehlsRevocar
wieder entzogen werden. La sintaxis desRevocar-Befehls ähnelt der desConceder-Befehls und lautet

REVOCAR [OPCIÓN DE CONCESIÓN PARA]

FZugriffsrecht [ , ... ] | TODOS [ PRIVILEGIOS ]gramo


166 5 La descripción general de SQL

EN LA MESA ] FNombre de la tabla | nombre de usuariogramo


DESDE Benutzer [ , ... ]
FRESTRINGIR | CASCADAgramo

REVOCAR [ OPCIÓN DE OTORGAR PARA ] Zugriffsrecht


EN EL DOMINIO Gebietsname
DESDE Benutzer [ , ... ]
FRESTRINGIR | CASCADAgramo

Wird einem Benutzer ein Zugriffsrecht entzogen, das er weitergegeben hat, und ist im
Revocar-Befehl die Opcióncascadaangegeben, so ist es auch diesen anderen Benutzern
entzogen. Wird einem Benutzer ein Zugriffsrecht von mehreren Anwendern gewährt, so
verliert er dieses Recht erst endgültig, wenn ihmtodos Anwender dieses Zugriffsrecht
entziehen. Dieses kaskadierende Entziehen der Zugriffsrechte wollen wir am Beispiel von Abb.
5.1nachvollziehen. Wir gehen davon aus, dass dortUsuario AZugriffsrechte an einer Relation
besitze, die er mit der OptionCon opción de subvenciónunUsuario ByUsuario Cweitergibt.
Gemäß der Abbildung gibt monjaUsuario Cdas Recht weiter anUsuario Dy este es un Usuario E.
Usuario Eerhält dieses Recht auch vonUsuario C. Die Ausgangssituation ist nun, dass alle fünf
Benutzer zugreifen dürfen.
Wird jetzt das Zugriffsrecht vonUsuario AunUsuario Bkaskadierend entzogen, así que también
Usuario Dkeinen Zugriff más.Usuario Ebisagragen darf húmedoUsuario Cweiter die Relation
verwenden. solléteUsuario AunUsuario Bspäter wieder Rechte einräumen, so erhältUsuario D¡Nicht
auch automatisch Zugriff! primer despeinadoUsuario Boder ein other Benutzer ihm erneut explizit
Rechte gewähren.
Wird im Revocar-Befehl la opciónRestringirverwendet, so wird die Ausführung des Befehls
abgewiesen, wenn die zu entziehenden Rechte auch an andere weitergegeben wurden. Ist
zusätzlich die OptionOpción de subvención paraangegeben, so werden nicht die aufgezählten
Zugriffsrechte selbst, sondern nur das Recht des Weitergebens dieser Rechte entzogen.

Auch im Revoke-Befehl dürfen alle Rechte mittels der OptionTodos los privilegiosentzogen
werden. Es versteht sich aber von selbst, dass selbstverständlich nur die Rechte
weggenommen werden, die der Benutzer tatsächlich besaß. Dies gilt allgemein: Besitzt ein
Benutzer beispielsweise nur ein Änderungsrecht auf ein bestimmtes Attribut und wird

Tejido. 5.1kaskadierende
Zugriffsrechte Usuario A

Usuario B Usuario C

Usuario D Usuario E
5.10 Zugriffsschutz 167

ihm das Änderungsrecht auf die gesamte Relation entzogen, so ist natürlich nur dieses
eine Attribut betroffen. Wir dürfen also beim Entziehen von Rechten grundsätzlich mehr
Rechte angeben als der Benutzer besitzt. El sistema no tendrá derecho a aceptar los
derechos de los usuarios.
Zum Schluss dieses Abschnitts wollen wir ein kleines Beispiel angegeben. Wir als
Eigentümer derBicicleta-Datenbank gestatten dem BenutzerPerschefdas Recht zum Lesen
der RelationPersonal(Pestaña.2.6) y zum Ändern der AttributeGehaltyVorgesetzt relación
dieser. Er darf diese Rechte auch an andere Benutzer weitergeben:

GRANT Seleccionar, Actualizar (Gehalt, Vorgesetzt)


EN Personal A Perschef CON
OPCIÓN DE SUBVENCIÓN ;

Es gibt bei den einzelnen Datenbankherstellern wieder einige Abweichungen von der
Norm. Da von Oracle, SQL Server y MySQL no son dispositivos compatibles, entfällt
natürlich jeweils das Usage-Recht.
Oracle unterstützt imRevocar-Befehl die BezeichnerOpción de subvención para,
Restringiry cascadanicht. Opción de morircascadaist Standard: Die betroffenen Benutzer
und alle Benutzer, an die diese Rechte weitergereicht wurden, verlieren die angegebenen
Zugriffsrechte. MySQL se adapta perfectamente a Oracle. Zusätzlich ist das Referenz-
Recht no implementiert.
SQL Server incorporado en la pantalla de inicioRestringirnicht. Dieses Verhalten ist
standardmäßig gesetzt und gilt, falls nicht der Bezeichnercascadaangegeben wird. SQL Server
se utiliza como fuente de seguridad en Zukunft den BezeichnerTodos los privilegiosnicht mehr
unterstützen, die Zugriffsrechte müssen dann einzeln angegeben werden.
Todos los registros de datos bancarios han sido realizados entre BefehleConcederyRevocar
erheblich erweitert. Hiermit können auch Rechte auf Rollen, auf DDL-Befehle und Datenbankrechte
vergeben werden. Es wird empfohlen, die entsprechenden Manuale zu lesen.

5.10 Zugriffsschutz

Der Schutz der Daten darf nicht hoch genug eingestuft werden. Este comienza con los
físicos Aufstellen des Rechners und der Ermittlung des Personenkreises, der Zutritt zum
Rechnerraum besitzt. Jeder direkte physische Zugriff ermöglicht Manipulationen. Daher
ist hier mit besonderer Vorsicht vorzugehen. Die zweite Sicherheitsstufe ist der Anschluss
ans Datennetz und die Festlegung der Betriebssystem- und Netzkennungen und die
dazugehörigen Schutzwörter zum softwareseitigen Zugriff auf diesen Rechner. Dies ist
Aufgabe des Netzadministrators und des Betriebssystemverwalters. Bei besonders
schützenswerten Datenbeständen spielt auch die Art der Zugriffskontrolle eine wichtige
Rolle. Neben Schutzwörtern wird hier meist eine zusätzliche Identifizierung, etwa mittels
Chip-Karte, verlangt. Das Betriebssystem und die Datenbank müssen ferner dafür sorgen,
168 5 La descripción general de SQL

dass keine Zugriffe auf dien der Datenbank von Betriebssystemseite möglich sind. Zugriffe
haben ausschließlich über das Datenbankverwaltungssystem zu erfolgen. Über eine
Verschlüsselung von besonders schützenswerten Datenbankbereichen ist unbedingt
nachzudenken. Weitere Schutzmaßnahmen sind denkbar, wie etwa hardwareunterstützter
Speicherschutz und regelmäßiges Ändern der Kennwörter.
Als dritter Schutz kommt schließlich insidehalb der Datenbank der Grant-Befehl hinzu.
En Summe erhalten wir einen dreifachen Wall um die Datenbank, wie wir dies in Abb.5.2
Haben ilustrado. El administrador del banco de datos es válido para este muro interno. Er
definiert geeignete Sichten und vergibt óptima passende Zugriffsberechtigungen.

Dieses Verzahnen von Sichten und Grant-Befehlen wollen wir an einem Beispiel aufzeigen.
Nehmen wir wieder die sensen Personaldaten der RelationPersonaltambién Tab.10.3. Sie
enthalten unter anderem das Gehalt jedes Mitarbeiters, ebenso alle Daten der Vorgesetzten
(als Vorgesetzte bezeichnen wir die Personen, die selbst keine Vorgesetzten haben, im
entsprechenden Feld also den EintragNuloenthalten). Sicherlich darf this Relation nur für einen
kleinen Mitarbeiterkreis zugänglich gemacht werden. Además, puede utilizar esta relación sin
fechas sensibles, también para otras tareas que se adapten a sus necesidades.
En SQL estándar no hay ninguna modificación, no hay ninguna sección (restricción o
proyección) de una relación para el mejor uso posible. Entweder ein Benutzer kann die
gesamte Tabelle lesen, oder eben nicht. Este problema de grifo se produce también con
la ayuda de Hilfe von Sichten ganz einfach lösen. Wir definieren dazu die Sicht Personal:

CREAR VER VPersonal COMO


SELECCIONAR Persnr, Nombre, Ort, Vorgesetzt, Aufgabe Personal
DE
DÓNDE Vorgesetzt NO ES NULO;

Physischer Zugang zum Rechenzentrum


Zugriff auf Netz und Datenbankrechner

Zugriff auf die Datenbankdaten

banco de datos

Zugriffe de Außen

Tejido. 5.2Zugriffsmöglichkeiten auf eine Datenbank


5.11 Integridad 169

Pestaña. 5.7Beispiel zu Zugriffsrechten

Benutzer derecho

Alle Benutzer Seleccionar derecho aufPersonal


Seleccionar y actualizar Recht aufPersonal
Abteilungsleiter
Seleccionar derecho aufPersonal
Seleccionar derecho aufPersonal
Personalabteilung
Änderungsrechte auf einzelne Attribute vonPersonal
chefpersonal Todos los derechos aufPersonal

Esta vistaPersonalincluye una restricción y una proyección. Erlaubt der Administrador


bzw. Eigentümer jetzt jedem Benutzer Leserechte auf die SichtPersonal, aber keine
Zugriffsrechte auf die RelationPersonal, so sind die empfindlichen Daten voll geschützt,
ohne dass der Allgemeinheit wichtige Informationen vorenthalten werden. Wir könnten
sogar ganz gezielt Rechte vergeben. Ein Vorschlag está en la pestaña.5.7angegeben.
Wir erkennen an diesem einfachen Beispiel, dass durch das Zusammenwirken der
Vergabe von Zugriffsrechten und dem Einrichten geeigneter Sichten ein Optimum
Zugriffsschutz und damit Sicherheit im Datenbankbetrieb gewährleistet wird.
Häufig bedienen sich Datenbankbetreiber weiterer Schutzmechanismen. An dieser
Stelle sei aufAuditorías bisagras. Ein Audit ist eine Protokollierung des gesamten
Datenbankverkehrs. Hier werden neben dem durchgeführten Befehl die ausgeführten
Änderungen, vor allem aber das Datum, die Uhrzeit, der Benutzer und die Netzadresse
vermerkt. Allein mit diesem Protokoll werden keine unerlaubten Zugriffe verhindert. Doch
jeder Benutzer, berechtigt oder nicht, ist das Protokoll immer identifizierbar. Dies ist eine
nicht zu unterschätzende Abschreckung gegen ilegale Zugriffe. Es sei allerdings nicht
verschwiegen, dass solche Audits zusätzliche Rechnerleistung kosten. Además, estas
auditorías también deben estar seguras de que Zugriff Dritter sein. Sie werden daher
meist nur in besonders zu sichernden Datenbanken eingesetzt, beziehungsweise in
konkreten Verdachtsfällen zugeschaltet.

5.11 Integridad

Wir haben uns bereits in Abschn.2.4ausführlich mit dem Themaintegridad beschäftigt. Wir
haben gesehen, dass es das Ziel einer Datenbankanwendung ist, alles dafür zu tun, dass die in
der Datenbank gespeicherten Daten korrekt sind und mit den realen Gegebenheiten
übereinstimmen. Wir wollen hier zusätzliche Möglichkeiten aufzeigen. Die beiden
Integritätsregeln wurden ausführlich in Abschn.2.4vorgestellt. Auch auf Zugriffsrechte und
Zugriffsschutz gingen wir in den letzten Abschnitten ein. Moririntegridad semántica bedarf
aber einiger Ergänzungen. Damit Daten korrekt gespeichert sind, sollte ein
Datenbankverwaltungssystem dem Anwender unter die Arme greifen.
170 5 La descripción general de SQL

Jede Eingabe und jede Änderung kann zu inkorrekten Daten führen. Wie leicht können
Namen falsch geschrieben oder Zahlen fehlerhaft getippt werden. Solch inkorrekte Eingaben
geschehen in der Praxis immer wieder und lassen sich auch mit größter Sorgfalt nicht ganz
vermeiden. Jedes Datenbanksystem und der Anwendungsprogrammierer müssen daher den
Anwender bei Eingaben unterstützen. Solche Hilfestellungen incluye:

- Der Benutzer greift nur über Bildschirmmasken und Eingabefelder zu.


- Die Eingabefelder sind eingabespezifisch: Bei Zahleneingaben werden beispielsweise nur
Ziffern zugelassen.
- Bei Eingaben werden soweit wie möglich nur vordefinierte Auswahlwerte erlaubt.
- Nummern wie Bestell- oder Auftragsnummern se generan automáticamente.
- Das Anwendungsprogramm und die Datenbank überprüfen zusätzlich auf Plausibilität und
Korrektheit.

Wir erkennen hier drei wichtige Schnittstellen. Zum einen benötigen wir una leistungsfähige
GUI (interfaz gráfica de usuario), um die Bildschirmmasken anwenderfreundlich zu gestalten.
Zum anderen brauchen wir Anwendungsprogramme und eine Datenbank, die die die
semantische Integrität hervorragend unterstützen.
La interfaz gráfica de usuario no está vinculada a los bancos de datos. Wir empfehlen
leistungsfähige professional Werkzeuge. Aquí se reproducen sus juegos en Eclipse y Windows
en Visual Studio.
Das Anwendungsprogramm sollte die Möglichkeiten der Datenbank ausschöpfen. Ein
Beispiel sind Vorgabewerte. Wenn ein Bestandskunde einkauft, sollte im
Verkaufsformular die Liste der Kunden angezeigt werden, so dass der Verkäufer den
Kunden nur noch auswählen muss, siehe beispielsweise Abb.5.3. Dies erfordert
zusätzliche lesende Zugriffe auf die Datenbank und kostet demnach Performance. Si se
trata de una solución adecuada a una integridad, entonces la respuesta se realizará
automáticamente con los números de cuenta corregidos.
Más información sobre todos los números generados, que se incluyen
automáticamente en MySQL o con secuencias de SQL2003, como Abschn.5.8en este
Kapitel. Jeder generierte Wert ist ein Wert, der Anwender nicht eingeben muss, der
Anwender also keinen Eingabefehler verursachen kann!
In ganz vielen Fällen kommen wir um Benutzereingaben aber nicht herum. Hier empfehlen
wir dringendst, den Benutzer einzuschränken. Nur so kann sichergestellt werden,

Tejido. 5.3Auswahl von


Vorgabewerten
5.11 Integridad 171

dass bei den Eingaben möglichst wenig Fehler gemacht werden. Die dazu erforderlichen
Werkzeuge haben wir bereits kennengelernt und sind zusammenfassend in Tab.5.8aufgelistet.

Wir wollen diesen Abschnitt mit dos Wei Beispielen beenden. Im ersten Beispiel werden wir
in der RelationPersonalel atributoTiempo de gobiernoeinfugen. Dieses enthält die
Wochenarbeitszeit. Ist in der Firma fest vorgesehen, dass Mitarbeiter immer zwischen 15 und
40 Stunden pro Woche arbeiten, sollte dies auch in der Datenbank fixiert werden. Der Befehl
zum Einfügen estos atributos könnte lauten:

ALTER TABLE Personal ADD Arbeitszeit INTEGER NOT NULL


VERIFICAR ( Arbeitszeit ENTRE 15 Y 40 );

Es liegt dabei im Ermessen des Datenbankdesigners, ob er diese Bedingung bereits beim


Erzeugen der Relation setzt, oder etwa erst in der Anwendung mittels eines Triggers.
Zusicherungen und Gebiete sind in nur ganz wenigen Datenbanken implementiert und
entfallen daher in der Praxis. Unsere Empfehlung ist es, auf Jahre festgelegte Werte gleich in
der Datenbank zu fixieren. Werte, die sich gelegentlich ändern können, werden besser mit Hilfe
von Triggern oder in der GUI eingeschränkt.
Im zweiten Beispiel wollen wir sicherstellen, dass Nettopreis und Steuer zusammen den
Preis ergeben. Dies können wir wiederum mittels einer Check-Bedingung erreichen:

ALTERAR TABLA Artículo AÑADIR RESTRICCIÓN Preischeck VERIFICAR


(Preis = Netto + Steuer);

Este Befehl no es ungefährlich, da esta Bedingung wegen Rundungsfehlern nicht


zwingend immer exakt gilt. Aquí es mejor que se activen pequeños intervalos, o varios
factores desencadenantesNettopreisySteuerautomatisch berechnen zu lassen, siehe
Übungsaufgabe.
Zuletzt weisen wir noch darauf hin, dass Integrität ohne Transaktionen kaum
vorstellbar ist. Las transacciones garantizan la coherencia y la integridad. Wird durch eine
der oben erwähnten Maßnahmen eine Verletzung einer Integrität festgestellt, so wird in
der Regel eine Ausnahmebehandlung gestartet. Entweder wird jetzt der Anwender zur
nochmaligen Eingabe aufgefordert, oder die Transaktion wird aus Konsistenzgründen
zurückgesetzt.

Pestaña. 5.8Werkzeuge zur Unterstützung korrekter Eingaben

Befehl Información

Crear mesa Check-Bedingung


Crear vista Con opción de cheque
Crear aserción Datenbankweite Zusicherung
Crear dominio Datenbankeinheitliche Gebiete
Crear disparador Eingabetrigger (Insertar, Actualizar, Eliminar)
172 5 La descripción general de SQL

5.12 Aufbau un Datenbank

In der Praxis besitzen große Datenbanken oft tausende von Basisrelationen. Hinzu
kommen ebenso viele Sichten, Trigger und Zugriffsrechte. Hier bietet sich eine
hierarchische Gliederung der Datenbank an. SQL añade jerarquía a la jerarquíacatálogo y
Esquema ein. Die Idee ist, dass eine Datenbank mehrere Kataloge enthält. Jeder Katalog
besitzt dann mehrere Schemata, und darin sind dann die einzelnen Objekte wie
Relationen und Sichten enthalten.
En la norma SQL, las versiones de los catálogos no se gestionan y no se
especifican. Anders verhält es sich mit den Schemata. Esto está en la norma
festgelegt und weitgehend umgesetzt.
Genau genommen kennt die SQL-Norm das Wortbanco de datosnicht. SQL besitzt daher
auch keine Sprachkonstrukte wieCrear base de datos. In der Praxis verwenden daher die
einzelnen Datenbankhersteller ihre eigene Implementierung. Wir gehen darauf im nächsten
Abschnitt näher ein. Wir dürfen folgenden Sachverhalt annehmen:
Ein Datenbankserver wird herstellerspezifisch eingerichtet. Este servidor incluye un propio
banco de datos. Alle darin angelegten Daten gehören zu dieser Datenbank. Diese besitzt
mindestens eine Hierarchiestufe, die Schema-Ebene. Es gibt in jeder Datenbank mindestens ein
Schema. Alle in der Datenbank gespeicherten Objekte werden eindeutig einem Schema
zugeordnet, ebenso in der Regel auch jeder Anwender. Häufig kann der Anwender bei
entsprechender Berechtigung das Vorgabe-Schema wechseln. Wir kommen im nächsten
Abschnitt darauf zurück.
Innerhalb eines Schemas sind alle Namen eindeutig, unabhängig davon, ob es sich um die
Namen von Basisrelationen, Sichten oder Triggern handelt. Greift ein Benutzer
Schemaübergreifend zu, so muss er den gewünschten Namen qualifizieren: Dem Objekt eines
anderen Schemas wird dazu der Schemaname, gefolgt von einem Punkt, vorangestellt. Gehört
la relaciónAuftragetwa zum esquemaRechnungswesen, entonces kann auf diese Relation
mittelsRechnungswesen.Auftragzugegriffen werden.
Para utilizar un esquema similar al siguiente SQL-Befehl:

CREAR ESQUEMA Schemaname [ AUTORIZACIÓN Benutzername ]


[ Elemento de esquema [ ... ] ]

Hiermit wird ein Schema definiert, das dem BenutzerBenutzernombrewird zugeordnet. Wird
kein Benutzername angegeben, so ist der Ausführende der Eigentümer des Schemas. La
creación de esquemas se incluye en el marco de uno o más elementos de esquemas que se
obtienen a través de espacios en blanco. Un elemento de esquema está entrelazado con un
Befehl zum Erzeugen, una relación de base, una sensación, un desencadenante, un derecho de
respuesta, un zusicherung o un gebiets. Ein Schema kann auch wieder gelöscht werden. Hierzu
existiert der folgende Befehl:

ESQUEMA DE CAÍDA nombre de esquema FCASCADA | RESTRINGIRgramo


5.12 Aufbau un Datenbank 173

Mit der AngabeRestringirwird das Löschen des Schemas zurückgewiesen, falls noch
Schemaelemente oder Verweise auf das Schema existieren. Mit der AngabecascadaWird das
Schema komplett entfernt, zusammen mit all seinen Elementen, also auch allen darin
enthaltenen Relationen und deren Inhalten.
Betrachten wir als Beispiel das Erzeugen der BeispieldatenbankBicicletamit Hilfe eines
Schemas. Der Befehl könnte wie folgt aussehen:

CREAR ESQUEMA Bicicleta

CREAR MESA Personal ( ... )


CREAR MESA Kunde ( ... )
CREAR MESA Auftrag ( ... )
CREAR VISTA VAuftrag ( ... ). . . ;

Este Beispiel beinhaltet auch eine SichtVAuftrag. Ebenso dürfen natürlich auch Create-
Trigger- und Grant-Befehle enthalten sein. Greift ein Anwender von außerhalb estos esquemas
Bicicletazu, so muss er den gesamten qualifizierten Namen angeben, beispielsweise
Bicicleta.AuftragoderBicicleta.Personal.
Es kann auch sehr einfach ein weiteres Objekt zu einem Schema hinzufügt werden. Dazu
muss nur das gewünschte Objekt entsprechend qualifiziert werden. Wollen wir etwa eine sicht
VLageren el esquemaBicicletaerzeugen, así que comienza der Befehl mit

CREAR VISTA Bike.VLager...

Abweichungen von this Norm in Oracle, SQL Server y MySQL werden in the folgenden
Abschnitten beschrieben. Weiterführende Información encontrada wir zum Beispiel en
Gulutzan und Pelzer (1999).

5.12.1 Esquema de información

Eine Datenbank besitzt unzählige Verwaltungs- und Metadaten: Zugriffsrechte,


Integritätsbedingungen, Sicht- oder Triggerdefinitionen. Aus Performancegründen stehen die
meisten dieser Daten im Arbeitsspeicher. Estas fechas deben ser persistentes, también después
de que los servidores se ausentan de ellas. Es ist mehr als nahe liegend, dass das
Datenbankverwaltungssystem diese und weitere Informationen in ihm vertrauten Strukturen
ablegt, también en Relationen.
Con SQL2 wurden estas fechas de verificación normiert: Jeder Katalog enthält un
vordefiniertes Schema mit dem NamenEsquema_información. Da in der Praxis Kataloge no
implementiert sind, bedeutet dies, dass jede Datenbank genau ein solches Schema besitzt. En
este esquema se incluyen la información de verificación en las relaciones abgelegt. Las mejores
relaciones se encuentran en la pestaña.5.9aufgezählt.
La lista en la tabla no es obligatoria. Sie zeigt aber, dass SQL die Datenbankstrukturen
komplett und übersichtlich verwaltet. Übrigens handelt es sich bei den
174 5 La descripción general de SQL

Pestaña. 5.9 Relación de esquemas INFORMACIÓN_SCHEMA

Relación enthält alle


ESQUEMAS esquemas
DOMINIOS Gebiete
MESAS relaciones básicas
PUNTOS DE VISTA Sichten
VIEW_TABLE_USAGE Abhängigkeiten der Sichten von Rel.
VIEW_COLUMN_USAGE Abhängigkeiten der Sichten von Attr.
COLUMNAS Spaltennamen aller Basisrelationen
TABLA_PRIVILEGIOS Zugriffsrechte auf Relationen
COLUMNA_PRIVILEGIOS Rechte auf Attribute aller Relationen
DOMINIO_CONSTRAINTS Bedingungen für alle Gebiete
TABLE_CONSTRAINTS Tablas de relaciones
RESTRICCIONES_REFERENCIALES camas referenciales
VERIFICAR_CONSTRAINTS Check-Bedingungen aller Relationen
DESENCADENADORES Desencadenar

TRIGGER_TABLE_USAGE Abhängigkeiten der Trigger von Rel.


TRIGGER_COLUMN_USAGE Abhängigkeiten der Trigger von Attr.
Afirmaciones Zusicherungen
DOMINIOS Gebiete

en la pestaña.5.9angegebenen Relationen meist um Sichten. Esta es la razón por la que, dass der
Benutzer nur die Informationen in übersichtlicher Form erhält, für die er oder der allgemeine
BenutzerPúblicoZugriffsrechte besitzt.
Den Zugriff auf die Daten des Information-Schemas wollen wir an einem Beispiel kurz
aufzeigen: Wollen wir alle Tabellen unserer Datenbank auflisten, so schreiben wir kurz:

SELECCIONAR *
DE Información_Esquema.Tablas;

Zu den einzelnen Attributen dieser Relationen sei auf die Norm und auf Gulutzan und
Pelzer (1999) verwiesen. La descripción completa incluye SQL2. En SQL3, SQL2003 y las
nuevas normas Kamen zusätzliche Einträge hinzu, beispielsweise für Objekte o XML-
Objekte. El esquema de información está integrado por SQL Server y MySQL. Oracle tiene
una implementación propia, auf die wir im folgenden Abschnitt eingehen.

5.12.2 Bancos de datos y Oracle

Der Aufbau einer Datenbank in Oracle entspricht der Norm: Eine Datenbank besteht aus
vielen Schemata. Oracle besitzt aber eine Einschränkung: Ein Schema ist immer direkt mit
einem Benutzer verknüpft. Mit dem Erzeugen eines Benutzers mit dem Create-
5.12 Aufbau un Datenbank 175

Usuario-Befehl (siehe Abschn.5.13) También se cambiarán automáticamente los nombres de los


esquemas. Jeder Benutzer besitzt somit genau ein Schema.
Im Prinzip benötigt daher Oracle no Create-Schema-Befehl. Esto no se puede
implementar trotzdem, um auf einfache Art und Weise in einem Schema viele Objekte zu
implementieren. Da in Oracle der Schemaname und der Benutzername identisch sein
müssen, darf allerdings kein Schemaname angegeben werden! El Befehl comienza con:

CREAR AUTORIZACIÓN DE ESQUEMA Benutzername...

Einen dazugehörigen Befehl zum Entfernen eines Schemas gibt es nicht. Es ist in
diesem Fall der Benutzer mittels des Drop-User-Befehls zu löschen.
Oracle conoce el esquemaEsquema_informaciónnicht. Stattdessen speichert Oracle
seine Verwaltungsdaten in über 100 speziellen Relationen. Die meisten davon sind
Sichten und Synonyme. Eine Kurzbeschreibung all dieser Relationen finden wir in der
Relation Diccionario. Wir können estos mittels einesSeleccionar-Befehls abfragen und
werden dann feststellen, dass viele Sichten mit „USER_“, andere wiederum mit „DBA_“,
„SYSTEM_“ oder „ALL_“ comienzan. Bei ersteren handelt es sich um Relationen und
Sichten, die Informationen zu Datenstrukturen enthalten, die von Benutzern angelegt
wurden (siehe Tab.5.10). Die other drei Gruppen beinhalten Definiciones, die den
Datenbankadministrator bzw. das System bzw. alle Daten betreffen. Zugriffsrechte darauf
besitzt meist nur der Administrator. Weiter gibt es Systemtabellen, die ein Dollarzeichen
enthalten. No debemos usar ni ver el manual de Oracle.
Beispielsweise finden wir Informationen zu allen definierten Benutzerrelationen in der
RelationTablas_de_usuario. Weiter gibt es Relationen, die Informationen zu allen definierten
Spalten, Indexen, Sichten, Zugriffsrechten, Check- und Integritätsbedingungen enthalten.
Todas estas relaciones pueden realizarse con un Select-Befehl abgefragt werden. Über die
einzelnen Attribute jeder dieser Relationen sei auf das Oracle-Manual verwiesen. Esto

Pestaña. 5.10Tablas de sistemas adicionales en Oracle

Relación enthält
DICCIONARIO Zusammenfassung zu allen Systemtabellen
TABLAS_USUARIOS todas las relaciones de los benutzers
USER_TAB_COLUMNS alle Attribute aller Relationen des Benutzers
USUARIO_VISTAS alle Sichten des Benutzers
USUARIO_RESTRICCIONES todos los spalten- und tabellenbedingungen
todos los atributos, los spalten- und
USER_CONS_COLUMNS
tabellenbedingungen enthalten
ÍNDICES_USUARIOS todos los índices en las relaciones de los benutzers
USER_IND_COLUMNS todos los atributos, el índice seleccionado
USER_TAB_PRIVS Todos los privilegios en Bezug auf Relationen
USER_COL_PRIVS todos los privilegios en Bezug auf Attribute
USER_TRIGGERS todos los Trigger des Benutzers
USER_TRIGGER_COLS Todos los atributos se activan en el mismo disparador.
USER_TABLESPACES Todos los espacios de mesa de Benutzers
176 5 La descripción general de SQL

Relación entre todos los esquemasSISTEMA. Este esquema es totalmente válido, por lo que el
nombre del esquema no se activa cuando se anula, y el nombre de la relación existente se
reduce a la existencia local. Als weiterführende Literatur wird Kähler (2008) empfohlen.

5.12.3 Bancos de datos y SQL Server

El archivo de datos de un banco de datos en SQL Server se ajusta a la norma: un banco de


datos se adapta a varios esquemas. Seit SQL Server 2005 wurden auch Benutzer and Schema
getrennt. Mit dem Erzeugen eines Benutzers mit dem Create-User-Befehl (siehe Abschn.5.13)
Entweder dem Benutzer Standardmäßig das SchemadboZugeordnet, oder im Befehl wird das
Standardschema explizit angegeben. Jederzeit kann mit dem BefehlCrear esquema ein neues
Schema angelegt und dieses gleich einem Benutzer zugeordnet werden. El esquema estándar
puede permitir que se modifiquen las condiciones del usuario. Ein Benutzer kann also auch
mehrere Schemata besitzen. Als kleine Einschränkung gilt, dass einem Schema nur Relationen,
Sichten und Grant- und Revoke-Befehle zugewiesen werden können.

Das en la pestaña.5.9El esquema de información vorgestellte wird voll unterstützt.


Naturalmente, los datos en SQL Server no están definidos en términos de ubicación y
ubicación. Más información encontrada en Dewson (2012).

5.12.4 Bancos de datos y MySQL

El archivo de datos de un banco de datos en MySQL se ajusta a la norma: un banco de datos se


adapta a varios esquemas. Estos esquemas están en MySQL y bancos de datos. Beide Begriffe
werden sinónimo verwendet. Ein Schema ist nicht fest einem Benutzer zugeordnet. Daher ist es
auch nicht möglich, die AngabeAutorización Benutzernamezu verwenden. Después de los
registros en MySQL, el usuario utiliza un esquema. Dies geschieht mit dem Befehl

USE nombre de esquema;

Damit wird dem Benutzer dieses Schema als Standard zugewiesen. Während einer
Datenbanksitzung kann das Schema beliebig gewechselt werden. Das en la pestaña.5.9El
esquema de información vorgestellte wird voll unterstützt. Naturalmente, los datos en MySQL
no están definidos en términos de ubicación y ubicación. Zu Detalles verweisen wir auf Adams (
2012) y Buchmann y Smolarek (2005).
5.13 Einrichten und Verwalten von Datenbanken 177

5.13 Einrichten und Verwalten von Datenbanken

SQL lässt dem Datenbankhersteller free Hand im Einrichten und Verwalten einer
Datenbank. Werden daher im Folgenden auf die einzelnen Hersteller kurz eingehen. Ist
eine Datenbank erstellt, und sind Benutzer eingerichtet und zugelassen, so können diese
auf die Datenbank zugreifen. Und erst jetzt setzt SQL ein: Der Benutzer verbindet sich mit
der Datenbank mittels des SQL-BefehlsConectar. La sintaxis es la frase de Befehls:

CONECTAR AFPREDETERMINADO | Nombre del servidorgramo [AS Verbindungsname ]


[ USUARIO Benutzername ]

Wir verbinden uns demnach mit einem Server mittels eines frei wählbaren
Verbindungsnamen und des Benutzernamens. Maldita sea, inicia una sesión. Esta sesión
finaliza con el Disconnect-Befehl:

DESCONECTARFPREDETERMINADO | ACTUAL | Nombre de servidor SQLgramo

Die häufigste Angabe ist hierActual. No se activará la conexión actual de SQL Server.
Sind mehrere Verbindungen gleichzeitig geöffnet, so ist die zu schließende Verbindung
explizit anzugeben. Mit diesem Befehl werden beispielsweise auch alle temporären
Relationen wieder gelöscht. Zum Nachlesen wird Gulutzan und Pelzer (1999) empfohlen.
La norma SQL überlässt das Einrichten den Herstellern. Wir gehen im Einzelnen darauf
ein.

5.13.1 Bancos de datos de Oracle

El servidor Oracle crea más datos en el servidor correspondiente. Aus


Performancegründen ist davon aber eher abzuraten. In der Express Edition gibt es
allerdings nur eine Datenbank mit dem NamenXE. In der Vollversion wird schon im
Installationsprozess eine Datenbank angelegt. Aquí se muestra el administrador de
parámetros, además de los nombres de los bancos de datos. Otros bancos de datos
pueden cambiar el tiempo con el BefehlCrear base de datoserzeugt werden. La sintaxis
de estas Befehls es enorme, da hier alle spezifischen Einstellungen einer Datenbank
vorgenommen werden. Dazu gehören die physische Speicherung, aber auch die Angaben
zu den Logdateien und zum Archivlog (siehe Kap.8). Änderungen zur Datenbank erfolgen
mittels des BefehlsModificar base de datos. Das Löschen geschieht mit dem BefehlSoltar
base de datos.
Zur Steigerung der Performance solltenGrupo yEspacios de tabla werden
definidas. Los espacios de tabla sin elementos físicos, se pueden utilizar en varios
platos festivos, para reducir las respuestas en mitad del paralelo. Un grupo enthält
wiederum Relationen, die dann alle physisch auf un Festplatte nacheinander
178 5 La descripción general de SQL

Pestaña. 5.11 Befehle en Oracle zum Arbeiten mit Datenbanken

CREAR BASE DE DATOS Db_name Legt eine neue Datenbank an


ALTERAR BASE DE DATOS Db_name Ändert Datenbankeinstellungen
CREAR CLÚSTER Nombre del clúster Clúster Erzeugt einen neuen
CREAR USUARIO Nombrebenutzer Legt einen neuen Benutzer an
ALTERAR USUARIO Nombrebenutzer Ändert Benutzereinstellungen
CONECTAR Benutzer/Contraseña@Db Registro en Datenbank
Erzeugt einen physischen Bereich
CREAR ESPACIO DE TABLA Ts_name
für die Relationen und Indexe

angelegt werden. Dies beschleunigt die interna Suche auf Daten, wenn sehr häufig nur
internalhalb eines Clusters zugegriffen wird.
Beim Einrichten der Datenbank werden die drei Systemkennungensistema,Sistemay Dba
erstellt, wobeiDbagenau genommen keine Kennung sondern nur ein Privileg ist. Los registros
se realizan en Oracle en SQL*Plus bajo cada uno de estos identificadores, por lo que podemos
utilizar más aplicaciones. Soll etwa ein Benutzergascon la contraseñanuevoerzeugt werden, so
wären folgende beiden Befehle sinnvoll:

CREAR USUARIO gast IDENTIFICADO POR neu ;


GRANT Connect, recurso a gas;

Der zweite Befehl ist erforderlich, damit sich der neue Benutzergastambién einloggen
(RechtConectar) und Tabellen und Sichten anlegen kann (in der RolleRecursoenthalten, eine
Rolle enthält mehrere Rechte). Mit diesen Rechten verbindet sich der Benutzergas wie folgt mit
der Datenbankxe:

CONECTAR gast/neu@xe ;

In der Praxis verwenden wir heute grafische Oberflächen, diese Eingaben vereinfachen. Mit
der KonsolenanwendungSQL*Máslässt sich eine Datenbank aber jederzeit komplett einrichten
und verwalten. En la pestaña.5.11sind die einzelnen Befehle nochmals kurz zusammengefasst.
Zur Vertiefung sei auf Kähler (2008) verwiesen.

5.13.2 Bancos de datos de SQL Server

Microsoft SQL Server es un banco de datos moderno y seguro. Este banco de datos se
establece voll auf die grafische Oberfläche. El centro de gestión de datos bancarios está
formado por SQL Server Management Studio, creado por SSMS. Wir können in SSMS die
wichtigsten Funktionen mit Mausklicks erledigen, oder aber auch sehr umfassend von der
Kommandosprache Gebrauch machen: Wir können mittels des BefehlsCrear base de datoseine
neue Datenbank anlegen, estos mittels des BefehlsModificar base de datosmodificar
5.13 Einrichten und Verwalten von Datenbanken 179

und schließlich, falls gewünscht mittelsSoltar base de datosauch wieder entfernen. Innerhalb
jeder Datenbank lassen sich beliebig viele Schemata anlegen.
Die Verwaltung übernimmt das System selbstständig. No hay ningún clúster ni espacios de
tabla en Oracle. Es können aber Datenbankbereiche mittels sogenannter Filegroups definiert
werden. Wie in allen anderen Datenbanken können Benutzer angelegt und mit
Benutzerrechten ausgestattet werden. SQL Server incluye todas las referencias del Zugriff al
servidor y del Zugriff al banco de datos. Para los primeros nombres de usuario, tenemos un
nombre de inicio de sesión, para el segundo nombre de usuario. Zur einfacheren Handhabung
können der Login-Name und der Benutzername gleich lauten. Beispielsweise kann ein
Benutzergascon el esquema de inicioDbomit folgendem Befehl angelegt werden:

CREAR INICIO DE SESIÓN gast CONTRASEÑA = ’<Contraseña>’ ;


USO Bicicleta;
CREAR USUARIO gast PARA INICIAR SESIÓN gast CON DEFAULT_SCHEMA = dbo; HACER

Wir empfehlen aber die SSMS-Oberfläche. Heer können dem Benutzer mit wenigen
Mausklicks gleich vordefinierte oder selbst definierte Rollen zugewiesen werden. Das
Einloggen in die Datenbank erfolgt mit dem Starten und der Identifikation in SSMS. Mit
dem Beenden von SSMS termina también la sesión. Einen Connect-Befehl no se
proporciona en SQL Server. Utilice un registro interno en SQL Server para programar un
solo capítulo. Wir weisen zur Vertiefung auf Dewson (2012) hin.

5.13.3 Bancos de datos MySQL

MySQL es un banco de datos independiente. Cada servidor utiliza un banco de datos propio, los
esquemas internos más utilizados, en MySQL, así como los bancos de datos se utilizan. Mittels
der grafischen OberflächeBanco de trabajokönnen alle wesentlichen Aktionen ausgeführt
werden. Wir wollen hier jedoch kurz die befehlsorientierte Sintaxis betrachten. Das Einloggen
geschieht mit dem BefehlMySQLauf Betriebssystemebene. Aquí se muestra el parámetro–tuder
Benutzer mit angegeben. El sistema verwalterraízloggt sich demnach mit folgendem Befehl ein:

mysql-u raíz
usar bicicleta

Mit dem ersten Befehl wird eine Konsolenanwendung gestartet, mit dem dem dos
Befehl verwendet der Benutzer standardmäßig das Schemabicicleta. Stehen mehrere
MySQL Server zur Verfügung, so kann mittels des Parameters–hTambién se cambiará el
servidor, incluso la dirección IP incluida. Mit dem BefehlMySQLstarten wir demnach una
sesión. Por Eingabe des BefehlssalidaWird esto wieder beendet.
180 5 La descripción general de SQL

Wenn wir neben dem SystemverwalterraízMás información sobre cómo utilizar, debemos tener en
cuenta que MySQL no se utilizará en el mercado de nombres de host. No usaremos ningún nombre
de host, por lo que tendremos una identificación para todos los hosts externos angelegt. Soll mit
dieser Kennung auch lokal zugegriffen werden, so ist eine weitere Kennung erforderlich. Dies zeigen
wir mit den folgenden Anweisungen, die eine lokale und eine entfernte Kennunggascon la contraseña
nuevoanlegen. Es werden auch gleich Zugriffsrechte auf das SchemaBicicletavergeben:

CREAR USUARIO gast IDENTIFICADO POR ’neu’ ; CREAR USUARIO


gast@localhost IDENTIFICADO POR ’neu’ ; CONCEDER SELECCIONAR,
ELIMINAR, ACTUALIZAR EN Bike.* PARA gastar;
OTORGAR SELECCIONAR, ELIMINAR, ACTUALIZAR EN Bike.* A gast@localhost;

Wir sehen hier, dass wir mit einem einzigen Befehl Zugriffe auf alle Objekte des
SchemasBicicletagewähren können. Zur weiteren Vertiefung sei etwa auf Adams (2012)
verwiesen.

5.14 Aviso legal

Este Kapitel zeigt die Vielfalt der DDL-Befehle. Die wichtigsten von ihnen wurden
vorgestellt. Ganz wichtig sind die BefehleCrear mesa,Crear vista,Crear disparadory
Conceder. Hinzu kommen beim Anlegen des Systems die BefehleCrear usuarioyCrear
esquema. Den letzten Befehl benötigen wir in großen Datenbanken immer, um das
System zu unterteilen und nicht die Übersicht zu verlieren.
Ganz wichtig sind die Befehle zur Integrität. ¡Auch wenn dies an der einen oderen otras
Stelle etwas Performance kosten sollte, nichts wiegt eine korrekte Datenbank auf! Wir sollten
also mit Triggern und Check-Bedingungen nicht geizen. Genauso wichtig ist die
Zugriffssicherheit. Nur ein ausgefeiltes System zum Zugriff auf die Datenbank kann hier auf
Dauer für die notwendige Sicherheit sorgen. Aquí juega Sichten eine wichtige Rolle.
Der Entwurf einer Datenbank ist sehr aufwendig, lässt sich aber jerarchisch in vier Schichten
gliedern. Este es el siguiente:

- el físico Schicht
- die logische Datenbankschicht
- die logische Benutzerschicht
- die grafische Benutzeroberfläche

Estas vier Schichten sind voneinander entkoppelt. Die physische Schicht liegt in der
Verantwortung des Datenbankanbieters, kann aber meist beeinflusst werden, etwa in
Oracle con la definición de Tablespaces. Die logische Datenbankschicht umfasst das
Erstellen der Basisrelationen, etwa mit Hilfe des Entity-Relationship-Modells. Wir betonen,
dass im Entwurf keine Rücksicht auf die späteren Benutzer genommen werden muss.
5.15 Übungsaufgaben 181

Física DB-Schicht

Logische DB-Schicht

Benutzerschicht Benutzerschicht Benutzerschicht

GUI GUI GUI GUI GUI GUI GUI

Tejido. 5.4Modelo de banco de datos

Estos primeros pasos en el juego escrito por Schicht: Aquí podemos contar con Hilfe von
Sichten und dem Gewähren von Zugriffsrechten für jeden Benutzer oder jede Benutzergruppe
eine eigene Sichtweise der Datenbank erzeugen.
Zuletzt ist der Anwendungsprogrammierer an der Reihe. Er bietet dem Endbenutzer
eine grafische Oberfläche (GUI, interfaz gráfica de usuario) cómoda y übersetzt die
Zugriffe des Benutzers en Datenbankzugriffsbefehle. Tejido.5.4soll diese jerarchischen
Schichten illustrieren. Alle Schichten sind voneinander unabhängig und werden
nacheinander von oben nach unten entworfen.
Zuletzt sollten wir die Wichtigkeit des Transaktionsbetriebs nicht vergessen. Nur so
kann die Integrität wirklich voll unterstützt werden.

5.15 Übungsaufgaben

Aufgaben
Die folgenden Aufgaben beziehen sich auf die Relationen der Beispieldatenbank
Bicicleta anexo.

1. Schreiben Sie alle Create-Table-Befehle zum Erzeugen der Beispieldatenbank Bicicleta.


Geben Sie alle Entitäts- und Referenz-Integritätsregeln in Form von Tabellenund
Spaltenbedingungen an. Ergänzen Sie diese Angaben durch sinnvolle weitere
Integritätsbedingungen (Único,No nulo,Controlar).
2. Fügen Sie zur RelaciónAuftragspostenel atributoPremio Einzelhizu. Füllen Sie dieses
Attribut mit Daten, ermittelt aus den AttributenAnzahlyPrecio de venta. En la forma
normal de Welcher se encuentra la relaciónAuftragspostenjetzt?
3. Erzeugen Sie in der BeispieldatenbankBicicletauna nocheVicepresidentes, la relación
Personalningún atributoGehaltybeurteilungentspricht. Más sind in dieser
182 5 La descripción general de SQL

Sicht nur die Personen aufzunehmen, denen ein Vorgesetzter zugeordnet ist. ¿Liegt
eine änderbare Sicht vor?
4. Relación de muerteAuftragspostenenthält aus Redundanzgründen nur den Gesamtpreis
jedes einzelnen Auftragspostens. Schreiben Sie daher eine SichtVAuftragsposten, die
alle Daten der RelationAuftragspostenenthält und zusätzlich ein AttributPremio Einzel.
¿Ist this Sicht änderbar?
5. En SQL no es necesarioAlterar-Esquema-Befehl. Überlegen Sie, wie in ein existierendes
Schema weitere Schemaelemente aufgenommen werden können. Zeigen Sie muere an
einem Beispiel.
6. Beim Einfügen und Ändern von Artikeln soll automatisch aus dem Nettopreis
die Mehrwertsteuer (19%) und der Gesamtpreis ermittelt werden. Presione el
gatillo activado. Pruebe el gatillo.
7. Alle neuen Kunden sollen automatisch mit einer Kundennummer versehen werden.
Estos números comienzan en 21. Es sollen nur ungeradzahlige Kundennummern
vergeben werden. Schreiben Sie eine geeignete Sequenz. Probieren Sie this
Sequenz durch Hinzufügen von neuen Kunden aus.
8. En MySQL, gibt es el SpaltenbedingungAutoincremento. Damit erhält dieses Attribut
immer eine eindeutige automatische Nummer. Seleccione estas funciones entre
la secuencia y el disparador del atributopersonala relaciónPersonalnach.
9. In einem sicheren Datenbankverwaltungssystem wird vor jedem Zugriff auf eine Relation
überprüft, ob der Benutzer die erforderlichen Zugriffsrechte besitzt. Ein
Datenbankzugriff besteht demnach faktisch aus zwei Zugriffen
(Sicherheitsüberprüfung und eigentlicher Zugriff). ¿Estimmt diese Aussage wirklich?
10. Schreiben Sie einen Befehl, der dem BenutzergastoÄnderungsrechte auf die
AttributeMejor y,ReservaryMejorla relacióncerveza doradaund Leserechte auf die
gesamte Relation einräumt.
11. Entziehen Sie dem Benutzergastodie in der vorherigen Aufgabe gewährten Rechte
wieder.
12. Schreiben Sie alle notwendigen Befehle, damit der Benutzergastonur Leserechte auf die
AttributeArtnr,LagerortyMejor yla relacióncerveza doradabekommt. Weiter darf er
Tupel dieser Relation nicht sehen, falls Mindestbestand plus reservvierte Teile größer
als der tatsächliche Bestand ist. Estos derechos legales darf der Benutzergasto auch
weiterreichen.
13. Para optimizar la integridad, sollen el atributoGebDatum,Pararse,Gehalt y
beurteilungla relaciónPersonalauf zulässige Werte überprüft werden. Es ist
bekannt, dass alle Mitarbeiter zwischen 1940 und 1998 geboren sind, entweder
ledig, verheiratet, geschieden oder verwitwet sind, das Gehalt zwischen 500 und
6000 Euro liegt und die Beurteilung entwederNulooder einen Wert entre 1 y 10
besitzt. Fügen Sie diese Bedingungen mittels geeigneterAlterar-Mesa-Befehle
hinzu, wobei sicherzustellen ist, dass diese Bedingungen, falls gewünscht, auch
wieder entfernt werden können (bitte Constraintnamen vergeben!).
14. Lösen Sie die letzte Aufgabe mit Hilfe einesCrear-Afirmación-Befehls.
Literatura 183

15. Soy atributoAufgabela relaciónPersonalgibt es nur eine beschränkte Anzahl von


möglichen Aufgaben. Definieren sie ein gebietBerufsbezeichnung, das eine
Ansammlung von möglichen Berufen enthält.

Literatura

Adams, R. (2012).SQL – Eine Einführung mit vertiefenden Exkursen. Hanser.


Buchmann, A., & Smolarek, R. (2005).SQL y MySQL 5 interactivo. Omnigéna.
Connolly, T., & Begg, C. (2015).Sistemas de bases de datos(6. Aufl.). Pearson.
Fecha, CJ (2003).Una introducción a los sistemas de bases de datos(8. Aufl., Bd. 1). Addison-Wesley.
Fecha, C. J., &Amp; Darwen, H. (1998).SQL – El estándar. Addison-Wesley. Dewson, R. (2012).Inicio de
SQL Server 2012 para desarrolladores. Presione. Eirund, H., & Kohl, U. (2010).Datenbanken – leicht
gemacht. Springer Vieweg.
Elmasri, R., & Navathe, S. (2002).Grundlagen von Datenbanksystemen(3. Aufl.). Addison-Wesley.
Elmasri, R., & Navathe, S. (2009).Grundlagen von Datenbanksystemen(3. Aufl.). Addison-Wesley.
soltero
Faeskorn-Woyke, H., Bertelsmeier, B., Riemer, P., & Bauer, E. (2007).Datenbanksysteme – Teoría
y Praxis con SQL2003, Oracle y MySQL. Pearson.
Gulutzan, P., & Pelzer, T. (1999).SQL-99 completo – De verdad. Libros de I + D.
Jarosch, H. (2016).Grundkurs Datenbankentwurf.Springer Vieweg.
Kemper, A., & Eickler, A. (2015).Datenbanksysteme – Eine Einführung. Oldenburgo.
Kähler, W.-M. (2008).SQL con Oracle. Vieweg-Teubner.
Kifer, M., Bernstein, A., & Lewis, P. (2005).Sistemas de bases de datos. Addison-Wesley.
van der Lans, RF (2007).Una introducción a SQL. Pearson.
Maier, D. (1983).La teoría de las bases de datos relacionales. Prensa de Ciencias de la Computación.

Marsch, J., & Fritze, J. (2002).Erfolgreiche Datenbankanwendung con SQL3. Saltador.

Meier, A. (2003).Bancos de datos relacionales: Eine Einführung für die Praxis. Springer Taschenbuch.
Melten, J., & Simón, A. (2001).SQL: 1999. Morgan Kaufman. Schubert, M. (2007).Bancos de datos.
Teubner.
SQL87 (1987).Lenguaje de base de datos SQL (SQL1)ISO 9075.
SQL92 (1992).Lenguaje de base de datos SQL (SQL2)ISO 9075.
SQL99 (1999).Lenguaje de base de datos SQL (SQL3)ISO 9075.
SQL03 (2003). Lenguaje de base de datos SQL. ISO 9075.
SQL06 (2006). Lenguaje de base de datos SQL. ISO 9075.
SQL08 (2008). Lenguaje de base de datos SQL. ISO 9075.
SQL11 (2011). Lenguaje de base de datos SQL. ISO 9075.
Unterstein, G., & Matthiessen, M. (2012).Bancos de datos relacionales y SQL en teoría y práctica.
Saltador.
Zehnder, CA (2005).Sistemas de información y bancos de datos. vdf Hochschulverlag.
Programación de banco de datos con PHP
6

Supervisión

SQL también es una reina de Zugriffs y Verwaltungssprache für Datenbanken


entworfen. Bis einschließlich SQL2 enthielt diese Sprache daher weder
Kontrollanweisungen wie Schleifenoder Verzweigungsanweisungen noch
Datenstrukturen. Vielmehr beschränkte sich SQL auf die Beschreibung von
Datenbanken und den Zugriff auf diese. Estos datos comenzaron a funcionar con la
configuración de objetos en SQL3 en el año 1999. Es un proceso completo y
funcional, y también control de controles y estructuras de datos. Wir können daher
heute mit Hilfe von SQL komplette Program schreiben, zumindest theoretisch. In
der Praxis hanben alle großen Datenbankanbieter schon zeitlich vor der SQL-
Normierung eigene Programmiersprachen entwickelt. Werden daher mit uner Fülle
von Inkompatibilitäten konfrontiert.
Weiter werden von einem modernen Programm komfortable Oberflächen
erwartet. Es ergibt sich damit praktisch automatisch der Zwang, sich an eine
Programmierumgebung außerhalb der Datenbanken zu binden. Nur einzelne
Prozeduren und Funktionen werden internalhalb einer Datenbank erstellt. Bei den
Applikationen unterscheiden wir zwischen un Desktop-, una App- und un
Internetanwendung. App-Programmierungen spielen en Datenbanken noch eine
untergeordnete Rolle. Además de la noche, tendremos más aplicaciones que usar,
una para IOS, una para Android y una para Windows 10 Mobile.

Las funciones de escritorio incluyen dos grupos: las funciones de Java y Java también están
disponibles, y las de Microsoft en el mundo de Windows con Visual Studio son herramientas de
trabajo hervorragendes. Internetanwendungen haben wiederum den großen Vorteil, dass sie
von allen Rechnern, auch von Smartphones and Tablet-PCs, aufgerufen werden können. Aquí
se reproducen JSP (Java Server Pages, Oracle), ASP.NET (Ac-
186 6 Programación del banco de datos PHP

tive Server Pages, Microsoft) y PHP (código abierto) un gran rollo. También existe la
posibilidad de utilizar SQL en programación como C++, C o Java. Esta configuración
requiere todas las instrucciones del compilador y no se seleccionarán ninguna
configuración.
Entramos aquí para PHP. Die Gründe dazu sind vielfältig: PHP is an C and Java
angelehnt, ist weit verbreitet, die Schnittstellen zur Datenbank sind einfach und sehr gut
nachvollziehbar. PHP es gratuito y no se puede usar por completo, ya que está integrado
directamente en HTML.
Estos Kapitel cuentan con PHP en los bancos de datos. Um datenbankunabhängig
zu sein, werden wir die SchnittstelleDOP (Objetos de datos PHP) incluidos.
Comenzaremos con ajustes sencillos, um schließlich bei komplexeren Transaktionen
anzukommen. Zuletzt werden wir uns noch mit dem Zugriff auf binäre Daten
beschäftigen.

6.1 Arbeiten con PHP

PHP fue creado en 1995 por Rasmus Lerdorf desarrollado y construido con Andi
Gutmans y Zeev Suraski. PHP leitet sich von Perl ab y es alto como la última versión
de programación del servidor en el mundo. PHP war sprünglich eine Abkürzung von
"Personal Home Page Tools", später wurde daraus "PHP Hypertext Preprocessor".
Mit der aktuellen Version 5 wurden auch objektorientierte Konstrukte eingeführt, die
wir verwenden werden. PHP está escrito en HTML (lenguaje de marcado de
hipertexto) y debe ser interpretado por un servidor web.
Damit wäre schon erwähnt, was wir zum Arbeiten mit PHP benötigen: Wir brauchen
einen Webserver, auf dem PHP installiert ist, and wer benötigen Grundkenntnisse in
HTML. Todo lo demás está conectado a cualquier buscador o teléfono inteligente
disponible: un navegador.
Steht zum Üben kein Webserver zur Verfügung, so gibt es auch hierfür eine
Lösung. Cualquiera que sea el medio ambiente en su PC puede instalar un servidor
web, entre Apache o IIS (Internet Information Server de Microsoft) en Windows. El
servidor web está libre de errores. Apache puede descargarse de Internet y IIS se
activará en la versión profesional de Microsoft con soporte y puede activarse a través
de la configuración del sistema.
En este capítulo, utilizamos elementos básicos en HTML y PHP. Utilice HTML para
todas las páginas de Internethttp://wiki.selfhtml.orgy Munz (2014) y en PHP en la
página de Internethttp://www.php.net, ebenso Doyle (2010), Jones y Holloway (2012)
y Yank (2012). Estos PHP-Bücher enthalten joyas también Kapitel zu DOP. Weiter
stellt Microsoft im Internet die PDF-Datei PDO_MSSQLServer.pdf zur Verfügung.
El programa PHP en este capítulo es relativamente complejo. Wir stellen alle diese
Program im Internet vollständig zur Verfügung. Im Anhang ist the Internetseite
angegeben.
6.2 Acceso directo al servidor web, HTML y PHP 187

6.2 Acceso directo al servidor web, HTML y PHP

Wir wollen in this Abschnitt einen Überblick über die Funktionsweise des Internets and
eines Webservers geben. Ebenso werden wir Formulare in HTML vorstellen. También las
notas de consulta de PHP son difíciles de enojar.

6.2.1 Internet y servidor web

Täglich greifen wir auf das Internet zu. Wir öffnen un Browser y geben una dirección de
Internet ein. Schon spuckt der Browser Ausgaben aus. Si hacemos prácticas internas en
bancos de datos, no podremos utilizarlos en Google, Amazon o Ebay, ni sistemas de
grandes descuentos. Ab sofort wollen wir selbst Datenbanken öffnen und Daten
abfragen. Es wird daher Zeit, das Zusammenspiel zwischen Browser, Webserver y
Datenbank kennen zu lernen.
Comenzamos con Anwender. Una persona sentada frente a una computadora, der ans
Internet angeschlossen ist. Esta persona inicia un navegador y regala una dirección de
Internet, etwa.google.de. Mit dem Drücken der Returntaste geschieht in
atemberaubender Geschwindigkeit Folgendes: Der lokale Rechner wendet sich an einen
sogenannten DNS-Server. Este servidor especial está hecho a mano con tablas
personalizadas, según el servidor web actual de Google. Mit diesem Wissen wird jetzt
dieser Server aufgesucht. Este servidor de Google soporta una fragmentación y una
sensación de confusión del código HTML generado en una computadora oculta. Este
código será interpretado por el propio navegador y modificado gráficamente. Es spielt
dabei keine Rolle, wo der Webserver steht, ob in Deutschland, Europa, USA o Asien. ¡Das
Internet es una verdadera nube! Wichtig für uns Anwender ist letztlich nur, dass diese
geheimnisvolle Cloud unsere Anfrage korrekt an den Adressaten weiterleitet, und dass
dieser Adressat uns wieder findet, um uns antworten zu können.
Bleiben wir bei unserer Persona. Estos son los juegos de video que aparecen en un
teléfono inteligente y se escriben en la página de Google einen entsprechenden
Suchbegriff ein. Wieder geht die Anfrage directamente al servidor web de Google. Jetzt
nimmt dieser Webserver den Suchbegriff entgegen und sucht in seinen eigenen
Datenbanken nach passenden Ergebnissen. Estos bancos de datos se encuentran en
Internet, en la nube. El servidor web está disponible en el banco de datos de respuesta, y
utiliza el código HTML correspondiente en la respuesta. Grafisch vereinfacht haben wir
muere en Abb.6.1zusammengefasst. Eine Frau sitzt vor ihrem Rechner und greift auf den
Google Server zu. Dieser befindet sich in einer Wolke und nimmt selbst die Dienste einer
Datenbank in Anspruch.
Este Beispiel zeigt uns deutlich, dass die Programme, die auf die Datenbanken
zugreifen, nicht auf dem lokalen Rechner ablaufen. Vielmehr stehen este programa en el
servidor web. Wir sprechen here von serverseitiger Programmierung. Un único programa
es una versión PHP basada en datos. Esta fecha incluye código PHP y este código
188 6 Programación del banco de datos PHP

Abruf
anfragación
von
fecha

Ergebnis

Soy navegador: Banco de datos:


http://www.google.de Servidor web: liefert daten
anfrage verarbeitet

Tejido. 6.1Navegador, servidor web y bancos de datos

wird ausgeführt, sobald ein Internet-Benutzer irgendwo in der Welt genau diese Datei aufruft.
Dies geschieht meist implizit, indem der Benutzer einen Button auf einer grafischen Oberfläche
klickt.
El programa PHP debe utilizarse en un servidor web. Wir benötigen daher im
Folgenden einen Server, auf dem wir PHP-Programme abspeichern dürfen. O
instalaremos un servidor web por nuestra cuenta. Soy más verbreitet es Apache. Este
servidor web puede instalarse en Unix o Windows. En Windows, hay una alternativa a
Microsoft Internet Information Server (IIS) para la configuración. Beide Program sind libre
verfügbar. También disponemos de PHP integrado, por lo que podemos probar todos los
programas de estos capítulos. Hinweise zur Installation und zum Einrichten eines
Webservers finden sich im Internet. Bitte beachten Sie auch die Literaturhinweise am
Ende dieses Kapitels.

6.2.2 Lenguaje de marcado de hipertexto (HTML)

El programa PHP se escribe en HTML. HTML es una versión del lenguaje de marcado
de hipertexto, creada en 1992 y es un gran estándar en Internet. Eine hervorragende
Zusammenfassung dieser Sprache findet sich bei Stefan Münz unter dem Begriff
AutohtmlEstoy en Internet (http://wiki.selfhtml.org). Wir werden hier nur einen
Überblick über diese Sprache geben.
HTML es una versión basada en texto. En HTML se crean etiquetas que contienen
etiquetas, textos y etiquetas escritas en forma de lágrima. Estas etiquetas se activan en la
siguiente lista, pero por una etiqueta final ensprechenden bedet werden. Este Ende-Tag
unterscheidet sich vom Tag-Bezeichner durch einen vorangestellten Schrägstrich („/“).
Das Grundgerüst eines HTML-Programms enthält einen Kopf, in dem globale
Informationen zu der Internetseite angegeben werden und einen Rumpf, der die
6.2 Acceso directo al servidor web, HTML y PHP 189

eigentlichen Texte und Grafiken enthält. Un documento HTML que contiene algunos ejemplos:

<html>
<cabeza>
<título>Texto der Navegador-Überschrift</title>
</cabeza>
<cuerpo>
Contenido: Texto, Verweise, Grafikreferenzen usw. </cuerpo>

</html>

Die Überschrift erscheint in der Titelleiste des Browsers. Der eigentliche Text muss
noch strukturiert werden. Hier stehen zahlreiche Tags zur Verfügung. Wir greifen nur
einige wenige heraus:

<h1>Überschrift der Ordnung 1</h1> <p>Texto interiorhalb eines


Absatzes</p> <b>Fettdruck</b><i>Kursivdruck</i><u>Unterstrichener
Texto</u>

Wichtig sind für uns Tabellen zur Ausgabe von Relationen. Auch hier wollen wir nur
Grundkonzepte ansprechen. Tabellen enthalten Zeilen, jede Zeile enthält Spalten. Wir geben
daher in einer Tabelle eine Zeile nach der deren aus. Innerhalb jeder Zeile befinden sich die
Spalten. Das Grundgerüst sieht wie folgt aus:

<borde de la tabla="2" cellpadding="10">


<tr>
<th>Kopfzelle1</th>
<th>Kopfzelle2</th>
</tr>
<tr>
<td>Datenzelle1</td>
<td>Datenzelle2</td>
</tr>
</tabla>

Esta tabla contiene un espacio de copia con dos espacios (<th>)und eine weitere Zeile mit
ebenfalls zwei Spalten (<td>). Una tabla se incluye en la etiquetamesaeingeschlossen. Cómo
cambiar el parámetrobordeim Tag verwendet, so erhält die Tabelle einen Rahmen, hier mit
einer Breite von 2 Pixeln. Eine Zeile wird in den Tagtreingeschlossen, eine Spalte in den Tagtd.
Die erste Zeile darf stattdessen auch den Tagthenthalten. Damit wird diese Zeile
hervorgehoben, meist durch Fettschrift.
Además de referencias en Internet, imágenes o otras páginas HTML, a
menudo son válidas, como se muestra en un enlace de Google:
190 6 Programación del banco de datos PHP

<a href="http://www.google.de">Google-Startseite</a>

Wird nun auf diesen Verweis geklickt, so wird zu dieser Adresse gesprungen.
Establezca una dirección de Internet junto con una fecha local, para ver una imagen y
verla. Beim Klick wird dann das Bild oder die Datei geladen.
Für Datenbankanwendungen benötigen wir dringend Formulare. Wir müssen uns in
eine Datenbank einloggen und dazu die Benutzerdaten eingeben. Oder wir wollen
auswahl treffen oder einen Button click. Disfrute de un formulario HTML. Wieder wollen
wir nur an einigen wenigen Beispielen die Möglichkeiten kurz aufzeigen. Comenzamos
con un formulario, con el servidor, el banco de datos, la identificación y la contraseña y
haciendo clic en un botón de la fecha.formulare.phpaufrufen:

<formulario acción="formulare.php" método = "publicación">


<p>Servidor: <tipo de entrada="texto" tamaño = "20" nombre="Servidor"/></p>
<p>Banco de datos: <tipo de entrada="texto" tamaño = "20"
nombre="Datenbank"/></p>
<p>Kennung: <tipo de entrada="texto" tamaño = "20" nombre = "Kennung"
valor="bicicleta"/></p>
<p>Contraseña: <tipo de entrada="contraseña" tamaño = "20"
nombre="Contraseña"/></p>
<p><tipo de entrada="enviar" valor="Inicio"/></p> </
formulario>

Speichern wir dieses einfache Formular unter dem Namenformular.htmlab y öffnen


estas fechas en un navegador, por lo que wird das Formular en Abb.6.2angezeigt. La
etiqueta aportecon el parámetrotipo = "texto"zeigt Texto an. Vorgegeben ist bei der
Kennung mittels des Parametersvalormorir Zeichenkettebicicleta. El parámetroescriba =
"contraseña"ermöglicht die geschützte Eingabe undtipo = "enviar"zeigt einen Button an,
hier mit der AnzeigeComenzar. Al hacer clic en este botón, aparecerá la etiquetaforma
bajo el parámetro acciónangegebene Datei aufgerufen. In unserem Beispiel ist dies die
Dateiformulare.php. Estas fechas no existen. Ein Klick auf den Button wird in unserem Fall
also eine Fehlermeldung erzeugen.

Tejido. 6.2Texteingabefelder
6.2 Acceso directo al servidor web, HTML y PHP 191

Tejido. 6.3Más
Eingabefelder

In der Praxis werden wir jedoch zu einer gültigen Adresse springen. Und dort sollen die
Felder zu Datenbank, Kennung und Passwort ausgewertet werden. Estos Eingabefelder deben
tener dos nombres identificados. Dies geschieht mit dem Parámetro nombreSoy etiqueta de
entrada. Das Auslesen dieser Felder werden wir mit Hilfe von PHP explícito durchführen.

Naturalmente, no hay campos de texto, como botones de radio, casillas de verificación,


cajas de verificación o combos. Ohne weitere Kommentare wollen wir diese Felder hier kurz
vorstellen. Wir könnten beispielsweise insidehalb eines Formularbereichs schreiben:

<p>Geschlecht:
männlich <tipo de entrada="radio" nombre = "Anrede"
valor = "Señor" marcado/>
weiblich <tipo de entrada="radio" nombre = "Anrede" value="Mujer"/></p>
<p>Interés:
Leer <input type="casilla de verificación" nombre = "Pasatiempo"
valor = "Buch" marcado/>
Vista de la película <input type="casilla de verificación" nombre = "Pasatiempo"
valor="Vídeo"/>
Música actual <input type="casilla de verificación" nombre = "Pasatiempo"
valor="Audio"/>
</p><p>Relación familiar:
<seleccionar nombre = "Soporte familiar" tamaño = "1">
<opción> ledig </opción> <opción> verheiratet </opción>
<opción> geschieden </opción> <opción> verwitwet </opción>
</select></p>

Das dazugehörige Ergebnis können wir in Abb.6.3ablesen.

6.2.3 PHP

PHP es una joven programadora creada en 1994 por Rasmus Lerdorf, desarrollada por Rasmus
Lerdorf. PHP es una aplicación de Perl y de C abgeleitet y völlig auf das Internet zugeschnitten.
192 6 Programación del banco de datos PHP

PHP es fácil de utilizar para los programadores C y Java. Las estructuras de controlsi,cambiar,
para,mientrasyhacersind identisch mit den entsprechenden Befehlen in der Sprache C. Auch
die in C zur Verfügung stehenden Operatoren sind nahezu identisch. Zudem wird ebenfalls
zwischen Groß- und Kleinschreibung unterschieden. Einige wichtige Unterschiede se encuentra
en Tab.6.1zusammengefasst.
Variablen, außer Felder und Objekte, werden nicht vorab deklariert. Abhängig vom
Kontext nimmt una variable den am besten geeigneten Datentisch an. ¡Una variable
puede cambiar el tiempo de vida y el tipo de fecha! Es gibt daher den zusätzlichen
Operador===. El Vergleichvar1===var2liefert genau dann den Wertverdadero zurück,
wenn beide Variablen vom gleichen Datentypy die Inhalte gleich sind. Análogos dorados
para el operador!==.
Innerhalb einer konstanten Zeichenkette werden Variablen dank des Dollarzeichens
erkannt und automatisch substituiert, d. h. durch den Inhalt der Variable ersetzt. Zu
Zeichenketten gibt es en PHP sehr viele Operadores y Métodos und ebenso viele
Funktionen zum Bearbeiten von Zeichenketten. Als Konkatenierungsoperator wird der
Punkt („.“) activado. Einige wichtige Funktionen, die wir auch später noch verwenden
werden, sind in Tab.6.2aufgeführt.
PHP no es compatible con HTML. Innerhalb ainer HTML-Datei darf PHP-Code jederzeit
eingefügt werden: Im Kopf besteht die Möglichkeit Funktionen zu deklarieren und im
Rumpf schreiben wir an jeder gewünschten Stelle den Code. Wir müssen dabei nur weige
Dinge beachten:

- Una fecha HTML con código PHP incluida en el final.PHP. Esto es importante, ya que el
servidor web también utiliza el código PHP.
- El código PHP comienza con la etiqueta activada „<?php“.
- El código PHP termina con la etiqueta schließenden „?>“.
- El código PHP puede ser más fácil de usar.

Para ello, es necesario utilizar una fecha PHP en un servidor web. No podemos
usar datos PHP inmediatamente cuando los datos HTML se inician con un doble clic.
Los primeros juegos PHP incluyen un juego HTML en Abb.6.2fortsetzen

Pestaña. 6.1Opciones de PHP para C/C++/Java

en PHP
Tipos de datos Tipos de datos de seguridad: int, bool, double, string, array, object
variable Erstes Zeichen ist immer das Dollarzeichen (“$”)
Operadores Zusätzlich: ===, !==; Operador -> para métodos de objetos
Declaración Declaración nicht erforderlich; Variable
por variablen según el tipo de fecha dinámica
Zeichenketten Función propia, propia de Java
Funciones Nombres de funciones que no distinguen entre mayúsculas y minúsculas
6.2 Acceso directo al servidor web, HTML y PHP 193

Pestaña. 6.2Auswahl de las funciones PHP

recortar(cadena) entfernt Leerzeichen am Anfang und Ende voncadena


strlen(cadena) gibt die Länge der Zeichenkettecadenazurück
gibt das erste Vorkommen vonstr2en la Zeichenkette
strpos(cadena1,cadena2)
str1 zurück; bzw. falso, cae nicht enthalten
strcmp(cadena1,cadena2) vergleicht die Zeichenkettenstr1ystr2
strcasecmp vergleicht die Zeichenkettenstr1ystr2unabhängig von
(cadena1,cadena2) Groß- und Kleinschreibung
subcadena gibt einen Teilstring voncadenala longitudlenPosición abdominal
(cadena, pos, len) posiciónzurück

liefert Zeichenkette mit allen Feldelementen zurück, die


implosionar(str,feld)
mittels der Zeichenkettecadenaverknüpft werden
html caracteres especiales wandelt HTML-Zeichen en Ersatzzeichen um
(cadena)

parámetro de eco1,… gibt the Parameterliste auf HTML aus


isset(var) liefertverdadero, cuando variablevarexistiert, sonstFALSO
desarmado(var) ajuste de variablevarzurück,varexiste nicht mehr

y el programaformulare.phpAl pulsar el botón, presione el botón. Este nombre de


programa se incluye en la etiqueta de formulario de la fecha HTML. Die vier Variablen
Servidor,banco de datos,KennungyContraseñawerden mit der Methodecorreoübergeben.
Ohne näher auf die Übergabeméthodecorreoeinzugehen gilt: PHP erzeugt in this Fall in
der PHP-Datei ein assoziatives Feld mit den vier Werten:

$_POST['Servidor'] //con el texto en el servidor Eingabefeld


$_POST[’Datenbank’] //con el texto en el Eingabefeld Datenbank $_POST[’Kennung’]
//mit dem Text aus dem Eingabefeld Kennung //mit dem
$_POST['Contraseña'] Text aus dem Eingabefeld Contraseña

El siguiente programa PHPformulare.phpLa monja más mentirosa die Inhalte der vier
EingabefelderServidor,banco de datos,KennungyContraseñaaus und zeigt this im Browser an:

<html>
<cabeza>
<title>Erstes PHP-Beispiel, Ergebnis</title>
</cabeza>
<cuerpo>
<centro><h1>Ausgabe von Datenbank-Verbindungsdaten</h1></center>
<p>HTML: Usamos las variables en:</p> <?php
// Código PHP principiante

echo "<p>PHP: Iniciar desde PHP</p>";


$servidor = $_POST['Servidor']; // Einlesen der vier Variablen $datenbank =
$_POST[’Datenbank’];
Traducido del inglés al español - www.onlinedoctranslator.com

194 6 Programación del banco de datos PHP

$benutzer = $_POST['Kennung'];
$contraseña = $_POST['Contraseña'];
echo "<p>PHP: Servidor: $servidor; Banco de datos: $datenbank;
Kennung: $nombre de usuario, Contraseña: wird nicht verraten.</p>";
?> <!-- Comentario: Ab hier wieder reines HTML --> Fin.</p>
<p>HTML:
</cuerpo>
</html>

Este Beispiel verwendet Kommentare en HTML y PHP. Es verwendet auch Zeichenketten


sowohl mit Anführungszeichen als auch mit Hochkomma. Der Unterschied dieser dos Arten von
Zeichenketten ist schnell erklärt: ¡Nur in Zeichenketten mit Anführungszeichen werden
Variablen substituiert! El funcionamiento de la función Echo es sencillo: esta función se
transfiere a la fecha en el navegador. Dies soll als kleine Einführung genügen.

6.2.4 Campo en PHP: una descripción general

Campos en PHP extremadamente flexible. Es gibt en PHP indizierte Felder, aber auch asociative
Felder. Zusätzlich zu den gängigen Feldern aus other Programmiersprachen überdecken PHP-
Felder auch Listen und Aufzählungen. Ein Feld ist vom Datentypformación. Si utiliza PHP con
más de 50 funciones, podrá cambiar el campo de aplicación. Wir wollen uns an dieser Stelle nur
einen kleinen Überblick verschaffen und verweisen auf die Manuale im Internet (http://
www.php.net).
Felder können wir ganz einfach selbst definieren. Betrachten wir dazu folgenden Código:

$campo = matriz( 0, 2, 4, 6, 8 ); $campo[ ] =


10;
$campo[10] = 20;
$feld["prueba"] = 100;
$feld["wert"] = "Ende";
eco "<p>Anzahl der Feldelemente: " . contar ($ campo). "</p>
<p>Inhalación:</p>";
foreach ($feld como $inhalt)
echo "<p>$inhalt</p>";

Zunächst definieren wir ein Feld mit fünf Elementen. Die Indizierung beginnt dabei
automatisch bei 0. Es gilt also beispielsweise:pscampo[2]=4. Ungewohnt sind die folgenden
Zeilen: Die zweite Zeile fügt ein weiteres Element mit dem Wert 10 und dem Index 5 hinzu.
Artículos equivalentes del Zuweisungpscampo[5]=10gewesen. In der dritten Zeile sigue ein
weiteres Element mit dem Wert 20 und dem Index 10. Wichtig ist, dass die Indexe dazwischen
nicht belegt sind! Es wäre ein Fehler,campo[7]auszugeben. In den weiteren Zeilen werden noch
asociative Werte eingefügt. Jetzt hat das Feld in Summe neun Elemente. Morir
6.3 Erste Datenbankzugriffe 195

Funcióncontarwird genau diesen Wert neun zurückliefern. Zuletzt geben wir alle diese
Elemente in einer Schleife aus. Am einfachsten geschieht dies mit einer Foreach-Schleife. Die
Syntax sollte selbsterklärend sein.
Wir sehen also, dass ein Feld viele Elementpaare aufnehmen kann. Estas piezas son las
mejores joyas en un índice y en un contenido detallado. El índice está compuesto por una
ganze Zahl o una Zeichenkette. Der Inhalt cann von jedem der sechs in PHP defineerten
Datentypen sein. Die Indexe selbst müssen nicht zusammenhängend sein. Genau genommen
gibt es también zu jedem Index, auch Schlüssel genannt, einen Inhalt. En PHP escribe lo
siguiente:

clave => contenido

En el Schlüsselllavesigue también der Inhaltcontenido. No podemos utilizar PHP ni el


contenido ni el material dañado. Der folgende Code erstellt exakt das gleiche Feld wie
vorher, nur in einem Schritt. Die Ausgabe gibt zusätzlich den Schlüssel mit aus. La
sintaxis, insbesondere die Syntax der Schleife, sollte aus dem Code direkt ersichtlich
werden:

$campo = matriz( 0=>0, 2, 4, 6, 8, 10, 10=>20, "prueba"=>100,


"wert"=>"Ende" );
eco "<p>Anzahl der Feldelemente: " . contar ($ campo). "</p>
<p>Inhalación:</p>";
foreach ($feld como $clave => $contenido)
echo "<p>feld[$key] = $contenido</p>"; //Ausgabe: feld[0]=0 usw.

Am Rande sei noch erwähnt, dass einzelne Feldelemente mit der FunktiondesarmadoAuch
wieder gelöscht werden können.

6.3 Erste Datenbankzugriffe

Nach der Einführung in HTML y PHP im letzten Abschnitt wird es nun Zeit, auf
Datenbanken zuzugreifen. Wieder werden wir unsere schon vertraute
BeispieldatenbankBicicleta verwenden. Antes de iniciar, no usaremos ninguna
configuración adecuada en PHP para usar en Oracle, SQL Server y MySQL. Wir
weisen nochmals darauf hin, dass alle PHP-Programme in this Kapitel im Internet zur
Verfügung gestellt werden. Hinweise dazu finden sich im Anhang.

6.3.1 Registro de datos con PHP

Zum Zugriff auf Datenbanken utiliza PHP entsprechende Datenbankmodule del Hersteller. Jede
unterstützte Datenbank besitzt viele Zugriffsfunktionen, die herstellerspezifisch
196 6 Programación del banco de datos PHP

sind. Así que entwickelte PHP una abstracción, todos los bancos de datos con Hilfe der gleichen
Funktionalität unterstützt:DOP(Objetos de datos PHP).
También podemos utilizar directamente los dispositivos de seguridad de cada uno de los
proveedores. Doch nur mit Hilfe von PDO können wir datenbankunabhängig programmieren.
¡Zusätzlich werden wir the kleinen Besonderheiten der einzelnen Datenbankhersteller in der SQL-
Syntax beachten! Verwenden wir nur SQL-Code, der in allen Datenbanken übereinstimmt, so ist ein
späterer Wechsel der Datenbank kinderleicht.
Zur Vorbereitung ist die Initialisierungsdateiphp.iniPara modificar PHP. Estas fechas las
encontramos en instalaciones adaptadas de PHP. Wir benötigen die entsprechenden
Datenbankerweiterungen (extensiones). Estos sind alle bereits vorhanden, mittels eines
Strichpunktes jedoch auskommentiert. Wir entfernen diese Strichpunkte in den folgenden
Zeilen der Dateiphp.ini:

;extensión=php_pdo_oci.dll ;extensión=php_pdo_mysql.dll

Es ist zu beachten, dass genau diese Dateien im UnterverzeichnisextensiónAuch vorhanden


sein müssen. Para SQL Server no hay archivos DLL con el paquete PHP incorporado. Esto se
puede ver en la página de inicio de Microsoft einschließlich entsprechender Hinweise zur
Installation zur Verfügung gestellt.
Para empezar a usar bancos de datos, debe instalar Oracle y SQL Server en el servidor
web pensando en instalar un cliente actualizado. En MySQL esto no es necesario. Neben
der Eingabe der Kennung und des Passwortes müssen wir noch den Standort des Servers
und die Datenbank angeben. Dazu gibt es in PDO die zusätzlichen ParámetroServidory
nombrebd. Je nachdem ob der Datenbankserver lokal oder entfernt installiert wird,
ergeben sich herstellerspezifische Einstellungen. Estos se encuentran de manera superior
en la Tab.6.3aufgelistet.
Bajo los nombresServidormuss die Internetadresse des Servers angegeben werden. En
SQL Server, es posible realizar más instalaciones. Es ist daher auch der Installationsname
anzugeben. Utilizamos SQL Server Express, por lo que utilizamos SQLEXPRESS estándar.
Gegebenenfalls ist der entsprechende Installationsname einzusetzen.

Pestaña. 6.3Datos del servidor, geordnet nach Hersteller

Servidor variable bzw. Anfitrión Nombre de base de datos variable

oráculo local (nicht verwendet) banco de datos

Entfernt de Oracle (nicht verwendet) //Servidor/Banco de datos

SQL Server local localhost\sqlexpress banco de datos

Transferencia de SQL Server Servidor\sqlexpress banco de datos

MySQL local servidor local banco de datos

Transferencia de MySQL Dirección del servidor banco de datos


6.3 Erste Datenbankzugriffe 197

6.3.2 Los Datenbankschnittstelle DOP

Nach so viel Vorbereitung wird es Zeit mittels der Schnittstelle DOP auf Datenbanken
zuzugreifen. Todos los Datenbank-Zugriffsbefehle en DOP son einheitlich y unabhängig von der
Datenbank. Nur das Einloggen selbst erfolgt datenbankspezifisch. Schließlich will PDO wissen,
mit welcher Datenbank es sich verbinden soll. Beim Wechsel zu einer anderen Datenbank muss
daher nur dieser Befehl zum Einloggen bearbeitet werden. Die Schnittstelle DOP ist
objektorientiert, wer benötigen also ein entsprechendes Verbindungsobjekt. DOP löst dies sehr
elegante: Der Konstruktor baut gleich eine Verbindung auf. Betrachten wir das Einloggen en
Oracle, SQL Server y MySQL. Wir benötigen dazu bis zu vier Variablen:psservidorpara el
servidor de datos bancarios en Internet,psbanco de datospara el Datenbank,pskennungpara el
Kennung undpscontraseñapara la contraseña. Wir führen je nach Datenbank einen der
folgenden Befehle aus:

$conn = new PDO("oci:dbname=$datenbank", $kennung, $contraseña); $conn =


nuevo PDO("sqlsrv:server=$server;dbname=$datenbank",
$kennung, $contraseña);
$conn = nuevo PDO("mysql:host=$server;dbname=$datenbank",
$kennung, $contraseña);

Wir sehen, dass nur der der erste Parameter des KonstruktorsDOPherstellerspezifisch ist. El
Kennung está en el segundo parámetro y la contraseña del texto. Esto es dorado también para
el Zugriff en DB2, en PostgreSQL o en SQLite. Beim ersten Parameter verwenden wir die
Variablenpsservidorypsbanco de datos. Die dazugehörigen Werte entnehmen wir Tab.6.3.

Habremos tenido los obigen Befehlen ein Objekt der KlasseDOPerzeugt und dieses in der
Objektvariablepsconectarabgelegt. Con esta claseDOPwerden wir ab sofort arbeiten. Zusätzlich
werden wir noch die KlasseDeclaración PDOKennen lernen, die wir für Lesezugriffe benötigen.
Das Besondere ist nun, dass alle weiteren Zugriffe einheitlich und unabhängig von der
Datenbank sind.

6.3.3 Nuevo PHP-Zugriff auf Datenbanken

Grau ist jede Theorie. Empezaremos también con los primeros Beispiel. Dazu greifen wir auf
die BeispieldatenbankBicicletazu. Loggen uns ein und lesen aus der RelationPersonal den
Namen und den Wohnort des Mitarbeiters aus, der die Personalnummer 2 besitzt. El
entsprechende Select-Befehl es einfach und lautet:

Seleccione Nombre, Ort desde Personal Donde Persnr = 2;

Esto debe incluirse en un programa PHP incorporado. Wir benötigen dazu


folgende Schritte:
198 6 Programación del banco de datos PHP

- Eingabe der Verbindungsdaten


- Einloggen in die Datenbank und Start einer Transaktion
- Ausführen eines Select-Befehls
- Auslesen der Ergebnisse des Select-Befehls
- Beenden der Transaktion

Den ersten Schritt haben wir im Wesentlichen bereits erledigt: Wir ergänzen das
Formular der Dateiformular.htmlA través de tres botones de radio, se incluyen uno de los
tres bancos de datos de Oracle, SQL Server o MySQL y se escriben en los nuevos datos.
inicio.html. Beim Drücken auf den ButtonComenzar(siehe Abb.6.2) Rufen wir jetzt das
PHP-Programminicio.phpauf. In dieser Datei werden die weiteren vier Schritte
abgearbeitet. Wir stellen diese Schritte einzeln vor.

Registro en el DatenbankComenzamos con los registros en el banco de datos y rufen


dazu den Konstruktor eines PDO-Objekts mit den entsprechenden Parametern auf:

$conn = nuevo PDO("oci:dbname=$_POST[Datenbank]",


$_POST['Kennung'], $_POST['Contraseña']);
echo "<p>Die Verbindung zur Datenbank wurde hergestellt.</p>"; $conn-
>setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
$conn->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER); $conexión-
>beginTransaction(); // modo de transacción

Iniciaremos sesión aquí en un banco de datos Oracle. Dies geschieht für other Datenbanken analog.
Busque el banco de datos en el servidor web y, a continuación, indique el nombre del servidor y la dirección.
servidor local.
Misslingt das Einloggen, weil etwa das Passwort nicht korrekt eingegeben wurde, so
wird eine Ausnahme geworfen. Wir kommen darauf im nächsten Abschnitt zurück. Bei
erfolgreichem Zugriff befinden wir uns in der nächsten Zeile und geben auf Bildschirm
aus, dass die Verbindung hergestellt wurde.
Wir wünschen im Weiteren, dass bei PDO-Datenbankfehlern automatisch eine
Ausnahme geworfen wird. Dies stellen wir mittels der Methodeestablecer atributomás
seguro. Este método es el primer parámetro que establece el atributo y el segundo
parámetro de estos atributos. In unserem Beispiel setzen wir das Fehlermodus-Attribut
auf den WertERRMODE_EXCEPCIÓN. Damit wird bei allen PDO-Fehlern eine Ausnahme
geworfen. Más opciones para el atributoATTR_CASEen el WertCASO_SUPERIOR. Damit
werden alle Spaltennamen grundsätzlich in Großbuchstaben zurückgegeben. Esto está en
Oracle Standard y no puede incluirse en Oracle. Damit das Verhalten in allen
Datenbankumgebungen gleich ist, sollten wir dieses Attribut unbedingt setzen.
Der aufmerksame Leser wird feststellen, dass wir im assoziativen Feld $_POST den Wert
banco de datosnicht in Hochkommata gesetzt haben. Dies ist kein Druckfehler sondern
zwingende Notwendigkeit.
6.3 Erste Datenbankzugriffe 199

I consejoInnerhalb einer konstanten Zeichenkette, die in Anführungszeichen


gesetzt ist, dürfen die Indexbezeichner in assoziativen Feldern weder in
Anführungszeichen noch in Hochkommata angegeben werden.

Der Transaktionsbetrieb unterscheidet sich geringfügig von Datenbank zu Datenbank.


No se realizará ninguna transacción automáticamente después de la gestación anterior.
Aus Kompatibilitätsgründen geschieht dies auch nicht in DOP. Ein Transaktionsbetrieb ist
für uns aber ein Muss. El métodocomenzar transacciónist daher für uns stets der erste
Befehl nach dem Erzeugen eines neuen DOP-Objekts.
Los objetos en PHP se pueden usar tanto en Java como en C++ con la función de operadoresnuevo
erzeugt. Operador demócratanuevosiga un constructor. Wie in other objektorientierten Sprachen
besitzt der Konstruktor immer den den Namen der Klasse. Die Methoden und Variablen einer Klasse
werden mit Hilfe des Pfeiloperators „->“ angesprochen, también:

Objeto -> método Objeto -> Variable

Dos métodos öffentliche hanben wir schon kennen gelernt,establecer atributoycomenzar-


transacción. Weitere kommen gleich hinzu.

Ausführen eines SQL-Befehls:Wir haben eine Verbindung mit der Datenbank hergestellt
und greifen nun auf diese zu. Dies geschieht in DOP mit der Methodeconsulta. Wir wollen
hier den Mitarbeiter mit der Personalnummer 2 zusammen mit seinem Wohnort
auslesen.
Die Basis des Zugriffs bildet das vomKonstruktor zurückgelieferte DOP-Objektpsconectar.
Este objeto está en PHP como enlace logístico para el banco de datos. Wir greifen nun mittels
des Objektspsconectary el método de objetoconsultaAuf die Datenbank zu und führen den
angegebenen SQL-Befehl aus.

$sql = "Seleccione Nombre, Ort de Personal Donde Persnr = 2"; $stmt = $conn-
>query($sql); // Ausfuehren und Übergabe an $stmt

El métodoconsultaliest die gewünschten Daten und erzeugt als Ergebnis ein Objekt
vom DatentypDeclaración PDO. Este objeto incluye el banco de datos que almacena datos
y metainformación dazugehörige. Wir speichern daher este Objekt in der Variablepsstmt
ab. Wieder wird im Fehlerfall eine Ausnahme geworfen, wieder verweisen wir
diesbezüglich auf den nächsten Abschnitt.

Auslesen der Ergebnisse des Select-Befehls:Die Ergebnisse unserer Abfrage sind im


PDOStatement-Objektpsstmtgespeichert. Auf diese Daten greifen wir jetzt mit der
Methodebuscarla claseDeclaración PDOzu. El métodobuscarliest standardmäßig eine
Ergebniszeile und liefert alle Spalten dieser Zeile in einem Feld als Funktionsergebnis
zurück. Los medios del métodobuscarkönnen wir daher Name und Ort des Mitarbeiters 2
relativ einfach ausgeben:
200 6 Programación del banco de datos PHP

si ($fila = $stmt->fetch())F // Auslesen der ersten Zeile


echo "<p>Der Mitarbeiter mit der Persnr 2 heißt ",
"$fila[NOMBRE] y no en $fila[ORT]. </p>";
gramodemásF

echo "<p>Der Mitarbeiter mit dieser Número 2


¡No existe! </p>";
gramo

El métodobuscarliefert ein Feld zurück, genauer gesagt, ein assoziatives Feld. Die
Indizes sind dabei genau die Spaltennamen, die im Select-Befehl angegeben wurden.

I consejoEn PHP sind als asociative Bezeichner nur Namen erlaubt, die mit einem
Buchstaben Beginnen. Gegebenenfalls sind imSelect-Befehl Aliasnamen zu
verwenden.

I consejoDie Bezeichner im assoziativen Feld enthaltenkeine Kleinbuchstaben,


unabhängig von der Schreibweise im Select-Befehl! Wir hatten schließlich das
AttributATTR_CASEen el WertCASO_SUPERIORGesetzt.

I consejoDer Select-Befehl sollte nicht mit einem Strichpunkt enden. Dies quittieren
einige Datenbanken, so auch Oracle, mit Fehlermeldungen.

Existiert kein Mitarbeiter mit der Personalnummer 2, so ist die Ergebnisrückgabe leer.
El métodobuscargibt dann den booleschen WertFALSOzurück. In diesem Fall springen wir
in der obigen If-Anweisung in den Else-Zweig und geben aus, dass kein passender
Mitarbeiter existiert. Andererseits liefert die Methodebuscarein asociatives Feld zurück,
das wir in der Variablepsfilaspeichern. PHP interpretado como Sprache C alle Werte
ungleich 0 als wahr: Der Mitarbeiter wird ausgegeben.
DOP liefert übrigens nor ein associatives Feld zurück sondern auch ein indiziertes Feld.
Wir können daher stattpsfila['NOMBRE']auchpsfila[0]bzw. en seguidapsfila['ORT']auch
$fila[1]schreiben. Wir sollten dann aber immer Änderungen im Select-Befehl genauestens
im Auge behalten. Wir könnten beispielsweise im Select-Befehl die Spaltennamen Orty
NombreVertauschen:

$sql = "Seleccione Ort, Nombre de Personal Donde Persnr = 2";

Haber wir asociative Felder verwendet, so funktioniert unser Programm weiterhin. ¡Bei
indizierten Feldern sind bisagragen auch die Indizes zu vertauschen! Wir ziehen daher in der
Regel die assoziativen Felder vor.
Un programa pequeño es rápido. Wir sollten aber nicht vergessen, dass wir im
Transaktionsbetrieb arbeiten. Daher fehlt noch der ganz wichtige Abschluss:
6.3 Erste Datenbankzugriffe 201

Transacciones:Die Klasse DOP kennt drei wichtige Methoden im Zusammenhang mit


Transaktionen. Este es el siguiente:

Iniciar transacción // Iniciar una transacción // Abschließen una


Comprometerse transacción // Zurücksetzen una transacción
Retroceder

El primer método inicia una transacción. Hemos tenido estas bereits kennen gelernt. PDO
erwartet nun, dass die Transaktion im Verlauf des Programms durch eine der beiden weiteren
Methoden abgeschlossen wird. MitComprometersewird die Transaktion beendet, alle
geänderten Daten werden endgültig abgespeichert, und alle Sperren freigegeben.Retroceder
arbeitet analog, nur werden geänderte Daten zurückgesetzt und somit verworfen. Unser
kleines Programm müssen wir also noch mittels der MethodeComprometerseabschließen:

$conn->commit(); // se ha realizado una transacción $conn = null; //


beendet eine Datenbankverbindung
echo "<p>Die Verbindung zur Datenbank wurde geschlossen.</p>";

Indem wir das DOP-Objektpsconectaren el Wertnulosetzen, werden das Klassenobjekt und


der für das Auslesen belegte Speicherplatz freigegeben und die Datenbankverbindung
beendet. Este Zuweisung wäre hier nicht zwingend erforderlich gewesen, da mit dem Ende des
Blocks, in dem das ObjektpsconectarDefiniert ist, das Objekt automatisch gelöscht wird.

6.3.4 Einführung in die Fehlerbehandlung

Wir haben im letzten Abschnitt darauf junctionwiesen, dass PDO im Fehlerfall


eine Ausnahme wirft. Para abrir y usar estas herramientas, use PHP como C++,
Java y C# y utilice el bloque Try-Catch. Si esto es así, el control de seguridad del
código de programa normal se puede usar en el tren: Estoy usando un
programa con Try-Block, y ahora estoy desactivado Catch-Block para agregarlo a
la función.
Todos los Fehler mejorados en PHP y también los Fehler bei
Datenbankzugriffen mittels PDO führen dazu, el Try-Block se ha activado
suavemente y el Catch-Block seguido directamente se modifica. El código
normal no se seguirá con el código fehler. Un programa no deseado tampoco
debe utilizarse si el dispositivo se debilita. Necesitamos leer el código en un Try-
Block asociado y un Catch-Block activado.
Después de Try-Block, utilice otro Catch-Block. Jeder Catch-Block funciona según
un parámetro de claseExcepciónidentificado. Neben diesem Datentyp können auch
Klassen verwendet werden, die von dieser BasisfehlerklasseExcepciónabgeleitet
sind. So verwendet beispielsweise DOP die abgeleitete KlassePDOExcepción.
202 6 Programación del banco de datos PHP

Wir können daher in einer Datenbankanwendung ganz einfach "normale" PHP-Fehler von
Datenbankzugriffsfehlern unterscheiden: Wir fangen mit dos Catch-Blöcken beide Fehler
ab, also Exception-Fehler y PDOException-Fehler.
Aquí es necesario que se realicen todas las operaciones. La clasePDOExcepciónist von
der Klasse Excepciónabgeleitet. Ein Fehler vom TypPDOExcepciónTambién es auch ein
Fehler vom Typ. Excepción. PHP lanza el primer Catch-Block y ahora no tiene ningún
Catch-Block. ¡Necesitamos el Catch-Block con todas las excepciones cuando seamos
letzten anfügen!
La clasePDOExcepciónLa DOP se gestiona automáticamente. Alle Fehler in
Zusammenhang mit Klassenobjekten vom TypDOPyDeclaración PDOsind Fehler vom
TypPDOExcepción. Dies beginnt mit dem Aufruf des Konstruktors beim Einloggen
über das Durchsuchen einer Tabelle bis hin zum Ende der Transaktion. Werden
daher in seren Programmen immer mit two Catch-Blöcken arbeiten. Damit können
wir je nach Fehlertyp unterschiedlich reagieren. Un primer programa incluido en el
siguiente bloque Try-Catch incluye:

intentar F // elemento de programación

$conn = nuevo PDO("oci:dbname=$_POST[Datenbank]",


$_POST['Kennung'], $_POST['Contraseña']);
// ... Zugriffe
$conn->commit();
echo "<p>Die Verbindung zur Datenbank wird geschlossen.</p>";
gramo

captura (PDOException $e)F // Datenbankfehler


echo "<p>PDO-Fehler en Zeile ", $e->getLine(), " con código ",
$e->getCode(), "</p><p>Fehlertext: ",
$e->getMessage(), "</p>";
gramo

captura (Excepción $e)F // Globale Fehlerbehandlung


echo "<p>Fehler in Zeile ", $e->getLine(), " con código ",
$e->getCode(), "</p><p>Fehlertext: ",
$e->getMessage(), "</p>";
gramo

Beide Catch-Blöcke unterscheiden sich durch ihre Datentypen. In unserem Beispiel


geben wir im ersten Block zusätzlich das WortDOP-Fehleraus. La clase Fehlerklasse
Excepción y damit auch die davon abgeleitete KlassePDOExcepciónbesitzen mehrere
vordefinierte Methoden. Estos son los siguientes métodos:

obtener mensaje gibt einen Fehlertext aus gibt den


obtener código Fehlercode aus
obtener línea gibt aus, en welcher Zeile der Fehler auftrat
6.3 Erste Datenbankzugriffe 203

Wir merken an, dass im obigen Beispiel die Transaktion im Fehlerfall automatisch
zurückgesetzt wird. El objetopsconectarWurde nämlich insidehalb des Try-Blocks erzeugt.
Mit dem Verlassen des Try-Blocks wird das Objektpsconectarungültig. Si se cambia la
fecha del banco, cuando se identifique este objeto se activará automáticamente una
reversión. Eventuell belegter Speicherplatz wird freigegeben. Wird bereits beim Einloggen
ein Fehler erzeugt, so wird natürlich überhaupt keine Verbindung aufgebaut und ein
impliziter Rollback-Befehl erübrigt sich. Wir müssen sogar vor folgender gut gemeinten
aber falschen Programmierung warnen:

I Im Catch-Block ist das Datenbankobjekt (aquí:psconectar) in der Regel nicht mehr gültig.
Ein Befehl der Formpsconexión->rollback()führt dann zu einem Fehler internalhalb des
Catch-Blocks und damit zum Absturz des Programms.

6.3.5 Auslesen mehrerer Datenzeilen

En programa no sereminicio.phpHaben wir nur einen einzigen Mitarbeiter ausgegeben.


In der Praxis lesen wir jedoch mit Hilfe eines Select-Befehls meist viele Datensätze ein.
Estas fechas guardadas incluyen un Schleife Zeile für Zeile. Wir demonstrieren dies an
Hand einer kleinen Mitarbeitersuche. Auch wenn unsere RelaciónPersonalSehr klein ist,
so funktioniert das hier vorgestellte Programmmitarbeiter.phpUna abhängig von der
Größe der Relation. Die Idee dieses Programms ist schnell erklärt: Das Programm fordert
zur Eingabe eines Suchstrings auf und gibt alle Mitarbeiter aus, die in Ihrem Namen
diesen Suchstring enthalten, unabhängig von Groß- und Kleinschreibung.
En la fechamitarbeiter.phpMüssen wir also neben den Daten zum Einloggen auch einen
Suchstring eingeben. Stellt sich heraus, dass der Suchstring no óptima gewählt wurde, so
möchten wir direkt einen neuen Suchstring eingeben, ohne aber die Daten zum Einloggen
nochmals eingeben zu müssen. Mit den folgenden Vorarbeiten ist dies problemlos möglich.
Beginnen wir mit dem Eingabeformular dieses Programms. Gestalterische Elemente, wie die
Verwendung von Tabellen-Tags, wurden aus Übersichtsgründen weggelassen:

<formulario acción="mitarbeiter.php" método =


"publicación"> <p>Bitte Daten zum Einloggen eingeben</p>
... <!-- Servidor- und Datenbankdaten -->
<p>Kennung eingeben:</p>
<tipo de entrada="Texto" nombre = "Kennung" tamaño = "20" valor=
<?php echo isset($_POST['Kennung'])? $_POST['Kennung']:
"bicicleta"; ?>/>
<p>Contraseña eingeben:</p>
<tipo de entrada="Contraseña" nombre = "Contraseña" tamaño = "20" valor=
<?php echo isset($_POST['Contraseña']) ?
$_POST['Contraseña'] : "" ; ?>/>
204 6 Programación del banco de datos PHP

<p>Suchzeichen zur Mitarbeitersuche:</p>


<tipo de entrada="Texto" nombre = "Tal cadena" tamaño = "30" valor=
<?php echo isset($_POST['Tal cadena'])?
$_POST['Tal cadena']: "" ; ?>/>
<entrada tipo = "Enviar" valor="Más"/>
</formulario>

Este programamitarbeiter.phpHaga clic automáticamente en el botón Enviar. La idea es


dabei, die beim ersten Aufruf eingegebenen Daten zu Server, Datenbank, Kennung und
Passwort und zum Suchstring bei einem Folgeaufruf nicht nochmals eingeben zu müssen.
Daher muss im Programm zwischen dem Erstaufruf und weiteren Aufrufen unterschieden
werden. En PHP, tienes una función específicaEstá establecido(aquí Tab.6.2) zur Verfügung, die
den Wertverdaderozurückliefert, falls die angegebene Variable bereits existiert. Para que
Kennung schreiben wir daher beispielsweise:

valor= <?php echo isset($_POST['Kennung']) ?


$_POST[’Kennung’] : "bicicleta" ;?>

También seleccionamos HTML y PHP y lo superamos, como la Post-VariableKennung


existente. Si se utiliza la función de eco en esta post-variable, entonces caerá el Vorgabe
bicicletazurückgegeben. Schließlich no utiliza PHP cada vez que se utiliza. Aus
Kompaktheitsgründen haben wir den auch in vielen anderen Programmiersprachen
vorhandenen Fragezeichen-Operator („?:“) verwendet. Naturalmente, también se puede
utilizar un If-Anweisung:

valor= <?php
si (isset($_POST['Kennung']))
eco $_POST['Kennung'] ;
demás

eco "bicicleta" ;
?>

El efecto es claro: Beim ersten Aufruf wird der Anfangswertbicicletaverwendet. Bei den
weiteren werden die zuletzt eingegebenen Werte übernommen. Einlog-Daten müssen somit
nicht jedes Mal neu eingegeben werden. Dies führt jedoch zu einer extremen Sicherheitslücke:
Das Passwort steht unverschlüsselt im entsprechenden Eingabefeld! Auch wenn das Passwort
nicht direkt angezeigt wird, so wird es mit einem Rechtsklick und der AuswahlQuelltext
anzeigenbarra de visión. In den weiteren Beispielen werden wir diese Sicherheitslücke
schließen. Momentan bitten wir this Schwäche zu akzeptieren.
Beim ersten Aufruf der Dateimitarbeiter.phpdarf noch kein Datenbankzugriff erfolgen. Wir
haben schließlich weder Kennung noch Passwort eingegeben. Mit dem dosweiten Aufruf dieser
Datei wollen wir bisagragen die gewünschten Daten auslesen. Wieder verwenden wir deshalb
die FunktionEstá establecido. Betrachten wir den weiteren Código:
6.3 Erste Datenbankzugriffe 205

<?php
si (isset ($_POST['Kennung'])F
$suche = trim($_POST['Tal cadena']); // ev. leerzeichen
// enfernen
si (strlen($suche) == 0)F
echo "<p>Es wurde kein Suchstring eingegeben. </p>"; gramodemás
F
intentar F
echo "<p>Die Datenbank BIKE wird jetzt nach allen ",
"Mitarbeitern durchsucht, die im Namen den ", "Teilstring
$suche enthalten.</p>";
// Einloggen wie bisher mit:
// nuevo PDO, setAttribute, comenzarTransacción //
Lesezugriff:
$sql = "Seleccione Persnr, Nombre, Ort, GebDatum, Gehalt,
Vorgesetzt
De personal
Donde Upper(Name) Like Upper(’%$suche%’) " ; $stmt =
$conn->query( $sql ); // Ausfuehren des
// SQL-Befehls

Wir unterbrechen das Programm wieder. Gracias a la función PHPEstá establecidoWird este
Codeteil primero ab dem dos Weiten Aufruf este PHP-Seite abgearbeitet. Muere variable
$_POST['Tal cadena']enthält den eingegebenen Suchstring. La función PHPrecortarentfernt
eventuell führende und schließende Leerzeichen. Jetzt öffnen wir die Datenbank und lesen alle
Mitarbeiter ein, die im Namen den eingegebenen Teilstring enthalten. Groß- und
Kleinschreibung soll dabei keine Rolle spielen. Daher werden auf beiden seiten des Operadores
Comodie Zeichenketten in Großbuchstaben umgewandelt. Muere variablepstalWird durch den
Inhalt this Variable ersetzt. Los Prozentzeichen sind el símbolo comodín (como el operador
similar en Abschn.4.1.4). Sehr praktisch in PHP ist, dass sich Zeichenketten auch über mehrere
Zeilen erstrecken können. Wir schreiben am Ende des Select-Befehls keinen Strichpunkt, da
dies Oracle leider mit einer Fehlermeldung quittieren würde.
Wir müssen die mit der Query-Methode erhaltenen Daten jetzt in einer Schleife im
Browser auslesen und in Tabellenform ausgeben. Aus dem letzten Beispiel wir bereits,
dass the Query-Methode die Daten in einem Objekt vom DatentypDeclaración PDO
Hinterlegt. Mit Hilfe der Fetch-Methode der KlasseDeclaración PDOerhalten wir eine
Datenzeile. In einer Schleife können wir daher alle Zeilen auslesen. El resto de los
programas hasta el final de los bloques de prueba se incluyen en este esquema y en una
tabla para el uso:

// Ausgeben der gelesenen Fecha:


si ( !($fila = $stmt->fetch()) )f //cae sin fecha: Beenden
echo "Mitarbeiter mit dem Teilstring im",
"¡Namen existiert nicht!";
gramodemásF
206 6 Programación del banco de datos PHP

?><p>Ergebnis:</p> <!-- Tabelle aufbauen -->


<borde de la tabla relleno de celda = 10>
<tr>
<!-- Erste Tabellenzeile -->
<th>Persnr </th> <th>Nombre </th>
<th>Ort </th> <th>GebDatum </th>
<th>Gehalt </th> <th>Vorgesetzter? </th>
</tr>
<?php
hacerF // In einer Schleife Daten auslesen
?>
<tr>
<td> <?php echo $fila["PERSNR"] ?> </td> <td> <?php echo
$fila["NOMBRE"] ?> </td> <td> <?php echo $fila["ORT"] ?> </td>
<td> <?php echo $fila["GEBDATUM"] ?> </td> <td> <?php echo
$fila["GEHALT"] ?> </td> <td> <?php echo ($fila["VORGESETZT"]
== nulo)?

"Ja": "Nein"; ?></td>


</tr>
<?php
gramomientras ($fila = $stmt->fetch()); eco
"</table>";
gramo //endif buscar
$conn->commit(); // transacciones
gramo //intento final

Wir überprüfen zunächst, ob es überhaupt Daten mit den gewünschten Eigenschaften


gibt. Wenn ja, so bauen wir eine Tabelle auf. Wir geben zunächst eine Überschriftenzeile
aus y dann in einer Do-While-Schleife zeilenweise die Daten mittels der PDOStatement-
Methodebuscar. Jeder Aufruf dieser Methode liefert dabei den nächsten Datensatz, also
die nächste Zeile des Select-Befehls. Existiert kein weiterer Datensatz, so liefert die
Methodebuscarden wertFALSOzurück, wodurch die Schleife und damit die Datenausgabe
beendet werden. Zum Schluss wird die Transaktion korrekt abgeschlossen. In der Praxis
kommen häufig Nullwerte vor. Die Nullwerte in a Relation werden dabei auf Nullwerte in
PHP übertragen. Wir haben dies beim AttributVorgesetztverwendet.
Fassen wir das Auslesen von Daten mittels eines Select-Befehls zusammen. Wir benötigen
dazu mehrere Schritte:

- Definición de valores seleccionados y absolutos en una cadena


- Ausführen des Select-Befehls mittels del método PDOconsulta
- Auslesen der Ergebniszeilen mittels einer Schleife und der PDOStatement-Methode buscar
6.3 Erste Datenbankzugriffe 207

Los primeros dos caracteres escritos para todas las funciones SQL. Der letzte ist typisch nur für
den Select-Befehl. In der Regel hat dieses Auslesen folgendes Aussehen:

mientras ( $fila = $stmt->fetch() ) F

// Ausgabe der Attribute der aktuellen Zeile mit Hilfe // des Feldes $row

gramo

In unserem obigen Programmbeispiel hatten wir zunächst überprüft, ob überhaupt Daten


existieren. Dazu mussten wir die erste Zeile auslesen. Um diese erste Zeile bei der späteren
Ausgabe nicht zu vergessen, bietet sich hier die Verwendung einer Do-While-Schleife an. Das
Ausgeben der Daten sieht dann typischerweise wie folgt aus:

si ( !($fila = $stmt->fetch()) )
echo "<p>Keine Daten</p>";
demás

hacerF

// Ausgabe der Attribute ab der ersten Zeile // con Hilfe von


$row
gramomientras ( $fila = $stmt->fetch() );

Muere variablepsstmtbewegt sich wie ein Zeiger von Zeile zu Zeile. Podemos usar esta
variablepsstmtwie einen Zeiger (Cursor) auf die gerade betrachtete Zeile vorstellen.
Häufig wird in der Literatur daher für this Variable auch der BegriffCursorverwendet.
Podemos usar esta variablepsstmtAdemás de los dedos, der zu Beginn vor die Tabelle
zeigt und mit jedem Fetch-Befehl eine Zeile weiter rückt. Wir haben muere en Abb.6.4
dargestellt.
Der Fetch-Befehl liefert ein asociatives Feld zurück, das alle Spalteninhalte der Zeile
enthält, auf der der Cursorpsstmtgerade zeigt. Zeigt der Cursor bereits auf das Ende der
letzten Zeile, y wird der Fetch-Befehl nochmals ausgeführt, so wird dieser Cursor
gelöscht, and die Variablepsstmterhält den booleschen WertFALSO.

1 María Forster Ratisbona 05.07.79 JA


2 Anna Kraus Ratisbona 09.07.75 NEÍN
3 Rango Úrsula Francfort 04.09.67 NEÍN
4 Heinz Rolle Núremberg 12.10.57 NEÍN
Cursorpsstmt:
5 Johanna Koster Núremberg 07.02.84 NEÍN
6 Marianne Lambert Landshut 22.05.74 JA
7 Thomas Noster Ratisbona 17.09.72 NEÍN
8 Renate Wolters Augsburgo 14.07.79 NEÍN
9 Ernst Pach Stuttgart 29.03.92 NEÍN

Tejido. 6.4Variable de declaración como cursor


208 6 Programación del banco de datos PHP

6.4 Komplexere Datenbankzugriffe

Im letzten Abschnitt lernten wir die Grundzüge des lesenden Zugriffs auf Datenbanken
über das Internet kennen. In der Praxis erfolgen meist mehrere Datenbankzugriffe
nacheinander, lesend und schreibend, und über Dateigrenzen hinweg. Hablaremos aquí
de una sesión. Innerhalb einer Session loggen wir uns in eine Datenbank ein und arbeiten
dann oft Minuten oder sogar Stunden mit dieser Datenbank. También debemos incluir
datos de registro de una fecha PHP para una mayor seguridad en el tiempo. Bei
Schreibzugriffen müssen wir zusätzlich den Transaktionsbetrieb beachten. Es könnten
auch Verklemmungen, etwa Deadlocks (siehe auch Abschn.8.5), auftreten.
PHP gibt hinreichende Unterstützung, um all this Fälle zu meistern. Es kennt
sogenannte Sessionvariablen, die zur gesamten Zugriffszeit auf den Webserver gültig
sind, auch über über viele Seitenzugriffe hinweg. Mit Hilfe der PDO-Fehlerklasse können
wir abgefangene Fehler gezielt behandeln. Wieder weisen wir darauf hin, dass alle PHP-
Programme estos Kapitels im Internet zur Verfügung gestellt werden. Hinweise zur
Internetseite finden sich im Anhang.

6.4.1 Variable de sesión

PHP-Variablen sind nur bis zum Ende der jeweiligen Seite gültig. Damit müssen wir bisher
Variablen, die wir auch auf der nächsten Seite noch benötigen, mittels der Get- oder Post-
Methode weitergeben. Das mag in Einzelfällen durchaus in Ordnung sein. Ein Passwort darf auf
diese Weise aber niemals weitergereicht werden, da es dann direkt auslesbar wäre! Aquí puede
utilizar la variable de sesión, mientras que la situación en cuestión será mayor.
En esta página PHP, en estas variables de sesión se incluyen lana, debemos usar todas las playas,
eso es lo que hay en la página PHP.ersten Zeile dieser Seite eine Session gestartet wird. Dies
geschieht beispielsweise wie folgt:

<?php
inicio_sesión(); // notwendig bei Verwendung
// de la variable de sesión
?>

Mit der funktioninicio_sesiónsteht uns jetzt das associative FeldpsSESIÓNzur Verfügung. Die
Verwendung dieser Variable entspricht exakt der bereits bekannten VariablepsCORREO. Mit der
funktionEstá establecidokann überprüft werden, ob die Variable bereits existiert, und mit der
FunktiondesarmadoWird die Variable wieder enfernt. Wir betrachten dies an einem Beispiel:

$_SESSION[’Kennung’] = "abc12345";//La variable Kennung wird erzeugt $_SESSION[’Nr’]


= 17; //Nº de variable se activará
6.4 Komplexere Datenbankzugriffe 209

si (isset ($_SESSION['Kennung']))F
echo "<p>Variable Kennung existiert und wird ",
"nun entfernt.</p>";
unset($_SESSION[’Kennung’]);//Variable de sesión ungueltig
gramo

echo "<p>Die Sessionvariable Nr hat den Wert: ",


"$_SESSION[Nº].</p>";

Beim Weiterklicken auf otras páginas gehen die Inhalte esta Sessionvariablen no verloren.
PHP sorgt dafür, dass die Werte sicher weitergereicht werden. Solange ein Benutzer seine
Internetverbindung nicht beendet und die Variablen nicht mit der Funktion desarmado
zurückgesetzt werden, bleiben die benutzten Variablen gültig! Voraussetzung ist, dass auf den
Folgeseiten die Funktioninicio_sesiónaufgerufen wird.
Bei umfangreichen Datenbankzugriffen mit vielen PHP-Seiten ist es sinnvoll, mit una
HTML-Startseite zu startnen. En Abd.6.5haben wir diese Dateiíndice.htmlgenant. Aquí se
muestran las fechas seleccionadas para la publicación de datos y las variables posteriores
a una página de PHP, aquíindex.php. En esta página de PHP se leen las variables de post y
se copian las variables de sesión con los nombres asociados seleccionados. Dies lautet
beispielsweise:

$_SESSION[’Datenbank’] = $_POST[’Datenbank’];

Ab dieser Datei verzweigen wir auf alle weiteren Anwendungen. En estos PHP-Dateien
greifen wir bei Bedarf auf die Datenbank zu. Las fechas de los registros de entrada se aplicarán
a las variables de sesión. Zum Beenden der Session wird empfohlen, auf eine Datei
restablecer.phpzuzugreifen, die alle Sessionvariablen mit Hilfe der Funktiondesarmado
zurücksetzt und zur Startseiteíndice.htmlzurückverweist.

Página de inicio con


Eingabe der
índice.html datos benutzer

restablecer.php Hauptseite mit


index.php Verzweigungen

inicio.php eswahl.php … imagen.php


Arbeitsseiten

Tejido. 6.5Configuración de PHP con sesiones


210 6 Programación del banco de datos PHP

Wir müssen auf den Folgeseiten (en Abb.6.5die Dateien in der letzten Zeile) beachten,
dass es versehentliche oder absichtliche Quereinsteiger geben kann. Estos elementos
básicos se utilizan en estas páginas PHP para usarlas por encima de las variables de
sesión que también se utilizan. Dies könnte wie folgt aussehen:

si(!isset($_SESSION['Kennung']) || !isset($_SESSION['Contraseña'])
|| !isset($_SESSION[’Servidor’]) !
|| isset($_SESSION[’Datenbank’]))
echo "Gehen Sie zur <a href=\"start.html\">Startseite</a>"); demás

f //Jetzt kann auf die Datenbank zugegriffen werden:


$conexión = nuevo PDO(...

Es sei nochmals darauf bisagrasen, dass une Datenbankverbindung über PHP-Seiten


hinweg hinweg nicht ofen gehalten werden kann. Wir müssen uns daher auf jeder Seite new
einloggen.

6.4.2 Mehrfache Lesezugriffe auf Datenbanken

Wir fahren jetzt mit etwas umfangreicheren Lesezugriffen fort: Dazu füllen wir in der
Dateieswahl.phpzunächst dos Comboboxen mit Kunden- und Artikeldaten und geben
dann aus, ob und wann die markierten Kunden den ausgewählten Artikel gekauft haben.
Insgesamt liegen also drei Lesezugriffe vor.
Neu sind das Ausführen mehrerer Select-Befehle und das Füllen von Select- und
Comboboxen mit Datenbankinhalten. Das Ergebnis sehen wir in Abb.6.6. Para utilizar estas
imágenes, deberá utilizarlas después de los registros correspondientes a dos opciones
seleccionadas. Wir schreiben:

$sql1 = "Seleccione Anr, Bezeichnung From Artikel"; //Artikeldaten $sql2 =


"Seleccione Nr, Nombre de Kunde"; //kundendaten
$stmt1 = $conn->query($sql1); $stmt2 = //Ausfuehren des 1. SQL-Befehls //
$conn->query($sql2); Ausfuehren des 2. SQL-Befehls

Sicherheitshalber sollten wir noch überprüfen, ob die Abfrage überhaupt Ergebnisse liefert.
Wir lesen also mit der Methodebuscarjoyas die erste Zeile ein. Anschließend Holen wir die
Daten von der Datenbank und Speichern sie in den den beiden Select-Feldern. Comenzaremos
con el primer campo, un combobox. Esto se activa automáticamente cuando se selecciona el
campo del parámetrotamañoauf den Wert 1 juego. Wir geben die Artikelnamen aus, wollen
intern aber die eindeutigen Artikelnummern weitergeben. Dies erreichen wir mit dem
ParámetrovalorSoy etiqueta de opción. El código indicado para el uso de todos los artículos en
el cuadro combinado contiene:
6.4 Komplexere Datenbankzugriffe 211

Tejido. 6.6Captura de pantalla del programa auswahl.php

si ( $fila1 = $stmt1->fetch() )f //existieren ueberhaupt Werte?


echo "<select name=\"Artikelnr\" tamaño=\"1\">" ; hacer
F
echo "<valor de opción=\"$fila1[ANR]\""; si
(isset($_POST['Artikelnr']) y
$_POST['Artikelnr'] == $fila1['ANR'])
eco " seleccionado";
eco "> $fila1[BEZEICHNUNG]</opción>";
gramomientras ($fila1 = $stmt1->fetch()); eco
"</select>";
gramodemás ...

Creamos un combobox con el nombreArtículo. Wir verwenden zum Auslesen aller


Zeilen aus der RelationArtículoeine Do-While-Schleife, da wir vorab bereits auf die erste
Zeile zugegriffen hatten. Im Option-Tag versorgen wir den Parametervalorcon el número
de artículo. Wir verwenden dabei dos Anführungszeichen insidehalb einer Zeichenkette.
Esto debe realizarse con la barra invertida (“\“) entwertet werden. En el cuadro combinado
aparecerán todos los nombres de los artículos. Gleichzeitig überprüfen wir mit der
FunktionEstá establecido, ob wir diese Seite zum ersten Mal aufrufen. Wenn nein, so
vergleichen wir den durch die Postvariable übergebenen Wert mit der ausgelesenen
Artikelnummer. Wenn beide übereinstimmen markieren wir diesen Feldeintrag als
ausgewählt (seleccionado). Damit bleibt der zuletzt eingestellte Artikel auch beim
nächsten Aufruf markiert.
Die Auflistung der Kunden ist im Prinzip ähnlich. Nur dürfen hier mehrere Kunden
gleichzeitig angeklickt werden. El campo de selección aparece en el parámetromúltiple. En este
otoño no hay ningún mundo en el que se encuentren, son un campo con todas las marcas
posibles. Wir wählen als Select-Namen daher auch ein Field (Kundnr[]). Etwas Schwieriger
212 6 Programación del banco de datos PHP

wird es nun, wenn wir alle beim letzten Aufruf markierten Kunden wieder anzeigen wollen. Wir
verwenden dazu die Funktionimplosionar(siehe Abschn.6.2.3y Tab.6.2). Wir wandeln das
übergebene Feld aus Kundennummern in eine Zeichenkette, getrennt durch Leerzeichen, um.
Mit der funktionestroposüberprüfen wir anschließend, ob die aktuell eingelesene
Kundennummer in dieser Zeichenkette enthalten ist. Wenn ja, so markieren wir diese Zeile. El
código gesamte lautet:

echo "<seleccione varios nombres=\"Kundnr[]\" tamaño=\"5\">" ; si


(isset($_POST['Kundnr']))
$alleKunden = implosionar( " ", $_POST[’Kundnr’] ); // marcado
Kunden
demás

$alleKunden ="";
hacer F
eco "<opción valor=\"$fila2[NR]\"";
if (strpos($alleKunden, $row2[’NR’]) !== falso)
eco " seleccionado";
eco "> $fila2[NOMBRE]</opción>";
gramomientras ($fila2 = $stmt2->fetch()); eco
"</select>";

Ab dem zweiten Aufruf des Programmseswahl.phpgeben wir zusätzlich alle


Auftragsdaten zu den markierten Kunden und dem ausgegebenen Artikel in Tabellenform
aus. Wir greifen dazu auf die RelationenAuftragyAuftragspostenzu:

$sql = "Seleccione A.Auftrnr, Kundnr, Datum, Persnr,


Anzahl, Gesamtpreis
Desde Auftrag A Inner Únase a Auftragsposten AP
En A.Auftrnr=AP.Auftrnr
Donde Kundnr In (" . implode(",", $_POST[’Kundnr’]) . ") Y Artnr =
$_POST[Artikelnr]";
$stmt = $conexión->query($sql);

Die vollständige Ausgabe erfolgt dann mit Hilfe einer Tabelle. Dies wurde bereits in
Abschn.6.3.5gezeigt und geschieht hier analog. Wir weisen noch darauf hin, dass wir im
obigen Select-Befehl auch einen natürlichen Verbund hätten verwenden können. Wir
wünschen jedoch maximale Flexibilität. La conexión natural en SQL Server no es real,
pero hay una conexión para la conexión con las letrasEnentschieden. Auch das Füllwort
Comobei den Aliasnamen haben wir wegen Oracle nicht benutzt.
6.4 Komplexere Datenbankzugriffe 213

6.4.3 Una GUI para la configuración de SQL-Befehlen

Bisher griffen wir ausschließlich lesend auf the BIKE-Datenbank zu. Aber auch das Schreiben in
eine Datenbank ist kein Problem, im Gegenteil: Wir müssen keine Daten aufbereiten und
ausgegeben. Im folgenden Beispiel wollen wir sowohl Lese- als auch Schreibbefehle auf die
Datenbank zulassen. Wir entwickeln dazu una pequeña GUI propia. Diese besteht im
Wesentlichen nur aus einem Textfeld. Este Textfeld erlaubt die (fast) beliebige Eingabe von
SQL-Befehlen. Bei Select-Befehlen wird eine Ausgabe erzeugt. Bei other DML-Befehlen wird
ausgegeben, wie viele Zeilen manipuliert wurden. Aber auch DDL-Befehle sind erlaubt.
Meldungen zu fehlerhaften SQL-Befehlen werden angezeigt. Wieder verwenden wir nur eine
einzige Datei:seleccionar.php. Definiciones de significado para la información de seguridad y
texto de tipoárea de texto:

<formulario acción="select.php" método = "publicación">


<textarea name="Eingabe" filas = "10" cols="60" wrap="virtual">
<?php si (isset($_POST['Eingabe']))
eco recortar($_POST['Eingabe']);
?> </textarea><br>
<tipo de entrada="Enviar" value="Ausführen"/>
</formulario>

Ein Textfeld wird mit dem Tagárea de textoeingeleitet. In unserem Beispiel besteht es aus
10 Zeilen mit je 60 Spalten. Weiter werden lange Zeilen dank des Parametersenvoltura =
"virtual"automatisch umgebrochen. Ein eventuell gewünschter Vorgabetext wird dann vor dem
Ende-Tag (</textarea>) registrado. Wir überprüfen mit der FunktionEstá establecido, ob esta
página bereits einmal aufgerufen wurde und geben in diesem Fall den zuletzt geschriebenen
Text aus. Wir haben dies bereits kennen gelernt.
Ab dem zweiten Zugriff auf die Seiteseleccionar.phploggen wir uns wie gewohnt in die
Datenbank ein. Jetzt müssen wir die im TextfeldEingabeübergebene Zeichenkette zunächst
auswerten:

$Eingabe = recortar($_POST['Eingabe']);
$stmt = $conexión->query($Eingabe);
$erstesWort = substr($Eingabe, 0, 6); // 1. Sombrero de mosto 6 Zeichen!

Wir löschen mit der FunktionRecortaralle führenden und schließenden Leerzeichen. Este
pollo bereinigte Zeichenkette wir monja con el métodoconsultaan die Datenbank.
War dieser Befehl fehlerfrei, so können wir nun das Ergebnis ausgeben. Dazu müssen
wir wissen, welcher Befehl vorlag. Deshalb ermitteln wir das erste Wort der Eingabe. Da
die DML-BefehleSeleccionar,Insertar,ActualizaryBorraralle sechs Zeichen lang sind,
genügt es, die Eingabe auf die ersten sechs Zeichen zu reduzieren. Esta funciónsubstrato
Verweisen wir auf die Übersicht en Tab.6.2.
214 6 Programación del banco de datos PHP

Liegt ein Lesezugriff vor (erstes Wort:Seleccionar), so geben wir das Abfrageergebnis
mit Hilfe einer Fetch-Schleife aus. Die Attributnamen sind aber im Voraus in der Regel no
bekannt. Jetzt kommen uns die assoziativen Felder zu Hilfe, die die MethodeBuscar
erzeugt. Wie bereits erwähnt erzeugt die MethodeBuscarTambién indique Feldeinträge.
Letztere stören en unserem Fall. Wir übergeben daher al parámetro del métodoBuscardie
DOP-KonstanteDOP::FETCH_ASSOC. Nun werden ausschließlich asociative Werte
generiert, und diese enthalten im Schlüssel die Attributnamen. Die Idee es monja clara.
Wir führen die Fetch-Methode einmal aus and bauen die Überschrift der Ausgabetabelle
mit Hilfe dieser Schlüsselwerte auf. In einer Do-While-Schleife werden dann die
dazugehörigen Inhalte ausgegeben. Wir erhalten:

if (strCaseCmp($erstesWort,"SELECCIONAR")==0)F
if ( $fila = $stmt->fetch(PDO::FETCH_ASSOC) )F
// ¡Claves asociativas!
echo "<borde de tabla=\"2\" cellpadding=\"2\"><tr>"; foreach ( $fila como
$colname => $datos ) // Sintaxis beachten!
eco "<th> $colname </th>"; // Spaltennamen ausgeben
eco "</tr>";
hacerF // Fecha de uso:
eco "<tr>";
foreach ($fila como $datos)
eco "<td>" . ($datos == nulo ? "(nulo)" : $datos).
"</td>"; // Nullwerte
eco "</tr>"; // Zeile estado
gramomientras ( $fila = $stmt->fetch(PDO::FETCH_ASSOC) ); eco
"</tabla>";
gramo

demás eco "Keine Daten<br>";


gramo

si no (strCaseCmp($erstesWort,"INSERT")==0)
echo $stmt->rowCount(), " Zeile(n) wurde(n) eingefügt.<br>"; elseif
(strCaseCmp($erstesWort,"ACTUALIZACIÓN")==0)
echo $stmt->rowCount(), " Zeile(n) wurde(n) geändert.<br>"; elseif
(strCaseCmp($erstesWort,"BORRAR")==0)
echo $stmt->rowCount(), " Zeile(n) wurde(n) gelöscht.<br>"; demás

echo "Ein DDL-Befehl wurde ausgeführt.<br>"; $conn-


>commit();

Hemos tenido la VergleichsfunktionstrCaseCmpverwendet, da diese nicht zwischen Groß-


und Kleinschreibung unterscheidet! Liegt kein Select-Befehl vor, so überprüfen wir, ob ein
Insert-, Delete- o Update-Befehl eingegeben wurde. In diesen Fällen geben wir aus, wie viele
Zeilen manipuliert wurden. Aquí hay un método de declaración PDO número de filas. Este
método proporciona la seguridad de los tiempos previstos.
6.4 Komplexere Datenbankzugriffe 215

I Es ist zu beachten, dass die Methodenúmero de filasbeim Select-Befehl nicht in allen


Datenbanken die Anzahl der zurückgelieferten Zeilen ausgibt. Este método es
generalmente válido para actualizar, eliminar e insertar sin necesidad de realizar
ajustes.

6.4.4 Inyección SQL

Immer wieder gelingt es Außenstehenden, wegen ungeschützter Internetseiten in


Computer einzudringen oder Daten abzufragen, die eigentlich verborgen sind. Die
meisten Datenbankanwender machen es diesem Personenkreis aber auch leicht. Es gibt
für estas Schwachstellen in der Internet-Programmierung einen Begriff:Inyección SQL.
Todos los desarrolladores de software, el software en la red funcionan, por lo que no se
pueden usar con inyección SQL. Werden in this Abschnitt die wichtigsten Probleme
aufzeigen.
Habíamos estado en Abschn.6.3bereits auf eine Schwachstelle bisagras: Wir übergeben
mittels Post- oder Get-Variable keine Kennwörter. Diese sind in der weitergereichten Datei
ungeschützt und damit jederzeit auslesbar. Wir wollen in diesem Abschnitt auf dos weitere
wichtige Gefahrenpunkte aufmerksam machen: Das Ausführen von unerlaubten Anweisungen
mit Hilfe von nicht vorgesehenen Formulareingaben, um zum einen Schadcode einzuschleusen
und zum anderen nicht erlaubte Datenzugriffe durchzuführen.
Die im letzten Abschnitt behandelte Textarea lädt geradezu ein, in bis zu 60 Zeichen je
Zeile in zusammen 10 Zeilen beliebigen Code einzugeben. Niemand verhindert, wer statt
eines SQL-Befehls andere Befehle und Zeichen schreiben. Und so wird es Spezialisten
vielleicht gelingen, einen Löschbefehl abzusetzen, der alle Seiten des Webservers löscht.
Damit wären wir bei unserem ersten Problem: Wir müssen verhindern, dass die
Formulare verlassen werden und Code ausgeführt wird.
Um dies zu demonstrieren, geben wir in unserem Programm des letzten Abschnitts
internalhalb des Eingabefeldes (Textarea) folgende Zeichen ein:

</textarea></td></tr></table><br/>Hier könnte Schadsoftware stehen.

Haga clic en el botón Ausführen para soltar el botón, así que treten folgende Effekte ein, siehe auch Abb.
6.7

- Eine DOP-Fehlermeldung wird ausgegeben


- Das Eingabefeld, die Textarea, ist nun leer
- Außerhalb des Textfeldes steht: "Hier könnte Schadsoftware stehen".

Estos tres errores se pueden realizar correctamente: no hemos utilizado ninguna base SQL.
Die Datenbank wird daher natürlich zurückliefern, dass dies no korrekte SQL-Anweisung sei.
Das Problem unseres Programms ist die wohlgemeinte Benutzerfreundlichkeit: Wir zeigen den
zuletzt eingegebenen SQL-Befehl wieder an. Cuando lo hagamos
216 6 Programación del banco de datos PHP

Tejido. 6.7Inyección SQL sencilla

Jetzt aber gar keinen SQL-Befehl eingeben, sondern beliebige andere Zeichen, so werden
auch diese angezeigt. Dies haben wir jetzt mit der Eingabe obiger Zeichen ausgenutzt:
Wir schließen mit Hilfe von HTML-Tags die Textarea and beenden die Tabelle. Weiter
geben wir einen Hinweistext aus. Y tatsächlich, mit hinreichend krimineller oder auch nur
experimentierfreudiger Energie könnten wir an thisstelle una función PHP ausführen. Im
schlimmsten Fall schreiben wir una función, die Betriebssystemfunktionen aufruft, etwa
zum Löschen des gesamten Verzeichnisses – mit fatalen Folgen.
Erfreulicherweise können wir uns gegen dieses Einschleusen von nicht gewünschten
Befehlen relativ leicht schützen. El problema es el contenido de las etiquetas HTML, etwa
zum Schließen der Textarea. Y esta es la última vez que una función PHP bloqueada:html
caracteres especiales. Wir ändern den Code

<?php si (isset($_POST['Eingabe']))
recorte de eco($_POST['Eingabe']);

aus dem Beispiel des letzten Abschnitts zum Kopieren der letzten Eingabe in das Textfeld wie
folgt:

<?php si (isset($_POST['Eingabe']))
echo trim(htmlspecialchars($_POST['Eingabe']));

Jetzt werden alle HTML-Zeichen in Ersatzzeichen umgewandelt. Sollten wir también en


unser Textfeld mit NamenEingabebeispielsweise die Zeichen ,<‘ oder ,>‘ eingeben, et-
6.4 Komplexere Datenbankzugriffe 217

wa um ein HTML-Tag zu schreiben, so werden this umgewandelt: In unserem Beispiel erhalten


wir die Ersatzdarstellungen ,<‘ und ,>‘. Diese Ersatzdarstellungen zeigen in jedem Browser
ebenfalls das Kleiner- bzw. Größerzeichen an. Wichtig ist aber, dass diese Ersatzzeichen nicht
mehr als Beginn bzw. Ende eines Tags interpretiert werden. Wir können die Textarea also nicht
mehr verlassen. Die eingegebenen Zeichen werden folglich vollständig im Textfeld
wiedergegeben. Ein Schadcode kann nicht mehr gestartet werden.
Als Folgerung beachten wir:

I consejoVom Benutzer eingegebene Formulartexte, die zur erleichterten Bedienung


nochmals im Browser angezeigt werden, sollten dringend geschützt werden,
beispielsweise mittels der Funktionhtml caracteres especiales.

Wir wollen noch ein dose Beispiel aufzeigen: Durch gezielte Eingabe eines SQL-Befehls
wollen wir an gespeicherte Informationen kommen, die nicht für uns bestimmt sind.

Para este efecto, utilizaremos un programa PHPmitarbeiter.php. Wir wollen, dass


die Vorgesetztendaten aus der Relation Personal grundsätzlich no sichtbar sind y
ergänzen unseren SQL-Zugriffsbefehl wie folgt:

$sql = "Seleccione Persona, Nombre, Ort, Gebdatum, Gehalt, Vorgesetzt


De personal
Donde Vorgesetzt no es nulo
Y Upper(Name) como Upper(’%$suche%’) ";

Neu ist hier nur die dritte Zeile. Wir suchen weiterhin nach Mitarbeitern und geben einen
Suchstring ein. Gefunden werden jetzt aber ausschließlich diejenigen Mitarbeiter, die im
AttributVorgesetztSi no se activa ninguna función nula, tampoco se utilizará ninguna función
de control.
Wenn wir jetzt glauben, dass damit keine Daten der Vorgesetzten angezeigt werden
können, so haben wir uns leider getäuscht. Die Eingabe folgender Zeichen im Suchstring listet
alle Mitarbeiter auf, auch die Vorgesetzten:

') O ('%' = '

Was wie Hieroglyphen aussieht, ist tatsächlich Berechnung. Y con ein wenig Nachdenken
kommen wir también detrás de la idea. Ergänzen wir nämlich den Where-Teil in unserem
obigen Select-Befehl durch diese Zeichen, so erhalten wir folgende korrekte Where-Bedingung:

Donde Vorgesetzt no es nulo


Y Upper(Name) como Upper('%') o ('%' = '%')

Die Bedingung besteht aus drei Teilen, getrennt durch die booleschen OperadoresY y
O. Der erste Teil ist möglicherweise wahr, der zweite und dritte Teil sind immer
218 6 Programación del banco de datos PHP

wahr. El operadorObindet schwächer como operadorY, somit wird ein wahrer Teil mit
dem OperadorOverknüpft, die Gesamtbedingung ist daher immer wahr. Alle Tupel der
RelaciónPersonalwerden ausgegeben!
Auch vor diesen unerwünschten Eingaben können wir uns schützen. Allerdings müssen wir
jetzt ein bisschen weiter ausholen. Wir müssen nämlich die directamente Eingabe in einen SQL-
Befehl unterbinden und stattdessen den Weg über Variablen gehen. Wir dürfen die Methode
consultala claseDeclaración PDOnicht mehr verwenden und müssen este métodoconsultaen
die beiden Methodenprepararyejecutartrenen. Beide nebeneinander aufgeführten Variantes
sind nämlich vollkommen gleichwertig:

$stmt = $conn->query( $sql ); $stmt = $conn->preparar( $sql ); $stmt-


>ejecutar( );

El métodoprepararLeistet jetzt das Gewünschte: Im SQL-Befehl können wir noch


unbekannte Parameter durch ein Fragezeichen ersetzen. Estas Fragezeichen werden
dann mittels der MethodeenlazarParammit Variablen verknüpft. Aquí tenemos el uso de
SQL-Befehl y el siguiente uso de Query-Befehl ab zu:

$sql = "Seleccione Persona, Nombre, Ort, Gebdatum, Gehalt, Vorgesetzt


De personal
Donde Vorgesetzt no es nulo y
Upper(Name) como Upper(?) "; $stmt =
$conn->preparar($sql); $stmt->bindParam( 1, $suche );
$suche = "%$suche%";

$stmt->ejecutar() ;

En las dos funciones superiores, se mostrarán unas frases. Dieses Fragezeichen muss
durch eine Zeichenkettenvariable ersetzt werden. Dies geschieht mittels der Methode
enlazarParam. Obiger Aufruf dieser Methode bewirkt, dass das erste (und einzige)
Fragezeichen durch die Variablepstalersetzt wird. Wir ergänzen diese Eingabevariable
noch durch das Wildcardzeichen ,%‘ und haben dann die gleiche Wirkung wie vorher: Wir
finden alle Mitarbeiter, die den Eingabestring im Namen enthalten.
Gleichzeitig sehen wir aber auch, dass der Select-Befehl nicht mehr manipuliert
werden kann. Wir können nur noch den Parameter der FunctiontionSuperiorAdemás,
sonst nichts. Una inyección SQL no es más fácil. El métodoEjecutarführt zum Schluss den
nun aufbereiteten und schadfreien SQL-Befehl aus.

I consejoEingaben, die einen SQL-Befehl beeinflussen, werden ausschließlich über die


MethodeenlazarParamun SQL superado.
6.4 Komplexere Datenbankzugriffe 219

6.4.5 Excepción PDO de clase

Este programa PHP está diseñado para Fehler. Erstens gibt es keine fehlerfreien Programme,
und zweitens können auch falsche Eingaben Fehler verursachen. Wir sorgen daher vor y führen
unseren Code immer in einem Try-Block aus. Zusätzlich führen wir directamente nach dem
Erzeugen eines DOP-Objekts folgenden Befehl aus:

$conn->setAttribute( PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);

Damit se activa automáticamente en Datenbankfehlern una excepción del tipo de fecha


PDOExcepcióngeworfen. Die wichtigsten Methoden und Eigenschaften dieser Fehlerklasse
haben wir bereits kennen gelernt. Eine Übersicht gibt Tab.6.4wieder. Neu in dieser Tabelle ist
das Feldpsinformación de error. Este campo enthält im Index 0 den gleichen Wert, den die
Methode obtener códigozurückliefert und im Index 2 den Ergebniswert der Methodeobtener
mensaje. Zusätzlich liefert dieses Feld im Index 1 den herstellerspezifischen Fehlercode zurück.
Este código específico hersteller es manchmal detallado como el código Sqlstate, con el método
obtener códigozurückgeliefert wird.
La norma SQL incluye dos códigos Fehler:CÓDIGO SQLyESTADOSQL. Derte wurde bereits in
SQL1 definiert und ist herstellerbezogen. Nur dos werte sind fest vorgegeben. Todos los demás
pasos realizados por Hersteller no se realizan de forma específica. Eine Übersicht gibt Tab.6.5.
Die Hersteller setzen ihren eigenen meist vier- oder fünfstelligen Code. A menudo estos
códigos Fehler no son negativos. Oracle verwendet beispielsweise ausschließlich werte
positivo.
In der Praxis wesentlich wichtiger ist heute die seit SQL2 existierende Konstante
ESTADO SQL. Este Konstante es un fünf Zeichen bestehende Zeichenkette. Die ersten
beiden Zeichen geben den Fehlercode an, und die weiteren den dazugehörigen Subcode.
El código "00" aparece en el erfolgreiche Abarbeiten des Befehls. En este caso, el
subcódigo es "000". In allen anderen Fällen enthält der Code von Null abweichende
Ziffern und/oder Buchstaben. Eine Auswahl der wichtigsten Fehlercodes se encuentra en
la pestaña.6.6.

Pestaña. 6.4PDOException: Eigenschaften und Methoden

Eigenschaft/Método Descripción
obtener mensaje() gibt eine ausführliche Fehlermeldung zurück
obtenerCódigo( ) gibt die Fehlernummer zurück (código Sqlstate)
obtener línea( ) gibt Fehlerzeile zurück
Campo con 3 indias:
0: Fehlercode (código Sqlstate)
$errorInfo
1: Fehlercode des Herstellers 2:
Ausführliche Fehlermeldung
220 6 Programación del banco de datos PHP

Pestaña. 6.5 Fehlercodes de la variable SQLCODE

Código Ursache
0 Erfolgreiche Beendigung
100 Daten nicht gefunden
<0 Fehler

Im Fehlerfall geben wir den Fehlercode gemäß der Sqlstate-Spezifikation aus. Doch leider
gibt insbesondere Oracle häufig nur den FehlercodeHY000zurück! Aus diesem Grund sollte
immer zusätzlich der Hersteller-Code mit ausgegeben werden. Optimal wäre es, eine von der
FehlerklassePDOExcepciónabgeleitete Fehlerklasse zu entwickeln. Möglicherweise werden aber
diese Probleme in der der nächsten PHP-Versionen behoben, and wer behelfen uns bis dahin
mit der zusätzlichen Ausgabe des Wertesinformación de error[1]:

captura (PDOException $e)f //Datenbankfehler


echo "<p>PDO-Fehler en Zeile ", $e->getLine(),
"Código ", $e->getCode(), "($e->errorInfo[1])</
p><p>Fehlertext: ",
$e->getMessage(), "</p>";
gramo

Pestaña. 6.6Fehlercodes de la variable SQLSTATE (Auswahl)

Código Ursache
'00' Erfolgreiche Beendigung
'01' Advertencia
'02' Daten nicht gefunden
'08' Verbindungsaufbau-Fehler
'0A' Merkmal wird nicht unterstützt
'22' Datenfehler (z.B. División por Null)
'23' (Tabellen/Spalten-)Bedingung ist verletzt
'24' Estado del cursor Ungültiger
'25' Estado de las transacciones de Ungültiger
'2A' Sintaxis SQL oder Zugriffsfehler
'2B' Abhängiges Privileg existente
'2D' Nichterlaubte Transaktionsbeendigung
'34' Nombre del cursor Ungültiger
'3D' Nombre del catálogo de Ungültiger

'3F' Nombre del esquema Ungültiger


'40' Retroceder
'42' Sintaxis- oder Zugriffsfehler
'44' Check-Bedingung ist verletzt
6.4 Komplexere Datenbankzugriffe 221

6.4.6 Transacciones con PHP

In der Praxis ist der Transaktionsbetrieb enorm wichtig. En PHP, al final de cada página de
PHP se abre una transacción con una función de reversión. In der Praxis heißt dies: Jede
PHP-Seite umfasst mindestens eine Transaktion, die wir außer im Fehlerfall immer mit
dem BefehlComprometerseabschließen.
Der Transaktionsbetrieb bei Internetanwendungen ist sorgfältig zu planen. Podemos
disfrutar de una conexión segura a Internet con un navegador registrado en todo el mundo,
por lo que el registro paralelo es sind. Damit kann es Behinderungen, ja sogar Deadlocks y
otros Serialisierungsprobleme geben. In diesen Fällen werden die Datenbanken
Fehlermeldungen ausgeben. Die dazugehörigen Fehlerbehandlungen müssen wir in den
Anwendungsprogrammen selbst programmieren, was einen erheblichen Mehraufwand
bedeutet. Dies wollen wir an einem ausführlichen Beispiel, in dem Deadlocks explizit überprüft
und behandelt werden, aufzeigen.
Puntos muertossind Verklemmungen, die in jeder Datenbank auftreten können, sobald
mehr als ein Benutzer auf die gleichen Daten zugreift. Los puntos muertos se producen en
Abschn.8.5 ausführlich behandelt. Im Deadlockfall debe tener en cuenta eine der betroffenen
Transaktionen zurückgesetzt werden. También debemos ser superados en Fehlerfall, ob ein
Deadlock vorliegt y entsprechend reagieren.
Dies zeigen wir an einem Anwendungsbeispiel, wo wir auf die Kundenrelation der Bike-
Datenbank zugreifen. Soy atributoSperrela relaciónKundekann der Bike-Händler
Sperrvermerke zu Kunden eintragen. Wir lana dieses AttributSperrean dieser Stelle verwenden,
um durch geschicktes oder besser absichtlich ungeschicktes Setzen Deadlocks zu provozieren.
Estas acciones se incluyen en la fecha.transacción1.phpvor. Dort definieren wir neben drei
Kundenspalten die weiteren SpaltenKunde1yKunde2, las joyas de los botones de radio están
activadas. Una captura de pantalla se ve en Abb.6.6. Haga clic en el botón „Angaben
übernehmen“No quiero morir Dateitransacción2.phpaufgerufen, in der bei den beiden
angeklickten Kunden die Sperren um den Wert 1 hochgezählt werden.
Starten wir jetzt in einem weiteren Browserfenster die gleiche Anwendung nochmals, y
clicken wir in der SpalteKunde1in die zweite Zeile und in der SpalteKunde2in die erste
Zeile, also sozusagen gegenüber der ersten Anwendung über Kreuz, so kann ein
Deadlock eintreten. Wir verweisen zu Deadlocks nochmals auf Abschn.8.5, möchten
dieses Problem aber trotzdem kurz erklären:
Bei jedem Schreibvorgang wird ein exclusiver Lock auf die entsprechende Zeile
gesetzt. Otras transacciones pueden realizarse en este lugar para realizar transacciones,
ni más ni menos que usar y usar el cable Freigabe des Locks. Im ungünstigsten Fall kann
nun Folgendes eintreten:

Anwendung 1 ändert das Sperrattribut von Kunde 5 (siehe Abb.6.8).


Anwendung 2 ändert das Sperrattribut von Kunde 1.
Anwendung 1 will das Sperrattribut von Kunde 1 ändern und wartet.
Anwendung 2 will das Sperrattribut von Kunde 5 ändern und wartet.
222 6 Programación del banco de datos PHP

Tejido. 6.8Setzen von dos


Kundensperren

Beide Anwendungen warten gegenseitig auf die Freigabe eines Locks. Pretendemos un
punto muerto. Dieses Beispiel erinnert uns an Grimms Märchen. In einer Abwandlung könnten
wir sagen: „Und wenn sie nicht gestorben sind, dann warten sie noch heute.“
Glücklicherweise wird dieses Szenario kaum auftreten. Erst nach Hunderten von
Versuchen werden wir es schaffen, dass diese beiden Anwendungen so gleichzeitig
ablaufen, dass die Verklemmung auch eintritt. Naturalmente, se reducirá el riesgo de que
se produzcan bloqueos y se provocará un punto muerto. Gleichzeitig wollen wir aber
auch erkennen, was im Einzelnen geschieht. Unsere Dateitransacción2.phphat daher
folgenden Aufbau:

- Ändern des Sperrattributs des ersten Kunden


- Ausgabe aller Kundendaten zur Kontrolle
- Warten von 10 segundos
- Ändern des zweiten Kunden
- Ausgabe aller Kundendaten zur Kontrolle

Durch das Warten von mehreren Sekunden haben wir genügend Zeit, die zweite
Anwendung zu starten. Jetzt ist es ein Leichtes, einen Deadlock durch das oben beschriebene
„Überkreuz“-Anklicken zu provozieren.
Inhaltlich enthält die Dateitransacción2.phpnur wenig Neues. Das Ausgeben von
gelesenen Daten kennen wir bereits. Auch der verwendete Update-Befehl es einfach:

$sql = "Actualizar Kunde


Establecer Sperre = Sperre + 1
Donde Nr = $_POST[Kunde1]";
$stmt = $conn->query($sql); // Ausfuehren des SQL-Befehls
6.4 Komplexere Datenbankzugriffe 223

Neu ist das Warten von 10 Seconds. El código mencionado anteriormente:

ob_flush();//leer el Puffer en el servidor


enjuagar(); //erzwingt in der Regel die lokale Ausgabe im Browser sleep(10); //verdura
10 segundos

Las funciones de descarga se activan automáticamente cuando todas las fechas se


actualizan en el navegador. Estas dos funciones duran 10 segundos para leer la imagen.
Wir sind allerdings auf die Einstellungen im Webserver angewiesen. Un servidor puede
mejorar la configuración mediante configuración exclusivaob_flushignorar.
Todos los bancos de datos modernos utilizan un Deadlockerkennung. En
cualquiera de las dos opciones se actualizará en dos ocasiones con el Sqlstate-Wert
40001 actualizado. El programa se activará en el Catch-Block. Wie wir in Abschn.8.5
sehen werden, gibt es nur eine sinnvolle Reaktion: Wir führen einen Rollback durch e
starten die Transaktion neu.
Mit dem Rollback wird das bereits durchgeführte erste Update zurückgesetzt, und
die bisher belegten Sperren werden freigegeben. Die zweite Anwendung kann jetzt
ohne Verzögerung ihre Transaktion vollenden und dann ihre Sperren ebenfalls
freigeben. Es bietet sich daher an, die zurückgesetzte Transaktion zu wiederholen.
Esta es una técnica que no es fácil de usar, ya que el Try-Block no es fácil de usar.
Aquí puede encontrar una solución de Try-Catch-Blöcken an. Betrachten wir dazu
Abb.6.9. En un inicio de sesión Try-Block habrá un objeto PDO. En un interior, Try-
Block se abre en el banco de datos. En este caso, el Catch-Block interno no se
activará. Liegt tatsächlich ein Deadlock vor, setzen wir die Transaktion zurück,
beenden den Catch-Block, springen zurück an den Anfang des Try-Blocks y
wiederholen damit die Transaktion. Bei other Fehlern leiten wir weiter zur
allgemeinen Fehlerbehandlung im äußeren Catch-Block. Los bloques Try-Blocks se
implementan con un interruptor While. Wir sollten dabei die maximale Anzahl der
Schleifendurchläufe begrenzen, um grundsätzlich Endlosschleifen zu vermeiden.

Der Code hat dann folgenden Aufbau:

intentar

f $conexión = nuevo PDO(...); // registrar


$versuch = 0; // Erster Versuch
mientras ($versuch < 2) f $ // Aquí: maximal 2 Versuche // Erster
versuch++; Versuch!
intentar

f $conexión->beginTransaction(); // Se inicia la transacción


// Zugriff1
dormir(10); // 10 segundos de advertencia
// Zugrifo 2
$conn->commit(); // Transacción realizada
224 6 Programación del banco de datos PHP

intentar {

// iniciar sesión (nueva DOP…)

intentar {

Fehler

captura (PDOException $e) { } Punto muerto

hijo
}

atrapar (…) {

}
atrapar (…) { …

Tejido. 6.9Geschachtelte Try-Catch-Blöcke

romper; // erfolgreich beendet, kein Wiederholen!


gramo//terminar el intento

atraparf... gramo // interno Bloqueo de captura

gramo // fin mientras


gramo // fin intentar
atraparf... g // Bloqueo de captura adicional

Im Falle eines Deadlocks sollte die Fehlervariableestadosqlgemäß SQL-Norm den Wert


40001enthalten. En PDO wird stattdessen von Oracle-Datenbanken der WertHY000
zurückgeliefert, und das nicht nur bei Deadlocks. No hemos tenido que usar Wahl y
debemos usar el Wert 60 por encima del Wert específico de Oracle Internen Deadlock.
Unsere Fehlerbehandlung ist daher komplexer als gewünscht:

captura (PDOException $e)F


$código = $e->getCode();
si ($código == "HY000") // ¡Problema en Oracle!
$código = $e->errorInfo[1] ;
if ( $anzahl <= 1 y ($code == "40001" o $code == 60) ) F
echo "¡Problema de sincronización! Es wird ",
"Nochmals gestartet." ;
$conexión->rollback() ; // wichtig !
gramodemás

tirar $e; // Fehler weiterreichen


gramo
6.5 Arbeitenmit großen Binärdaten 225

Im Falle des Sqlstate-WertesHY000übernehmen wir den internen Datenbank-Code y


überprüfen dann auf Deadlock (40001bzw.60). En unserer Beispielanwendung wollen wir die
Transaktion im Deadlock-Fall genau einmal wiederholen. Ist der Schleifenzähler $anzahlkleiner
gleich 1, setzen wir die Transaktion mittels der MethodeRetrocederzurück. Dank der Schleife
erfolgt die Wiederholung der Transaktion automatisch. Ist der Schleifenzähler größer 1, reichen
wir die Fehlermeldung mittels des Operadorestirarweiter an die übergeordnete
Fehlerbehandlung. Wir verlassen damit auch den äußeren Try-Block y folglich auch die Schleife.
Guarida en Abb.6.9angegebenen Rücksprung haben wir intern also mit einer Schleife gelöst,
den Vorwärtssprung mit dem Operadortirar.
Cuando lo haga, tendremos una transacción en Fehlerfall con una reversión. Nur so kann
eine Verklemmung aufgelöst werden. Las dos transacciones involucradas pueden continuar, ya
que las cerraduras dañadas no se pueden desbloquear.
Wir sehen weiter, dass wir es vermeiden konnten, Fehlercodes mehrfach zu schreiben. Estoy
internamente Try-Catch-Block wurden nur die local Fehler behandelt, alle allgemeinen Fehler
werden nach außen weitergeleitet, wo diese zentral behandelt werden.

I consejo¡Nicht nur Datenbanken sincroniza sich, auchBrowser! Somit können sich


die Synchronisierungsprobleme der Datenbanken and der Browser überlappen
und zu inerwarteten Ergebnissen führen.

Ganz allgemein gilt, dass ein Browser bei Verwendung von Session-Variablen ein Protokoll führt.
Este protocolo se activa mediante un bloqueo. Para solucionar estos problemas de sincronización
relacionados con este problema, podemos solucionar este problema en tres artes:

1. Wir arbeiten mit dos Wei Rechnern


2. Wir arbeiten auf einem Rechner, aber mit unterschiedlichen Browsern (por ejemplo, Firefox,
Edge o Chrome)
3. Wir schreiben an den Fang der PHP-Datei:

<?php
inicio_sesión();
sesión_write_close(); // vermeidet Sincronización del navegador
?>

Mit der funktionsesión_escritura_cerrarSe activarán los protocolos de sesión


en la caché del navegador. Y se sincronizará el navegador.

6.5 Arbeiten mit großen Binärdaten

Die Anforderungen an Datenbanken wachsen ständig. Waren es bis vor kurzem vor allem
Daten in Tabellenform, die in Datenbanken abgelegt wurden, sollen heute auch
226 6 Programación del banco de datos PHP

ganze Dateien in Datenbanken aufgenommen werden. Hierbei handelt es sich meist um


umfangreiche Texte, ja ganze Bücher oder um Binärdateien wie binär codierte Dokumente
(PDF-Dateien, Worddateien usw.), Bilder, Music- oder Filmdateien.
Bis vor wenigen Jahren wurden diese Dateien meist separat gespeichert. In der Datenbank
wurden lediglich Verweise auf diese Dateien gesetzt. Dies entspricht heute nicht mehr den
Sicherheitsanforderungen an sensate Daten. Nur wenn diese Dateien directamente in die
Datenbank aufgenommen werden, sind sie genauso geschützt wie alle other Daten in der
Datenbank. Auch ein versehentliches Verschieben oder Löschen dieser Dateien ist dann
außerhalb der Datenbank nicht más möglich.
Da Datenbanken heute das Einlagern großer Dateien hochperformant unterstützen, spricht nichts
mehr gegen das direkte Speichern dieser Daten in Datenbanken. Para los sistemas bancarios de
datos modernos no hay ningún problema con algunas películas Blu-Ray con un tamaño de 50 GB
almacenado.
Datenbanken sprechen hier vonObjetos grandes(LOBs). Wir unterscheiden dabei dos
arten von LOB:

- Objetos binarios grandes(BLOB): Binär gespeicherte Objekte


- Personajes de objetos grandes(CLOB): Lange Zeichenketten

Los LOB funcionan directamente en el Datenbank abgelegt und bei Bedarf wieder
ausgelesen. Im Unterschied zuBLOBkönnenCLOBdirekt in der Datenbank durchsucht und
bearbeitet werden.
En la pestaña.6.7geben wir einen Überblick über die maximale Größe von LOBs in
Abhängigkeit einzelner Datenbankhersteller. Bei Intervallangaben hängt die tatsächliche
maximale Größe von der Konfiguration ab. SQL Server actualizado desde 2008 según el tipo de
fechaCORRIENTE DE ARCHIVOS. Damit können beliebig große Dateien des Dateisystems von
der Datenbank verwaltet werden. Die Begrenzung liegt here im NTFS-Dateisystem.
Una configuración del máximo tamaño de LOB basada en PHP para la carga alta de
datos en el servidor. Este tamaño se escribe en PHP a través del constante
subir_max_filesizebeschrieben und kann vom Administrator des Webservers individuell in
der Dateiphp.inieingestellt werden.
Wir wollen in diesem Abschnitt in das Arbeiten mit LOBs einführen. Wieder verwenden wir
PHP y PDO. Wir erweitern die RelaciónPersonalum ein Bildattribut und legen darin Fotos der
einzelnen Mitarbeiter ab. El sector con LOB y BLOB es absolutamente herstellerabhängig.
Estamos aquí con Oracle arbeiten, aber immer también Hinweise zu SQL

Pestaña. 6.7Erlaubte Speichergröße von LOB

Máx. Un gran BLOB Máx. Gran CLOB


Oráculo 8 – 128 TB 8 – 128 TB
servidor SQL 2 GB (Imagen) 1 – 2GB
mysql 4 GB (LOB LARGO) 4 GB (TEXTO LARGO)
6.5 Arbeitenmit großen Binärdaten 227

Servidor y MySQL conectados. Wieder können alle hier vorgestellten PHP-Programme


heruntergeladen werden, siehe Anhang. Este programa PHP es compatible con Oracle,
SQL Server y MySQL.

6.5.1 Verificación de tipos de datos BLOB

Bevor wir binäre Daten ineine relacionale Datenbank aufnehmen können, müssen wir die
Relationen entsprechend erweitern. In unserem Beipiel fügen wir in der RelationPersonalzwei
weitere Attribute hinzu: ein Attributimagenpor tipo de fechaGOTAy un atributo Tipo de imagen
también Zeichenkette. Soy atributoTipo de imagenspeichern wir das Grafikformat, z. B. jpeg, gif
o png. Die beiden dazu erforderlichen Alter-Table-Befehle lauten:

ALTERAR MESA Personal


AGREGAR imagen GOTA Por defecto VACÍO_BLOB() ;
ALTERAR MESA Personal
AGREGAR Tipo de imagen CARACTERÍSTICA(40) ;

La primera vez que Alter-Table-Befehl funciona con un Blob-Attribut. Oracle unterscheidet


zwischen drei Zuständen: Der Eintrag ist entweder Null oder belegt aber leer oder mit einem
Inhalt gefüllt. Zum einfacheren Arbeiten wird daher für Oracle empfohlen, standardmäßig
einen leeren Inhalt zu definieren. Dies ist mit der OptionPor defectoMöglich und befreit vor den
häufigen Abfragen auf Nullwerte. En MySQL y SQL Server no existe esta versión estándar para
LOB. Wir lassen daher dort this Default-Option weg. Außerdem sollte en MySQL en lugar de
tipos de datosGotael tipogota largaverwendet werden, der wesentlich größere Daten
aufnehmen kann. En SQL Server gibt es el tipo de fechaGotanicht. Wir verwenden dort
stattdessenvarbinario(máximo).

6.5.2 Speichern von Binärdaten en un banco de datos

Nach dem Erweitern der RelationPersonalWollen wir dort die Passfotos der einzelnen
Mitarbeiter ablegen. Para escribir una imagen en un banco de datos, debe estar
conectada al servidor web. Podemos incluir imágenes en el servidor, colocarlas en el
servidor, o podemos usar imágenes en el servidor. Beide Varianten möchten wir
vorstellen. Estoy siguiendo un programa PHPblob_ein1.php, das auf dem Server im
Unterverzeichnisimagengespeicherte Bilder zur Auswahl anbietet. Alternativamente,
puede usar imágenes en el PC local y usarlas con alta carga. Das dazugehörige
Formular lautet:

<formulario acción="blob_ein2.php" método = "publicar"


enctype="multipart/form-data">
228 6 Programación del banco de datos PHP

<p>Bildauswahl en el servidor:
<tipo de entrada="radio" nombre = "Auswahl" valor="Servidor" marcado/>
<seleccionar
nombre = "Imagen" tamaño = "6">
<?php
$directorio = "./imagen"; // Unterverzeichnis
si (is_dir($dir)) F // "imagen" ¿Verzeichnis existe?
si ($filearray = scandir($dir))F
// Inhalt des Verzeichnisses en $filearray ablegen foreach ($filearray
as $name)F
// todas las fechas eliminadas if (!
is_dir($name))
// nur Dateien, keine Verzeichnisse // in Select
Box aufnehmen
eco "<opción> $nombre </opción>";
ggg

?>
</seleccionar> </p>
<p>Fecha de descarga de PC:
<tipo de entrada="radio" nombre = "Auswahl" valor="Lokal"/> <tipo
de entrada="archivo" nombre = "Bilddatei" tamaño = "60"
aceptar="imagen/*"/></p>
<p> <entrada tipo = "Enviar"
value="Ausgewähltes Bild anzeigen"/></p>
</formulario>

Formatieren wir dieses Formular noch geschickt mit Hilfe einer Tabelle, so erhalten wir eine
Formularausgabe wie in Abb.6.10. El código de programa contiene una configuración
específica: la etiqueta del formulario se encuentra con el parámetroenctipo. Wir benötigen
diesen zur Auswahl von Dateien. Zum Anzeigen von Verzeichnisinhalten benötigen wir dos
weitere PHP-Funktionen: La funciónes_dirliefert den wertverdaderozurück, wenn das
angegebene Unterverzeichnis existiert. La funciónescaneardurchsucht das betreffende
Verzeichnis und liefert alle dort enthaltenen Dateien in einem Feld zurück. En un Schleife
übertragen wir dann todos estos datos en el campo en el cuadro de selección. Da das
Verzeichnisimagen Unterverzeichnisse enthalten kann, werden diese noch aussortiert.
Hay dos partes de programas cargados con una información actualizada de la PC en el
servidor. Wir verwenden dazu den Formulartypfile. Dabei geben wir im Parámetroaceptaran,
dass wir nur Bilddateien auswählen möchten (aceptar= "imagen/*"). Mit Hilfe eines Radio-
Buttons entscheiden wir, ob wir una fecha en el servidor o una fecha en el buscador local
verwenden wollen.
Haga clic en el botónAusgewähltes Imagen anzeigengelangen wir zum Programa
bild_ein2.php. In der Praxis sollten wir hier alle Mitarbeiternamen aus der Datenbank einlesen
und in einem Select-Feld aufbereitet ausgeben. Dies sei auch als Übung empfohlen.
6.5 Arbeitenmit großen Binärdaten 229

Tejido. 6.10Fórmula para Bildauswahl

Heer fordern wir einfachheitshalber nur zur Eingabe un Personalnummer auf. Zusätzlich wird
zur Kontrolle das ausgewählte Bild angezeigt (siehe Abb.6.11).
Dateien werden nicht mit der VariablepsCORREOausgelesen, sondern mit der Variable
$_FILES. Esta variable está basada en asociaciones asociativas Werte zur Verfügung (der Name
des Dateiformulars warBilddatei):

$_FILES[’Bilddatei’][’nombre’] // Nombre de la fecha // Tipo


de fecha de la fecha
$_FILES[’Bilddatei’][’tipo’] $_FILES[’Bilddatei’]
[’tmp_name’]
// temperatura interna. Nombre en Subir //
$_FILES[’Bilddatei’][’tamaño’] Größe der Datei

Tejido. 6.11Formular zur Eingabe der Personalnummer


230 6 Programación del banco de datos PHP

Lo que es, PHP tiene una fecha en el servidor inmerso en el mismonombre_tmp


angegebene Datei ablegt. Wollen wir this Bild dauerhaft auf dem Server speichern, so
müssen wir this temporäre Datei in eine Datei unserer Wahl kopieren. Dazu steht en PHP
la funciónCopiarzur Verfügung. Wir kopieren das temporäre Bild in das Verzeichnis Subir
bajo el nombre original:

copiar( $_FILES['Bilddatei']['tmp_name'] ,
'./subir/' . $_FILES[’Bilddatei’][’nombre’] );

Al hacer clic en el otro botón se accederá al programa PHPbild_ein3.phpaufgerufen. Aquí se


eliminarán los datos del banco de datos y la imagen abgelegt. Der Code zum Einfügen eines
Bildes und des Bildtyps in die RelationPersonalLautet Dazu:

$sql = "Actualizar conjunto personal Bildtyp = ?, Bild = EMPTY_BLOB( )


Donde Persnr = $_POST[Persnr]
¿Volviendo a Bild en ?" ; $conn-
$stmt = >preparar($sql);
$fp = fopen( $_SESSION['Bild'], 'rb' ); $stmt->bindParam( 1,
$_SESSION[’Bildtyp’] ); $stmt->bindParam( 2, $fp,
PDO::PARAM_LOB ) ; $stmt->ejecutar(
);
fclose($fp);

Los LOB no pueden utilizarse directamente con el método de consulta. Es necesario


que las fechas se realicen con el método de preparación activado y luego con el método
de ejecución activado. Dieses Aufsplitten der Query-Methode in dos Befehle haben wir
bereits in Abschn.6.4.4behandelt. En unserem SQL-Befehl haben wir dos Fragezeichen
verwendet. Necesitamos agregar también dos métodos BindParam, para lograr estas
fracciones con la variablepsSESIÓN['Bildtyp']ypsfpzu verbinden.
Damit die Bilddatei in die Datenbank transportiert werden kann, muss sie binär zum
Lesen geöffnet werden (Parameterwertrb=leer binario). Zuletzt wird die Datei wieder
geschlossen. Veremos las funciones PHP junto con ellasabrirycerrar. Die Datenbank
muss explízit wissen, dass ein LOB übertragen wird. Dies ist der Grund, warum wir die
MethodevincularParamverwenden müssen. Im dortigen zweiten Parameter übergeben
wir den Dateizeiger der geöffneten Datei und im dritten Parameter die Konstante
PDO::PARAM_LOB. Entonces teilen wir der Datenbank mit, dass ein LOB vorliegt.
Si no lo haces, no usarás ningún atributo en Oracleimagenmit einem Fragezeichen versehen
können. Stattdessen müssen wir dieses Attribut mit Hilfe der Funktion Blob_vacíovorbelegen
und zusätzlich die AngabeRegresando a Spaltehinzufügen. Está integrado en MySQL y SQL
Server. En SQL Server, debemos incluir todas las palabras explícitas en la funciónConvertiren la
guarida Tipo de fechavarbinario(máximo)überführen.
Schließen wir jetzt unser Programm mit dem Commit-Befehl ab, so ist es uns mit
vertretbarem Aufwand gelungen, Binärdateien direkt in einer Datenbank zu speichern.
6.5 Arbeitenmit großen Binärdaten 231

Dabei darf eine einzelne Binärdatei Hunderte von Megabyte groß sein, in Oracle sogar
viele Terabyte! Allerdings müssen wir beachten, dass in PHP the Konstante
subir_max_filesizeentsprechend groß eingestellt wird. Im nächsten Abschnitt wollen wir
nun zeigen, wie wir die Früchte unserer Arbeit auch sehen können. Wir werden die
Bilddaten wieder auslesen.

6.5.3 Auslesen von Binärdaten aus un Datenbank

Datenbanken sind zeichenorientiert. Strukturierte Daten lassen sich daher ganz einfach mit
einem Select-Befehl auslesen, nicht jedoch Binärdaten. Wir können allerdings sehr einfach die
Größe der hinderlegten Binärdatei ermitteln. Es stehen dazu je nach Datenbank folgende
Funktionen zur Verfügung:

- Dbms_Lob.Getlength(Binärdatei)en oráculo
- Longitud de datos(Binärdatei)en servidor SQL
- Longitud(Binärdatei)en mysql

Estas funciones no funcionan correctamente, sin importar las imágenes. Wir


erweitern dazu das bereits in Abschn.6.3.5programa besprochenemitarbeiter.php.
Soy nuevo programamitarbeiterblob.phpzeigen wir zusätzlich die Bilder der
Mitarbeiter im Browser an. Wir ändern en Oracle en el programamitarbeiter.php
verwendeten Select-Befehl ab en:

$sql = "Seleccionar Persnr, Nombre, Ort, Gebdatum, Gehalt, Vorgesetzt,


Dbms_Lob.Getlength(Bild) Como Bildlaenge
De Personal
Donde Upper(Name) Like Upper( '%$Name%' ) " ;

Aquí podemos aprender a usar el método OracleObtener longitud, um entscheiden zu


können, ob Bilddaten vorliegen. Die Ausgabe erfolgt völlig analog zum bereits
behandelten Programmmitarbeiter.phpen un Schleife Do-While. Hinzu kommt am Ende
der Test auf die Bildlänge:

hacerF

?><tr>
<td> <?php echo $fila["PERSNR"]; ?> </td> <td> <?php echo
$fila["NOMBRE"]; ?> </td> <td> <?php echo $fila["ORT"]; ?> </td>
<td> <?php echo $fila["GEBDATUM"]; ?> </td> <td> <?php echo
($fila["GEHALT"]==null)? "(nulo)":

$fila["GEHALT"]; ?> </td>


<td> <?php echo ($fila["VORGESETZT"] == nulo)?
232 6 Programación del banco de datos PHP

"Ja": "Nein";?></td>
<?php
si ($fila["BILDLENGE"] > 0) //cae Imagen disponible
eco "<td> <img src=\"bild.php?id=$row[PERSNR]\"/> </td>";
demás

eco "<td> <p>- no hay imagen -</p> </td>"; eco "</


tr>";
gramomientras ( $fila = $stmt->fetch() ); ?>

In der If-Anweisung überprüfen wir, ob im Attribut Daten vorhanden sind. Wenn ja, so
geben wir das Bild aus, sonst wird „– no hay imagen –“ angezeigt. Para abrir una imagen
existente en HTML como etiqueta de imagenimagen. En esta etiqueta se utiliza el parámetrosrc
die Bildquelle übergeben. Wir haben zwar ein Bild vorliegen, aber es steht binär in einer
Datenbank. Wir müssen diese Binärdaten daher selbst auslesen. Wir verwenden dazu the PHP-
Dateiimagen.php. Estas fechas PHP deben incluirse en la imagen de los Mitarbeiters kennen.
Soltamos este problema con un Get-Parameters de Hilfe y no tenemos la fecha mitgeben.
Möchten wir beispielsweise das Foto von Mitarbeiter 2 ausgeben, so würde unsere Quelldatei
lauten:

src= "bild.php?id=2"

La nueva versión de la fecha PHPimagen.phpist es, das richtige Bild aus der Datenbank zu
Holen:

<?php
inicio_sesión();
$conn = nuevo PDO("oci:dbname=$_SESSION[Datenbank],
$_SESSION['Kennung'],
$_SESSION['Contraseña']); "Seleccione
$sql = Imagen, Tipo de Imagen de Personal
Donde Persnr = $_GET[id]"; //¡¡¡Obtener-Variable!!!
$stmt = $conexión->query($sql); //Ausfuehren
$stmt->bindColumn(1, $blob, PDO::PARAM_LOB); //BLOB: Spalte 1 $stmt-
>bindColumn(2, $bildtyp); //Tipo de imagen: Spalte 2
$stmt->fetch(PDO::FETCH_BOUND); //bindet Spalten una variable //
header("Tipo de contenido: $bildtyp"); Uebergabe des Tipos de imágenes

fpassthru($blob); //Uebergabe des Imágenes

?>

Dies ist das vollständige Programmimagen.php, zugeschnitten auf Oracle. Nosotros iniciamos
sesión en el Datenbank ein y lesen das Bild und den Bildtyp des angegebenen Mitarbeiters ein. Wir
hatten der Get-Variable bei der Übergabe den NamenidentificaciónGegeben. Somit lesen wir den
Wert aus der VariablepsOBTENER ['id']aus. Beim Auslesen der Binärdaten stoßen wir auf die gleichen
Probleme wie beim Abspeichern in die Datenbank: Wir müssen der
6.6 Fassammenfassung 233

Datenbank mitteilen, dass wir Binärdaten lessen wollen. Das Gegenstück zu der Methode
vincularParambeim Abspeichern ist beim Auslesen die MethodeEnlazarColumna. El
primer parámetro da el Spalte im Select-Befehl an, der dos variables, wohin die Ausgabe
gespeichert werden soll. Si se escriben parámetros, se deben utilizar constantemente los
datos binariosPDO::PARAM_LOBverwenden.
Wird in der Fetch-Methode die KonstanteDOP::FETCH_BOUNDangegeben, so speichert diese
Methode die eingelesene Zeile nicht in einem Feld, sondern in den durch die Methode
EnlazarColumnaangegebenen Variablen. El tipo de datos binarios se incluye en el encabezado
de la función PHPEncabezamientoübergeben, und zuletzt werden die Binärdaten direkt mit
der FunktionFpassthruausgegeben.

I Ein PHP-Programm, das Binärdaten ausliest, darf keine zusätzlichen Ausgaben


enthalten, auch nicht die HTML-Tags<html></html>!

En MySQL utilizamos la funciónfpassthrunicht. Stattdessen geben wir die


Binärdaten miteco $blobaus. En Oracle utilizamos la función PHPFpassthruNo se
recomienda que aquí se utilice el método de recuperación de datos para que no se
utilicen datos. Die Unterschiede zwischen den einzelnen Datenbankherstellern bei
Binärdaten sind nicht wirklich groß, aber doch markant. Im Detail müssen wir daher
an einigen Stellen unterschiedlich programmieren. Empfehlen dazu insbesondere
the Manuale der Datenbankhersteller, aber auch the Homepage von PHP:www.php.
neto.
La portabilidad de programas PHP en MySQL y SQL Server no está disponible.
Este programa debe ser descargado para descargarlo (siempre que lo desee) y
también para MySQL y SQL Server.
Damit haben wir einen ersten Einblick in das Arbeiten mit Binärdaten in Datenbanken
erhalten. Auf die hier vorgestellte Weise können beispielsweise auch MP3-Dateien oder ganze
Videos gespeichert werden. Wir hoffen, hier erste Anregungen gegeben zu haben.

6.6 Fassammenfassung

Este Kapitel führte in das Programmieren mit Datenbanken ein. Usamos PHP para usar de
forma flexible los bancos de datos. Der Endanwender benötigt nur einen Browser y eine
Internetverbindung. Hemos incluido PHP-Schnittstelle zu den Datenbanken die
Abstraktionsschicht PDO gewählt. Damit ist das Programmieren bis auf wenige
Ausnahmen unabhängig von der Datenbank. Die kleinen Unterschiede zwischen den
Herstellern müssen allerdings berücksichtigt werden. Nosotros lo explicamos en la
pestaña.6.8 hin. Asegúrese de que la programación de los bancos de datos vigentes sea
válida con PDO zusammen. Auch die Besonderheiten der einzelnen Hersteller bei den
DML-Befehlen, die in Tab.4.14aufgelistet wurden, sollten beachtet werden.
234 6 Programación del banco de datos PHP

Pestaña. 6.8 Regeln zur datenbankunabhängigen Programmierung

zu beachten wegen
PDO::ATTR_CASE en PDO::CASE_UPPER configurado Oráculo
Kein Semikolon am Befehlsende Oráculo
Me uno a nur den Operador ON verwenden servidor SQL
In der From-Klausel auf den Bezeichner AS verzichten Oráculo
Kein Leerzeichen nach una función de agregación mysql
Unión exterior completa Kein mysql

Wir haben gelernt, auf Datenbanken von einer Programmiersprache aus zuzugreifen.
Además, hemos implementado transacciones complejas y activadas en Deadlockfehler
reagiert. Habremos dado los Fehlercodes deestadosqlkenn gelernt. Ebenso haben wir
gesehen, wie wir in einer Schleife ganze Relationen lesen können, indem ein Cursor auf
eine Relation Zeile für Zeile zugreift.
Die Abstraktionsschicht DOP setzt sich aus nur drei Klassen zusammen:

- claseDOP: zur Verwaltung der Datenbankverbindung


- claseDeclaración PDO: zur Bearbeitung eingelesener Daten
- clasePDOExcepción: zur Fehlerbehandlung

Die in diesem Kapitel verwendeten PDO- und PDOStatement-Methoden wiren tab.6.9


zusammengefasst. Die Methoden und Eigenschaften der FehlerklassePDOExcepciónfi
nden wir en la pestaña.6.4.
Zuletzt haben wir uns mit binären Daten beschäftigt und Bilder in der Datenbank
gespeichert und wieder ausgelesen. Hemos utilizado más funciones PHP. Esta
primera función está en la pestaña Tab.6.2Angegeben, el resto de este capítulo
utiliza funciones PHP en la pestaña.6.10zusammengefasst.

Pestaña. 6.9Methoden der Abstraktionsschicht DOP

método clase Libro de textos kurzbeschreibung

Constructor DOP() DOP baut Verbindung zur Datenbank auf


Establecer atributo() DOP setzt Attribute einer Verbindung
Iniciar transacción() DOP iniciar una transacción
Comprometerse() DOP beendet una transacción
Retroceder() DOP establecer una transacción hacia el otro lado

Consulta() DOP führt einen SQL-Befehl aus


Preparar() DOP bereitet eine Abfrage vor
Ejecutar() EstadoPDO. führt eine vorbereitete Abfrage aus
Buscar() EstadoPDO. liest die nächste Zeile
Número de filas() EstadoPDO. gibt Anzahl manipulador Zeilen aus
vincularParam() EstadoPDO. bindet Parámetro y una apertura
VincularColumna() EstadoPDO. verbindet Spalten mit Variablen
6.7 Übungsaufgaben 235

Pestaña. 6.10Otras funciones PHP

copiar(archivo1, archivo2) Kopiert Dateiarchivo1en el Dateiarchivo2


öffnet Fechaiarchivocon la cuerdacadena
fopen(archivo,cadena) angegebenen Methode und liefert einen Dateizeiger
zurück
cerrar(fp) schließt Datei, auf die der Dateizeigerfpverweist
encabezado (cadena) gibt den im Stringcadenaencabezado angegebenen
fpassthru(blob) gibt das Binärobjekt aus, auf dengotaverweist
regaloverdaderozurück, caídascadenaein Verzeichnis ist,
is_dir(cadena)
sonstFALSO
liefert alle Dateinamen des Verzeichnissescadenain
scandir(cadena)
einem Feld zurück
inicio_sesión() erster Befehl einer Sesión-Seite
schreibt kein Session-Protokoll und vermeidet
sesión_escritura_cerrar()
dadurch Synchronisierung der Browser
ob_flush() gibt Inhalt auf dem Webserver sofort aus
enjuagar() gibt Inhalt im localen Browser sofort aus
dormir (seg) verrugas parasegundosegundos

6.7 Übungsaufgaben

Aufgaben
Die meisten der folgenden Aufgaben beziehen sich auf die Relationen der
BeispieldatenbankBicicletaanexo.

1. Seleccione una página HTML y agregue más fórmulas (Eingabefeld,


Checkbuttons, Radiobuttons). Al hacer clic en el botón Enviar, se abren
estas fechas y se abren tabellarisch. Verwenden Sie die Methodecorreo.
2. Seleccione un programa PHP, un número personal y una fecha para este
Mitarbeiter ausgibt. Existiert dieser Mitarbeiter nicht, so erfolgt eine
entsprechende Information.
3. Inserte 2 botones en cada uno de los números personales disponibles en
un cuadro combinado. Nach Auswahl einer dieser Nummern werden
dann Daten dieses Mitarbeiters ausgegeben.
4. Fügen Sie neues Personal hinzu. Los números personales se eliminan
automáticamente.
5. Geben Sie alle Kunden und Lieferanten zusammen in Alphabetischer Reihenfolge
aus. Die Ausgabe habeexacto Forma folgende (¡incluido der Aufzählung und der
Klammern!).
1.Biker Ecke (Kunde)
2.Tienda Fahrrad (Kunde)
3.Fahrräder Hammerl (Kunde)
4.Firma Gerti Schmidtner (Lieferant) usw.
236 6 Programación del banco de datos PHP

6. Eine neue Lieferung eines Lieferanten ist eingetroffen. Schreiben Sie un programa,
das zunächst alle Lieferanten en un Combobox auflistet. Nach Auswahl eines
Lieferanten werden alle Artikel (ANr,Bezeichnung,Masa,Einheit), dieser Lieferant
liefert, angezeigt. In einer zusätzlichen Eingabespalte wird zu jedem Artikel die
Anzahl der Lieferungen angegeben. Das Programm erhöht dementsprechend den
Bestand in der Relationcerveza dorada.
Da mehrere Daten geändert werden, können Verklemmungen eintreten. In
diesem Fall werden alle Änderungen zurückgesetzt und bis zu zweimal
wiederholt. Pruebe estos ajustes durante dos pasos paralelos y, de forma
independiente, los ajustes se realizarán durante 3 segundos. Con un botón
de radio se activará, ob el artículo absteigend oder aufsteigend im Lager
geändert werden, um Deadlocks provozieren zu können.
7. Fügen Sie neues Personal hinzu. Zusätzlich zu Aufgabe 4 wird ein Bild angefordert.
Personaldaten und Bild werden mit einem einzigenInsertar enBefehl eingefügt.

8. Erweitern Sie die Dateiblob_ein2.php, indem statt der Eingabe un Personalnummer ein
Mitarbeiter aus un Select-Box ausgewählt werden muss. Este cuadro de selección
contiene todos los cambios relacionados con la relación personal.
9.(como Anregung)Der Fantasie sind keine Grenzen gesetzt: Als kleine Anregung wäre
es denkbar, alle Artikel mit Bildern zu versehen. Podemos crear una pequeña
tienda web, donde los artículos con imágenes, precios y descripciones se
modifican.

Literatura

Adams, R. (2012).SQL – Eine Einführung mit vertiefenden Exkursen. Hanser.


Fecha, C. J., &Amp; Darwen, H. (1998).SQL – El estándar. Addison-Wesley.
Dewson, R. (2012).Inicio de SQL Server 2012 para desarrolladores. Presione.
Doyle, M. (2010).A partir de PHP 5.3. Wiley.
Faeskorn-Woyke, H., Bertelsmeier, B., Riemer, P., & Bauer, E. (2007).Datenbanksysteme – Teoría
y Praxis con SQL2003, Oracle y MySQL. Pearson.
Gilmore, JW, & Bryla, B. (2007).Comenzando con PHP y Oracle. Presione. Gulutzan, P.,
& Pelzer, T. (1999).SQL-99 completo – De verdad. Libros de I + D. Gulutzan, P., &
Pelzer, T. (2002).Ajuste del rendimiento de SQL. Addison-Wesley. http://
wiki.selfhtml.de. http://www.php.net.

PDO_MSSQLServer.pdfhttps://www.phparch.com/wp-content/uploads/2010/11/PDO__
MSSQLServer.pdf.
Jones, C., & Holloway, A. (2012).El manual subterráneo de PHP y Oracle. Oráculo.
Kähler, W.-M. (2008).SQL con Oracle. Vieweg-Teubner. van der Lans, RF (2007).Una
introducción a SQL. Pearson.
Literatura 237

Lecky-Thompson, E., Nowicki, S. D., & Myer, T. (2009).PHP6 profesional. Publicación Wiley.
Marsch, J., & Fritze, J. (2002).Erfolgreiche Datenbankanwendung con SQL3. Saltador. Münz, S.
(2014).Manual HTML5. Franzis.
Redmond, E., & Wilson, JR (2012).Sieben Wochen, sieben Datenbanken. O'Reilly.
Sunderraman, R. (2007).Programación Oracle10: introducción. Addison-Wesley.
Unterstein, G., & Matthiessen, M. (2012).Bancos de datos relacionales y SQL en teoría y práctica.
Saltador.
Yank, K. (2012).PHP y MySQL: principiante a ninja. Punto de sitio.
Actuación en Datenbanken
7

Supervisión
Wer hat sich nicht schon einmal darüber geärgert, wenn er am Computer langere Zeit
auf Antwort warten musste. Meist ist dies aber die Ausnahme, denn in der Regel liegt die
Ursache langer Wartezeiten nicht an der Datenbank, sondern an der schlechten
Netzverbindung. Besonders Suchmaschinen beeindrucken: Innerhalb kürzester Zeit
spucken Google, Bing, Yahoo und Co. Ergebnisse aus, obwohl die Suchmaschinen dabei
auch auf Datenbanken zugreifen. Oder wir gehen in ein Geschäft zum Einkaufen und
zücken unsere Kredit- oder Bankkarte. Nach Eingabe der Geheimzahl wird der Einkauf
schnell abgewickelt, trotz Netz- und Datenbankzugriffen.
Dass Datenbanken so kurze Antwortzeiten besitzen, ist ausgefeilten
Performance-Maßnahmen zu verdanken. Einige ganz wichtige Optimierungen
wollen wir in diesem Kapitel vorstellen. Wir sehen uns zunächst den in allen
größeren Datenbanken implementierten Optimizer an, der alle Zugriffsbefehle
überprüft and optimiert, noch bevor sie ausgeführt werden. Mit Hilfe eines vom
Optimizer generierten Ausführungsplans können wir nachvollziehen, wie ein Befehl
letztendlich ausgeführt wird.
Damit ausgerüstet, können wir gleich mit Indexen testen, wie viel diese sehr
wichtigen Strukturen leisten. Bei sehr großen Relationen bietet die Partitionierung
ebenfalls enorme Antwortzeitgewinne. In eine ganz other Richtung gehen wir mit
materialisierten Sichten. Mit normalen Sichten können wir beispielsweise komplex
Select-Befehle nachbilden. El rendimiento se reduce primero, cuando las
sensaciones también son físicas. Und genau dies tun wir mit materialisierten
Sichten.
Doch nicht immer benötigen wir materialisierte Sichten. Wir können auch versuchen,
unsere Select-Befehle directamente para optimizar. Wir widmen uns auch diesem Thema
einen Abschnitt. Neben weiteren Optimierungen spielen Stored Procedimientos eine
wichtige Rolle. Wir werden daher auch darauf eingehen.
240 7 Actuación en Datenbanken

7.1 Optimizador y plan de actualización

Die Schere zwischen Rechnergeschwindigkeit und Zugriffsgeschwindigkeit auf externe


Medien hat sich in den letzten Jahrzehnten immer weiter geöffnet. Es lohnt sich daher, un
SQL-Befehl zu analysieren y zu optimieren, bevor wir ihn ausführen. Jeder Zugriff auf die
externe Datenbank, den wir dadurch einsparen, ist ein Gewinn an Leistung und verringert
die Antwortzeit. Auch der sparsame Umgang mit dem immer knappen Arbeitsspeicher
wird dem Datenbanksystem in Summe zu Gute kommen.
Praktisch alle Datenbanksysteme nutzen heute diese Optimierungsmöglichkeiten
vollautomatisch. Genau genommen durchläuft ein SQL-Befehl mehrere Phasen, bevor er
ausgeführt wird. Einen guten Überblick über diese einzelnen Schritte gibt Abb.7.1.
Una función SQL se verá afectada por un analizador en una corrección sintáctica. In
diesem Schritt werden die verwendeten Relationen- und Attributnamen auch mit den
tatsächlichen in der Datenbank verglichen. Ist der Befehl korrekt, así que wird dieser an
denOptimizador übergeben. Este optimizador se activará para optimizar la función SQL.
Es gibt dabei dos wichtige Optimiermöglichkeiten:

- Optimización de la base de costos


- Optimización de la base reglamentaria

Ein regelbasierter Optimierer geht immer nach vordefinierten Regeln vor. Estas reglas se
basan en el álgebra relacional y también en las técnicas de aprendizaje. Wichtige Regeln sind
beispielsweise:

- Verwende einen Index, falls vorhanden (siehe auch Abschn.7.2)


- Führe eine Projektion vor einem Verbund durch
- Führe eine Restriction vor einem Verbund durch
- Verwende einen Merge Join, wenn die betroffenen Relationen bereits sortiert sind

estadística

base de costos
Optimizador
SQL
SQL analizador
Generador
Regelbasierter
Optimizador

SQL
Ausführung

Tejido. 7.1Abfrageoptimierung
7.1 Optimizador y plan de actualización 241

Weitere Regeln werden wir in den folgenden Abschnitten kennen lernen, insbesondere in
Abschn.7.5. Die letzte hier aufgeführte Regel ist beispielsweise sehr speziell: Ein Merge Join ist
der Schnellste Join-Algorithmus. Estas son todas las cosas que hay que hacer, pero las
relaciones entre ellas son las mismas. Die beiden mittleren Regeln versuchen, die großen
Datenmengen, die beim Verbund von dos Relationen anfallen zu minimieren. Im Abschnitt zur
relacionalen Algebra (Abschn.2.5) Hatten wir gesehen, dass wir die Projektion und die
Restriction mit dem natürlichen Verbund vertauschen dürfen. Und mit dem Vorziehen von
Projektion und Restriktion werden die betroffenen Relationen schon vorab verkleinert, so dass
damit auch der Verbund erheblich einfacher wird. Ein anschauliches Beispiel erhalten wir bei
der Ausgabe aller Aufträge und Artikel zum Kunden 3:

Seleccionar Auftrnr, Artnr, Anzahl, Gesamtpreis Auftrag Natural


De Inner Join Auftragsposten Kundnr = 3 ;
Dónde

Der Ausführungsplan in Oracle zeigt beispielsweise (siehe Abb.7.2), dass zunächst die
Restriktion und dann erst der Join ausgeführt wird. También se incluyen los siguientes
beneficios selectos, generados y ausgeführt:

Seleccionar Auftrnr, Artnr, Anzahl, Gesamtpreis (Seleccione Auftrnr de


De Auftrag donde Kundnr = 3)
Unión interior natural Auftragsposten;

Weitere Details zu Optimierungen eines Select-Befehls zeigen wir in Abschn.7.5. Mit Hilfe
der obigen ersten Regel zu Indexen können wir directamente eine Schwäche der
regelbasierten Optimierung aufzeigen. Ein Index erlaubt den Direktzugriff auf Daten. Wir saven
dadurch eine sequentielle Suche der Daten. Greifen wir aber beispielsweise sowieso auf alle
Daten zu, so ist ein zusätzliches Lesen der Indexdaten überflüssig und kostet nur weitere Ein-
und Ausgaben. Nicht immer führen daher Regeln zu einer besseren Antwortzeit.

El optimizador basado en costos se activa según las regiones preferidas, pero se


ajustan a las condiciones reales con una. Dies setzt allerdings voraus, dass die Datenbank
umfangreiche Statistiken sammelt. Anhand estas estadísticas activan el optimizador

dann únete

primera restricción

Tejido. 7.2Ausführungsplan zu Aufträgen von Kunde 3


242 7 Actuación en Datenbanken

Grandes relaciones y pueden optimizarse. In der Praxis haven sich bei allen großen
Herstellern die kostenbasierten Optimizer durchgesetzt. Eine rein regelbasierte
Optimierung ist nur noch vereinzelt anzutreffen. El optimizador kostenbasierte tiene
en cuenta las siguientes cosas:

- Die Anzahl der Tupel je Relación


- Die Anzahl der unterschiedlichen Werte je Attribut jeder Relación
- Histogramas completos para atributos añadidos en Bedarf

Dass sich eine Datenbank die Anzahl der Tupel zu jeder Relation merkt, ist
selbstverständlich. Ahora el Optimizador no es el último clic. Esto puede variar según
el tamaño de las relaciones y optimizar su selección. Wie wir später noch sehen
werden, wird aus Performancegründen in einem Verbund in der Regel zunächst die
kleinere Relation verwendet. Diese zu ermitteln ist nun kein Problem mehr.
A menudo, aber vor dem Ausführen eines Verbunds noch Restriktionen durchgeführt. Damit
verringert sich die Anzahl der Tupel. Dies gilt ebenso für durchgeführte Gruppierungen. Auch
jetzt benötigt der Optimizer weiterhin die genaue Größe der temporären Zwischenrelationen.
Dazu benötigen wir die Anzahl der unterschiedlichen Werte der in der Restriktion verwendeten
Attribute. El pasante lässt sich jedoch mit dem Kehrwert besser arbeiten. Definiremos:

IDefinición: selectividadMorirselectividad seleines Attributs ist der Kehrwert zur Anzahl der
unterschiedlichen Werte dieses Attributs.

Beispielsweise ist die Selektivität von Primärschlüsseln immer gleich dem Kehrwert zur
Anzahl der Zeilen dieser Relation, da jeder Primärschlüsselwert eindeutig ist. Ganz anders ist
die Situation beispielsweise bei Wochentagen. Es gibt nur sieben unterschiedliche Werte.
Regalos en una relación y un atributoWochentag, así que beträgt desen Selektivität sel=0,14.

Si la selección y el ajuste de atributos únicos pueden ser eliminados por el


optimizador, nuestra relación de optimización será mayor según la duración de las
operaciones. Daher werden in Datenbanken a menudo junto a Werte zu jedem
Attribut hinderlegt.
Rein mathematisch gesehen ist es einfacher mit der Selektivität zu rechnen als mit ihrem
Kehrwert, der Anzahl der unterschiedlichen Werte. Werden beispielsweise in einer Where-
Klausel eines Select-Befehls mehrere Restriktionen durchgeführt, so lässt sich die Gesamt-
Selektivität über dos Wei AttributeAtt1yAtt2Wie folgt aus den Einzelattributen berechnen:

sel.Att1Y Att2/Dsel.Att1/*sel.Att2/
sel.Att1O Att2/Dsel.Att1/Csel.Att2/ -sel.Att1/*sel.Att2/
sel.NOT Att1/D1 -sel.Att1/
7.1 Optimizador y plan de actualización 243

Die Verwendung der Selektivität ist immer dann ausreichend, wenn die Verteilung der
unterschiedlichen Werte einigermaßen gleichverteilt ist. Auch obige Formeln gelten exakt nur
bei Gleichverteilung. Esto ist in der Praxis aber meist nicht gegeben. Beispielsweise wird an
einem Sonntag kaum etwas verkauft, die sieben Wochentage wären bei Verkaufsdaten also
sicherlich nicht gleichverteilt. Damit der Optimizer auch in diesem Fall mit möglichst korrekten
Daten rechnet, können zusätzlich Histogramme zu Attributen angelegt werden.

Wir wollen nicht verschweigen, dass das Sammeln dieser umfangreichen Statistiken sehr
aufwendig werden kann. Insbesondere bei sehr großen Relationen mit vielen Millionen Tupeln
und laufenden Änderungen muss eine Datenbank Kompromisse eingehen. Häufig werden
dann nur noch Stichproben durchgeführt und diese auf die gesamte Relation hochgerechnet.

Letztlich sind Statistiken ein hervorragendes Hilfsmittel, um den kostenbasierten


Optimizer zu unterstützen. Esto se aplicará a una configuración SQL totalmente
optimizada y, por lo tanto, también se podrá utilizar. Alle Datenbanken stellen diese
Ausführungspläne auch dem Anwender zur Verfügung. Damit lassen sich die Optimizer
kontrolieren and gegebenenfalls die Zugriffsbefehle weiter verbessern. Als
weiterführende Literatur, auch für die folgenden Abschnitte, sind insbesondere Connolly
und Begg (2015), Elmasri y Navathe (2002), Gulutzan y Pelzer (2002) y Kemper y Eickler (
2015) zu empfehlen.
Wir wollen uns im Folgenden einen Überblick über die Statistiken und
Ausführungspläne der einzelnen Datenbankhersteller verschaffen.

7.1.1 Optimización en Oracle

En Oracle se utilizan estadísticas en el sistema de tablas propias de Oracle. Wichtige


Relationen mit Statistikdaten sind zusammen mit einigen Attributen in Tab.7.1aufgeführt.
Die meisten Attribute sollten selbsterklärend sein. Die Anzahl der Tupel sind im Attribut
Núm_filasHinterlegt, die Anzahl der unterschiedlichen Attributswerte inNúm_distinto und
die Anzahl der Werte mit InhaltNuloenNúm_nulos. debajoDensidadist die Selektivität
eines Attributs abgelegt. Atributo del dadoAvg_Row_LenyAvg_Col_Lenliefern die mittlere
Länge von Tupeln und Attributen. Selbstverständlich können este atributo también en
SQL-Developer bajo las mismas tablas en el registroEstadísticasabgerufen werden.
Estas estadísticas pueden usarse con demBefehlDbms_Auto_Task_Admin.EnableLas acciones se
actualizan automáticamente. Ebenso bietet das StatistikpaketDbms_Statsmehrere Prozeduren zum
manuellen Starten an, etwa:

EJECUTAR DBMS_STATS.GATHER_TABLE_STATS('Esquema','Tabla');
EJECUTAR DBMS_STATS.GATHER_SCHEMA_STATS('Esquema');
244 7 Actuación en Datenbanken

Pestaña. 7.1 Tablas de sistema con datos estadísticos

tablas del sistema Atributo Wichtige


Nombre_tabla, Núm_filas,
TABLAS_USUARIOS
Avg_Row_Len
Nombre_tabla, Núm_filas,
USER_TAB_STATISTICS
Avg_Row_Len
Nombre_tabla, Nombre_columna,
USER_TAB_COLUMNS Num_Distinct, Densidad, Num_Nulls,
Avg_Col_Len, Histograma
Nombre_tabla, Nombre_columna,
USER_TAB_COL_STATISTICS Núm_distinto, Densidad,
Num_Nulls,Avg_Col_Len, Histograma

Im ersten Fall werden die Statistiken der angegebenen Relation aktualisiert,


im zweiten Fall die Statistiken aller Relationen des angegebenen Schemas. Antes
de empezar a usar otros parámetros del histograma, no se alterarán. Viel
wichtiger ist uns stattdessen der Ausführungsplan. Esto último se puede ver en
el desarrollador SQL: Para abrir una función SQL, haga clic en el botón Explicar
plan o presione F10. Schon erhalten wir den Ausführungsplan grafisch
ansprechend aufbereitet, siehe Abb.7.3. In unserem Beispiel geben

Tejido. 7.3Plan de actualización en Oracle


7.1 Optimizador y plan de actualización 245

wir zu jedem Lieferanten eine Liste aller gelieferten Artikel aus. Ohne im Detail darauf
einzugehen, zeigt dieser Plan, dass die beiden RelationenLieferanteyLieferungunter
Zuhilfenahme ihrer Indexe zunächst sortiert und dann mit einem Merge Join verbunden
werden. Informationen zu Indexen liefert der folgende Abschnitt. Relación de matriz
Artículo Wird dann mit einem Hash Join verknüpft. Wir kommen in Abschn.7.5noch
ausführlicher darauf zurück. Als weiterführende Literatur sei auf die Handbücher von
Oracle, auf Alapati (2013) y en Fiorillo (2013) verwiesen.

7.1.2 Optimización en SQL Server

SQL Server utiliza estadísticas estándar para todos los índices. Ebenso werden zu allen
Attributen Statistiken erstellt, wenn sie in Where- oder Group-By-Klauseln verwendet wurden.
Estas estadísticas se pueden consultar con el Komando del banco de datosDBCC ausgeben. El
lautet der Befehl:

DBCC SHOW_STATISTICS(Relación, Índice);

Mit Hilfe des SQL Server Management Studios haben wir es deutlich komfortabler. Zu jeder
Relation existiert ein Unterpunktestadística. Heer können wir uns einfach die gewünschten
Daten anzeigen lassen. Ein Beispiel encontrado wir en Abb.7.4. Wir betrachten hier den
Primärschlüssel der RelationPersonal. Wir erkennen, dass SQL Server auch einfache
Histogramme mitführt and anzeigt. Esto es estándar en SQL Server.
SQL Server contiene una gran cantidad de estadísticas, activadas
automáticamente y actualizadas cuando se cancelan. Folgende Befehle geben einen
kleinen Eindruck:

CREAR ESTADÍSTICAS StatName EN Tabelle (Spalte) CON FULLSCAN; CREAR


ESTADÍSTICAS StatName EN Tabelle (Spalte)
CON MUESTRA 10 POR CIENTO;
ALTER DATABASE Banco de datos SET AUTO_CREATE_STATISTICS ON;
ALTER DATABASE Banco de datos SET AUTO_UPDATE_STATISTICS ON;

Die beiden ersten Befehle erzeugen eine Statistik zu einem bestimmten Attribut. Im zweiten
Fall werden nur 10 Prozent der Daten zur Statistik herrangezogen. Dies macht insbesondere
dann Sinn, wenn dies Relation sehr zu groß ist, um die Performance des Gesamtsystems nicht
zu sehr zu belasten. Die beiden letzten Befehle beeinflussen das Gesamtsystem. Primero, Fall
werden nuevas estadísticas en Bedarf automáticamente angelegt, im dos veces Fall werden die
Statistiken reggelmäßig y automatisch auf den neuesten Stand gebracht. Estas opciones se
incluyen en la opciónAPAGADOauch ausschalten.
Mientras que las estadísticas no están en el medio de la zona, para optimizar la
configuración de SQL-Befehlen. Para abrir los planes de actualización, en SQL Server,
haga clic en el botón seleccionado o presione Strg-L. Wieder zeigen wir als Beispiel
246 7 Actuación en Datenbanken

Tejido. 7.4 Estadísticas en SQL Server

Tejido. 7.5 Plan de configuración en SQL Server


7.2 Índice 247

en Abd.7.5die Anzeige aller Lieferanten zusammen mit den gelieferten Artikeln. SQL
Server funciona con operaciones combinadas como un bucle anidado. Als weiterführende
Literatur sei neben den Handbüchern Shah und Thaker (2012) empfohlen.

7.1.3 Optimización en MySQL

MySQL se encuentra en la versión de estadísticas de la norma SQL. Esta imagen está en el


esquemaEsquema_informaciónmorir relaciónEstadísticasvor. Esta relación es similar al
estándar MySQL, diseñado para indexar una estadística. Indexe wiederum legt MySQL
automatisch zu allen Schlüsselkandidaten und Fremdschlüsseln an.
En la relaciónEstadísticasfinden wir das AttributCardinalidad, das die Anzahl der Zeilen einer
Relation ausgibt. Leader wird die Selektivität der einzelnen Attribute nicht mit angezeigt,
ebensowenig Histogramme. Nichtsdestoweniger arbeiten die Statistiken zuverlässig, und
indem wir vor den Select-Befehl das WortExplicarschreiben, wird auch ein Ausführungsplan
angezeigt. Desde la versión 5.6 puede usar la opción zusätzlichenFormato=JsonEste Plan
Deutlich verfeinern. En MySQL Workbench, este plan también se puede utilizar gráficamente.
Algunas informaciones sobre el rendimiento en MySQL incluyen a Schwartz et al. (2012).

7.2 Índice

Las fechas relacionales no se sortean. Dies hat viele Vorteile. Insbesondere das Einfügen
neuer Daten ist unkompliziert, und der Zugriff auf die Daten ist, verglichen mit nicht
relacionalen Systemen, einfach. Ebenso kann die Datenbank ihre Daten free von
Sortierzwängen verwalten. Este Vorteil wird aber zum Nachteil, wenn wir gezielt nach
Daten suchen. Im Mittel müssen wir die Hälfte einer Tabelle durchsuchen, bis wir die
gewünschten Daten finden. Bei größeren Relationen wird dies schnell zum Geduldsspiel.
Da dabei große Datenmengen in den Arbeitsspeicher geholt werden müssen, werden
andere Datenblöcke verdrängt. Somit werden auch alle other Anwender mit hohen
Antwortzeiten konfrontiert.
Gute bis sehr gute Performancezugriffe garantieren letztlich nur sortierte Daten. Da
dies für die Relationen selbst nicht gilt, müssen wir zusätzliche Strukturen anlegen,
sogenannte Indexe. Estos índices existen según las relaciones de base.

IDefinición: índice en un DatenbankEinÍndice en un Datenbank ist eine Struktur zur


Beschleunigung von Suchvorgängen, in der Daten auf- oder absteigend sortiert gespeichert
werden. Un índice en un banco de datos relacional se incluye en el reglamento interno como
una tabla de clasificación específica propia.
248 7 Actuación en Datenbanken

El optimizador básico reconoce todos los índices de un banco de datos y no incluye estas
sondas para dichas reservas. Esta garantía garantiza una flexibilidad extrema. Indexe können
jederzeit angelegt und auch wieder entfernt werden. Die Zugriffsbefehle werden dadurch nicht
beeinflusst. El optimizador será independiente del nivel óptimo de cumplimiento de las
normas. Beispielsweise sehen wir in Abb.7.3y7.5, dass bei den dortigen Ausführungsplänen
mehrfach auf Indexe zugegriffen wurde.
SQL utiliza la estructura de un banco de datos claro sobre el rendimiento. Un banco de
datos incluye las funciones Create-Table y Create-View. Las primeras salpicaduras se realizarán
con el índice de referencia de rendimiento. La norma SQL se aplica a SQL2 en todos los
parámetros de rendimiento de los bancos de datos. En SQL1 se escriben todas las palabras
Befehle zum Einfügen von Indexen eingeführt. Estos son también muchos más en todos los
bancos de datos implementados. In der Zwischenzeit kamen viele herstellerspezifische
Parameter hinzu. Der Grundaufbau ist aber einheitlich geblieben und lautet:

CREAR ÍNDICE [ÚNICO] Nombre ON


nombre de tabla ( FSpalte [ ASC | DESC ]gramo
[ , ... ] )
ÍNDICE DE CAÍDA Nombre

Wie wir sehen, kann sich ein Index auch über mehrere Attribute erstrecken, wobei noch
angegeben werden kann, ob ein Index aufsteigend (asc) o absteigend (Descripción) sortiert
werden soll. Standardmäßig ist aufsteigende Sortierung eingestellt. Mit dem dazugehörigen
Drop-Befehl kann ein Index jederzeit wieder gelöscht werden.
Oracle, SQL Server y MySQL leen automáticamente cuando se selecciona un índice y, a
continuación, se conectan a las teclas alternativas y las teclas de acceso rápido. Besonderes
Augenmerk sei noch auf die OptionÚnicogelegt. En este caso, la Eindeutigkeit des Attributs se
erwartet y auch überprüft. Esta opción se resuelve en Schlüsselkandidaten immer mit
angegeben werden.
Con la información de las tablas del sistema en Oracle y SQL Server y las funciones
especiales en MySQL, tendremos una buena información sobre los índices disponibles.
Esto se encuentra en la pestaña.7.2angegeben. El índice no se aplica a la norma SQL, pero
tampoco es natural en el esquema.Esquema_informaciónaufgeführt. Esto se puede hacer
en SQL Server y MySQL y es más difícil encontrar archivos y tablas independientes.

Pestaña. 7.2Tablas de sistemas y estadísticas

Hersteller Tabla de sistema / Befehl inhalar

Oráculo ÍNDICES_USUARIOS Todos los índices de relaciones benutzer

Oráculo USER_IND_COLUMNS todos los atributos indexados


servidor SQL ÍNDICES DEL SISTEMA todos los índices

mysql MOSTRAR ÍNDICE DE T Todos los índices de la tabla T.


7.2 Índice 249

Datenbanken legen Indexe automatisch an und verwenden sie. Kenntnisse zum internen
Aufbau dieser Indexe sind daher nicht so wichtig, aber dennoch interessant. In der Praxis
werden heute sogenannte B*-Bäume eingesetzt. Ein B*-Baum ist ein mehrstufiger
ausgeglichener Baum, deren unterste Ebene intern verlinkt ist und auf die Daten verweist.
Ausgeglichen heißt ein Baum, wenn sich die Anzahl der Indexstufen vom Start bis zu den Daten
höchstens um den Wert 1 unterscheidet, unabhängig davon, welche Daten gesucht werden.
Tejido.7.6zeigt einen B*-Baum mit drei Indexstufen. Wir benötigen vom Start bis zu den Daten
also drei Zugriffe über die Indexe. Jede Stufe incluye una lista de todas las opciones de
estupefacientes. Entonces kann jeweils eindeutig entschieden werden, wie wir von Stufe zu
Stufe zu den Daten gelangen. In der Abbildung ist der Zugriff auf den Wert 6 hervorgehoben.

Die Verlinkung in der untersten Stufe ist für den sogenanntenEscaneo de rango sehr
wichtig. Beim Range Scan será una buena opción. Comenzamos con los primeros Wert
des Bereichs y können dank der Verlinkung schnell zu allen anderen Werten gelangen.
Bei einem absteigenden Index erfolgt die Verlinkung entsprechend zum Vorgänger.

Zuletzt wollen wir noch kurz ein Beispiel zur Effektivität von Indexen aufzeigen: In einer
Relationumfragacióncon 800.000 Einträgen existentes beispielsweise un atributoWohnort mit
insgesamt 50.000 unterschiedlichen Orten. Eine Suche nach einem bestimmten Ort wird
demnach im Mittel 16 Ergebnisse erzielen. Auch wenn die Werte an unterschiedlichen Stellen
der Datenbank gespeichert sind, wird ein Index immer von Vorteil sein. Mientras que la
relación de datos con varios megabytes es mayor, debe tener un máximo de 16 bloques de
datos. Wir benötigen allerdings einen Index auf this AttributWohnort! Der Ausführungsplan in
Oracle liefert uns beeindruckende Ergebnisse, siehe Abb.7.7. Im ersten Fall werden
internamente Kosten von 1752 Einheiten angegeben. Im zweiten Fall wird der

Comenzar:

1,9,18
Índice

1,4,6 9,12,15 18,22

1, 2, 3 4, 5 6,7,8 9,10,11 12,13,14 15,16,17 18,19,20,21 22,23,24

Tabla (Daten)

Tejido. 7.6Beispiel eines B*-Baums


250 7 Actuación en Datenbanken

Tejido. 7.7Ausführungsplan ohne und mit Índice

oben angesprochene Range Scan mit einem Index auf das AttributWohnortdurchgeführt, und
die Kosten hundido auf 20 Einheiten. ¡Dies ist nur noch etwas mehr als ein Prozent des
ursprünglichen Aufwands!
El índice contiene folgenden Befehlen gesetzt und wieder entfernt:

CREAR ÍNDICE IUmfrageWohnort EN Umfrage(Wohnort); ÍNDICE


DE CAÍDA IUmfrageWohnort;

Dieses Beispiel belegt eindrucksvoll, wie wichtig Indexe in der Praxis sind. Wir warnen
jedoch davor, beliebig viele Indexe zu setzen. Bei jedem Schreibvorgang müssen die
betroffenen Indexe ebenfalls mit aktualisiert werden. Ein ausgewogenes Verhältnis ist daher
unbedingt anzustreben.

I Wir verwenden sowenig Indexewiemöglich (wegender zusätzlichenBelastung beim


Ändern von Daten).
Wir setzen so viele Indexe wie nötig (wegen der hohen Lesegeschwindigkeit).

Als Literatur zu B*-Bäumen werden Bücher zu Algorithmen und Datenstrukturen


empfohlen. Speziell zu Indexen sei auf Connolly und Begg (2015), Elmasri y Navathe (
2002), Gulutzan y Pelzer (2002) y Kemper y Eickler (2015) verwiesen.

7.3 Partición

Viele Relationen sind in der Praxis enorme groß. Galten vor zehn Jahren Einträge in
Millionenhöhe noch als beeindruckend, sprengen einzelne Relationen heute problemlos die
7.3 Partición 251

Milliardengrenze. Cuando bedenken, dass estas Relationen viele Attribute besitzen, so


benötigen wir für nur eine einzige dieser Relationen bereits Terabytes! Schnellste Zugriffe auf
diese Daten sind kaum vorstellbar. Doch Indexe und die Zerlegung dieser Relation in viele
kleine Einheiten machen genau dies möglich.
Indexe wurden bereits im letzten Abschnitt behandelt. Hier wollen wir uns die
Zerlegung von Relationen ansehen. Beginnen wir mit einem Beispiel. Die
Produktionsdaten des letzten Jahres stehen in einer Relationproducción. Wir könnten this
Relation in die Monatsdaten zerlegen und hätten dann zwölf Einzelrelationen. Dies hätte
Vorteile: Die einzelnen Relationen wären kleiner. Beim Zugriff auf die Januardaten könnte
direkt auf die gewünschte Januar-Relation zugegriffen werden. Parallelzugriffe auf
mehrere Monatsrelationen gleichzeitig wären ebenfalls möglich. Der Nachteil ist die
Inflexibilität. Der Anwender muss genau wissen, welche Teilrelationen es gibt. Ja, der
Anwendungsprogrammierer muss sogar wissen, welche Teilrelationen es übermorgen
geben wird: Schließlich werden ja weiterhin Daten erzeugt!
Aquí está la partición de relaciones adicionales. In der Datenbank wird festgelegt,
wie eine Relation zu zerlegen ist. Gemäß dieser Regeln wird dies in der Datenbank
auch durchgeführt. Somit können Dutzende, ja Hunderte oder Tausende von
Teilrelationen entstehen. Wichtig ist dabei, dass dies der Anwender nicht bemerken
soll. Für ihn gibt es weiterhin nur eine einzige Relation. Hablaremos aquí de una
relación transparente. Sólo el optimizador reagieren y beispielsweise los Zugriffe auf
die Relationproducciónauf die tatsächlich existen teilrelationen weiterleiten. Muere
en Abb.7.8dargestellt. El optimizador se activará automáticamente en paralelo con
las actualizaciones anteriores y los errores se ampliarán. Definiremos:

Palabra de Zugriff

durchgereicht Prod_Jan

Zugriff
Prod_febrero
producción

Nach aussen
barra de seguridad, aber

no existe Prod_Dez

Real, aber nur


bar de prácticas

Tejido. 7.8La idea de partición


252 7 Actuación en Datenbanken

IDefinición: particiónBajo una partición dividida, habrá una relación horizontal, vollständige y
transparente que aumenta la relación entre las partes separadas. Estas relaciones de
relaciones bezeichnen wir alsparticiones .

Esta definición se basa en la vollständigkeit y la transparencia. Die Aufteilung erfolgt


disjunkt, um Redundanzen zu verhindern. En einigen Lehrbüchern wird zwischen horizontaler
und vertikaler Partitionierung unterschieden. Im Transaktionsbetrieb gibt es bis heute
ausschließlich eine horizontale Partitionierung. Dies heißt, dass die Daten zeilenweise zerlegt
werden. In großen Abfragesystemen wäre auch ein spaltenweises, vertikales Ablegen sinnvoll
und ist in wenigen proprietären Systemen auch bereits realisiert. Wir werden darauf aber hier
nicht weiter eingehen.
Wegen ihrer enormen Flexibilität und der hohen Leistungsfähigkeit wird die Partitionierung
heute von allen modernen Datenbanken unterstützt. Es gibt verschiedene Verfahren der
Partitionierung, die sich durch die Kriterien unterscheiden, nach denen particiiert wird. Einen
Überblick über alle Partitionierungstypen in Abhängigkeit von einzelnen Herstellern gibt Tab.
7.3.
Die Tabelle zeigt, dass die am weitest verbreitete Bereichs- oder Range-Partitionierung von
allen trachteten Datenbankherstellern unterstützt wird. Allen Verfahren ist gemeinsam, dass
sie intern eine Relation in Teile zerlegen, und zwar transparent für den Anwender. Der
Anwender greift weiterhin mit seinen Zugriffsbefehlen auf die Originalrelation zu. Die einzelnen
Verfahren unterscheiden sich nur durch die Regel, wie Relationen zerlegt werden. Wer
betrachten im Folgenden die wichtige Bereichspartitionierung und zeigen bei den den anderen
nur kurz die Unterschiede auf.

Bereichs- oder Range-PartitionierungBei der Range-Partitionierung zerlegen wir eine


Relation in mehrere disjunkte Bereiche. Die für diese Zerlegung am häufigsten verwendeten
Kriterien sind Zeitangaben. Bereits weiter oben haben wir in einem Beispiel die Relation
producciónen Monatspartitionen zerlegt. Da auch viele Abfragen in Abhängigkeit

Pestaña. 7.3Unterstützung der Partitionierung en Datenbanken

Hersteller Verfahren zur Partitionierung


Lista de particiones
Bereichs-Partitionierung
Partición Hash
Oráculo
Partición de Intervall
Referencia de partición
Partición virtualmente dividida
Bereichs-Partitionierung
servidor SQL
Índice de partición
Lista de particiones
Bereichs-Partitionierung
mysql
Partición Hash
Partición de Schlüssel
7.3 Partición 253

der Zeit erfolgen, bietet sich diese Partitionierung oft an. En el BeispieldatenbankBicicleta
enthalten die Aufträge ein Auftragsdatum. Beim Erzeugen der RelationAuftragKönnten wir
daher eine Partitionierung nach diesem Datum vornehmen. En Oracle lautet der
entsprechende Befehl beispielsweise wie folgt:

CREAR TABLA Auftrag (


Auftrnr EN T CLAVE PRIMARIA,
Dato FECHA NO NULO,
Kundnr EN T REFERENCIAS NO NULAS Kunde,
persona EN T REFERENCIAS Personal )
PARTICIÓN POR RANGO (Dato)
( PARTICIÓN Auftrag2010 VALORES MENOS DE LA FECHA '2011-01-01',
PARTICIÓN Auftrag2011 VALORES MENOS QUE LA FECHA '2012-01-01',
PARTICIÓN Auftrag2012 VALORES MENOS QUE LA FECHA '2013-01-01',
PARTICIÓN Auftrag2013 VALORES MENOS QUE LA FECHA '2014-01-01'
);

Este Befehl está abhängig vom Datenbankhersteller. Zusätzlich können weitere


Einstellungen vorgenommen werden, um etwa die Größe der Partitionen
festzulegen und diese gezielt auf die einzelnen Festplatten zu verteilen. Mit Hilfe des
Alter-Table-Befehls können diese Einstellungen angepasst werden. In unserem Fall
werden genau vier Partitionen angelegt, für jedes Jahr eine eigene. Wird jetzt
beispielsweise auf Aufträge im Jahr 2012 zugegriffen, por lo que wird der Optimizer
automatisch nur Zugriffe auf die Partition Auftrag2012vornehmen. Hay bisagras
sobre todas las fechas activadas, por lo que el optimizador en paralelo puede crear
particiones separadas y eliminar errores.

Otras particionesNicht immer ist die Bereichspartitionierung optima. En unternehmen


internacional, kann beispielsweise die Abfrage nach Verkaufsregionen sehr wichtig sein. Wir
können dazu in einer Liste die einzelnen Regionen angeben und sprechen von einerPartición
de listas. En otros casos, no existen klares Verfahren zur Aufteilung in Partitionen. Dann
können wir dies auch der Datenbank überlassen und wählen einepartición hash. Esta partición
se debe realizar en el marco del reglamento sin necesidad de utilizar el mismo filtro. Bei
Suchvorgängen können aber dank einer paralelon Ausführung erhebliche Zeitgewinne erreicht
werden.
Morirpartición de intervalosen Oracle beseitigt eine Schwäche der
Bereichspartitionierung. Liegt dort nämlich eine Bereichsaufteilung in Monate vor, so muss
jeden Monat eine neue Partition hinzugefügt werden. Bei der Intervallpartitionierung
bisagragen werden die Intervalle festgelegt. Neue Bereichspartitionen werden dann
beispielsweise Monat für Monat automatisch angefügt.
auch morirpartición de referenciaist eine Besonderheit von Oracle. Este arte
de partición siempre incluirá un título. Weiter oben haben wir bereits die
254 7 Actuación en Datenbanken

RelaciónAuftragzerlegt. Relación de matrizAuftragspostenenthält die einzelnen


Auftragspositionen, jedoch kein Datumsfeld. Es wäre aber sinnvoll, esta relación genau wie die
RelationAuftragzu particiieren. Und exakt dies ermöglicht die Referenzpartitionierung. Das
Erzeugen der RelationAuftragspostenkönnte hier wie folgt lauten:

CREAR TABLA Auftragsposten (


posnr EN T PRIMARIO LLAVE

Auftrnr EN T NO NULO,
Teilenr EN T NO NULO,
Precio de venta NUMÉRICO(8,2),
Anzahl EN T,
RESTRICCIÓN AP_FK CLAVE EXTRANJERA (Auftrnr) REFERENCIAS Auftrag)
PARTICIÓN POR REFERENCIA (AP_FK);

En este otoño, no moriremos en la relación.Auftragspostenla partición de la relaciónAuftrag


übernehmen, da beide über einen Fremdschlüssel miteinander verbunden sind.
En Oracle können virtualte Spalten definiert werden. Dies sind Spalten, die ähnlich
wie Sichten aus anderen Spalten berechnet werden. Estas virtudes de espacio duran
para la apertura de una partición. Wir sprechen hier von einerParticiones de
partición de datos virtuosos.
En SQL Server, podemos particionar con funciones de partición definidas, y luego se activa
la función Create-Table. Entsprechend dieser Vorgaben werden dann die Relationen divideiert.
Zusätzlich kann mit angegebenen werden, dass auch die dazugehörigen Indexe nach den
gleichen Regeln zerlegt werden (partición de indexación).
MySQL no sabe morirpartición de Schlüssel. Esta también es una partición de claves
que se activa en la configuración actual de la partición Hash. Als Basis der Aufteilung
dient hier allerdings der Primärschlüssel oder ein Alternative Schlüssel.
Sowohl en MySQL también en Oracle puede nach einer Partitionierung noch eine weitere
Unterpartitionierung erfolgen. Entonces kann beispielsweise eine Relation erst in
Monatseinheiten und dann noch zusätzlich in Verkaufsregionen aufgeteilt werden. Es liegt
dann eine Bereichs-, gefolgt von einer List-Partitionierung vor.
Insgesamt ist die Partitionierung ein hervorragendes Werkzeug, um bei sehr großen
Relationen die Zugriffe zu beschleunigen. Dies geschieht entweder dadurch, dass nur auf
eine oder wenige Teilpartitionen zugegriffen wird, oder dass der Gesamtzugriff paralelo
erfolgt. Viele zusätzliche Informationen liefern die Handbücher der Datenbankhersteller,
aber auch Alapati (2013), Fiorillo (2013), Schwartz et al. (2012) y Shah y Thaker (2012).

7.4 Información materializada

El diseñador de Datenbank steht häufig vor einem schier unlösbaren Problem: Er möchte zum
einen die Datenbank óptimo entwerfen und nur Relationen ab der dritten Normalform ver-
7.4 Información materializada 255

wenden. Dies erfordert viele Relationen und beim Zugriff dann entsprechend viele Joins.
Leistungseinbußen sind vorprogrammiert. Zum anderen spielt in der Praxis eine gute
Performance eine entscheidende Rolle. Dies kann dazu führen, dass der Datenbankdesigner in
Einzelfällen auf die dritte Normalform verzichtet. Dadurch entstehen aber Redundanzen und
damit die Gefahr von Inkonsistenzen.
Um die Problematik besser zu verstehen, betrachten wir ein Beispiel: Auf die beiden
RelationenAuftragyAuftragsposten(aquí Tab.10.5y10.6) wird meist gleichzeitig
zugegriffen, etwa in der Form:

SELECCIONAR *

DESDE Auftrag UNIÓN INTERIOR NATURAL Auftragsposten ;

Dies ergibt sich aus der Tatsache, dass die RelationAuftragspostenDetalles zu den einzelnen
Aufträgen aus RelationAuftragenthält. Bei zwei großen Relationen kosten solche se une a
erhebliche Performanceverluste. Es bietet sich daher im Datenbankdesign an, diese beiden
Relationen zu einer Relation zusammenzufassen. Wir erhalten die RelaciónAuftragKomplett
también Tab.7.4. Esta relación no existe en ninguna otra forma normal y es muy redundante: el
dato, la persona y el número personal son mejores que los anteriores. Esta relación se verbietet
sich también aus Gründen der Redundanz, der Gefahr der Inkonsistenz und des
Speicherverbrauchs. Andererseits hat diese Relation ihren Reiz. Beim Zugriff können wir auf
den aufwendigen Verbund verzichten. Wir gewinnen bei entsprechend gesetzten Indexen
wertvolle Zugriffszeit.
Sichten helpen uns auch nicht weiter. Definieren wir die RelaciónAuftragKomplettals
Sicht und damit als Verbund zwischen den beiden RelationenAuftragyAuftragsposten, so
werden beim Zugriff doch wieder nur die beiden Basisrelationen verwendet. Schließlich
existieren Sichten nicht real.
Oracle führte mit Version 8i Sichten ein, die auch physisch gespeichert werden und gab
ihnen den NamenSichten materializado. Inzwischen gibt es ähnliche Konzepte también en
DB2 (Tablas de consulta materializadas), en PostgreSQL y en SQL Server (Vistas indexadas). Da
diese Sichten physisch existieren, können wir ohne Umweg über die Basis-

Pestaña. 7.4Relación AuftragKomplett

posnr Auftrnr Dato Kundnr persona Artnr Anzahl Precio de venta


101 1 04.01.2013 1 2 200002 2 800,00
201 2 06.01.2013 3 5 100002 3 1.950,00
202 2 06.01.2013 3 5 200001 1 400,00
301 3 07.01.2013 4 2 100001 1 700,00
302 3 07.01.2013 4 2 500002 2 100,00
401 4 18.01.2013 6 5 100001 1 700,00
402 4 18.01.2013 6 5 500001 4 30,00
403 4 18.01.2013 6 5 500008 1 94,00
501 5 03.02.2013 1 2 500010 1 40,00
502 5 03.02.2013 1 2 500013 1 30,00
256 7 Actuación en Datenbanken

relaciones directas con los ciudadanos. Diesen Geschwindigkeitsvorteil erkaufen wir durch
zusätzlichen Speicherplatzbedarf. Noch schwerwiegender ist, dass jetzt dos Versionen
existieren, die Basisrelationen und die materialisierte Sicht. Die Gefahr der dadurch
bestehenden Inkonsistenzen löst Oracle dadurch, dass die materialisierte Sicht regelmäßig an
die Basisrelation angepasst wird.
Materialisierte Sichten sind mit Bedacht einzusetzen. Liegen Sichten vor, deren
zugrunde liegenden Basisrelationen nur selten geändert werden, so bieten sich
materialisierte Sichten sofort an. Dies gilt insbesondere in einem Data Warehouse.
Dort wird in der Regel nur lesend zugegriffen. Betrachten wir als Beispiel unsere
RelaciónAuftragKomplett (ver Tab.7.4). Esta relación se puede definir de la siguiente
manera:

CREAR VISTA MATERIALIZADA AuftragKomplett


ACTUALIZAR RÁPIDO AL COMMITIR COMO

SELECCIONE Posnr, AuftrNr, Datum, Kundnr, Persnr, Artnr, Anzahl,


Precio de venta
DESDE Auftrag UNIÓN INTERIOR NATURAL Auftragsposten ;

Esta vistaAuftragKomplettWird physikalisch gespeichert und bei Transaktionsende


aktualisiert, falls insidehalb einer Transaktion eine der beiden Basisrelationen
manipulated wurde. Wir sehen, dass alleine das WortMaterializadoentscheidet, ob eine
Relation physisch oder nur virtell angelegt wird. Ansonsten hält sich Oracle an die Syntax
von Sichten. Zusätzlich geben wir an, wann bei Änderungen eine Sicht angepasst werden
soll und wie. Heer stehen unter anderem folgende Möglichkeiten zur Verfügung:

ACTUALIZAR RÁPIDO [ EN COMPROMISO ]


ACTUALIZAR COMPLETA [ EN COMPROMISO ]

Opción de morirEn compromisoführt zu sehr häufigen Anpassungen. Stattdessen kann mit der
OptionEmpezar siguienteeingestellt werden, dass nur zu bestimmten Zeitpunkten die materialisierten
Sichten aktualisiert werden. Esto está incluido en un almacén de datos independiente. Opción de
morirActualizar rápidoactualizado nur die geänderten Daten. Esta opción se puede utilizar sin
necesidad de utilizar un registro de entrada, ya que con el uso de Befehl angelegt werden muss:

CREAR REGISTRO DE VISTA MATERIALIZADA AuftragKomplett...

Mit der OptionActualización completawird immer die gesamte Sicht vollständig neu
erzeugt. Ein Logbuch entfällt in diesem Fall. Zum Löschen der obigen Sicht genügt der
Befehl:

GOTA VISTA MATERIALIZADA AuftragKomplett ;


7.5 Optimierung des Select-Befehls 257

Mit diesen materialisierten Sichten gelingt der Spagat zwischen alto Performance und
hohen Normalformen. Wer sollten aber beachten, dass diese Sichten in der Regel nur dann
sinnvoll sind, wenn in den zugrundeliegenden Relationen nur wenige Änderungen
vorgenommen werden. Un almacén de datos es una configuración óptima para el
almacenamiento de datos. Zu Detalles sei auf die Oracle-Handbücher verwiesen, ebenso auf
Fiorillo (2013) y Alapati (2013).

7.5 Optimierung des Select-Befehls

Bereits am Anfang estos Kapitels wurde darauf bisagrasen, dass der Optimizer einen
Select-Befehl überprüft and optimiert, um die Antwortzeiten zu reduzieren. Doch nicht
immer liefert der Optimizer maximale Performance, da este naturgemäß die internan
Feinheiten und Abhängigkeiten der Anwendung nicht kennt. Heer kann der
Anwendungsprogrammierer zusätzliche Hilfestellungen leisten.
Nehmen wir das Beispiel eines Frauenverbandes. In der Mitgliederkartei gibt es nur
wenige Einträge von Männern. Sollen jetzt Daten dieser Herren ausgegeben werden, so
wird der Optimizer in die Irre geführt. Atributo Zu einemGeschlechtsind in den
Statistiktabellen dos werte unterschiedliche (hombre,weiblich) vermerkt. Die Selektivität
(siehe Abschn.7.1) es un valor de 0,5. Der Optimizer wird daher einen gegebenenfalls
vorhandenen Index kaum verwenden, da er annimmt, dass er im Mittel sowieso jeden
zweiten Wert lesen muss. Der Anwender kann hier unterstützen und dem Optimizer
darauf hinweisen, doch den Index zu benutzen.
Naturalmente es rico, el optimizador reconoce y anwendet las reglas más precisas.
Dies trifft insbesondere auf die in der relacionalen Algebra vorgestellten Regeln zu, siehe
Abschn.2.5.5. Para que el Optimizador no se adapte a sus necesidades, es útil, el ajuste de
los optimizadores y las reglas adecuadas. Wir wollen daher den Select-Befehl aus
Performancesicht näher betrachten. Besonders aufwendig sind in großen Tabellen immer
folgende Operationen:

- Kreuzprodukt
- Verbund (Unirse)
- Sortiervorgänge

Das Kreuzprodukt wird meist als Teil eines Verbunds verwendet. Es bleiben also Verbund
und Sortieren als Hauptprobleme übrig. Ein Verbund lässt sich selten vermeiden. Wir könnten
allerdings in einigen Fällen materialisierte Sichten einsetzen. Las bisagras de clasificación
pueden utilizarse de forma manchmal. Folgende Hinweise sind hierfür sehr hilfreich:

I VermeideUniónund verwende stattdessenUnión Todos


Vermeide Ordenar por
Vermeide Seleccionar Distinto
258 7 Actuación en Datenbanken

Grupos Vermeide (Agrupar por)

In all diesen Fällen müssen mehrfach vorkommende Werte erkannt werden. Dazu wird
in der Regel vorher sortiert. Häufig ist es gerade bei der Vereinigung nicht notwendig,
gleiche Zeilen zu eliminieren. Dann bewirkt der zusätzliche BezeichnerTodoerhebliche
Zeitgewinne. Andere Befehle wiederum lassen sich manchmal so umschreiben, dass der
BezeichnerDistintonicht notwendig ist. Wieder haben wir Ausführungszeit gewonnen.
Schränken wir in einer Anwendung die Ausgabe auf nur wenige Zeilen ein, so können wir
womöglich auf das Sortieren der Daten verzichten. Auch eine Gruppierung ist nicht
immer notwendig. Wieder hätten wir einen sehr aufwendigen Befehl weniger.
Leider können wir in den meisten Fällen auf Verbund-Operationen no verzichten. Ein
Verbund ist aus einem Kreuzprodukt aufgebaut, so dass jede Zeile der einen Relation mit
jeder Zeile der anderen verknüpft werden muss. Je kleiner nun die Ausgangsrelationen
sind, umso kleiner wird dieses Produkt. Um die Ausgangsrelationen zu verkleinern,
greifen wir auf die relacionaale Algebra zurück. Insbesondere vier Formeln, die dem
Abschn.2.5.5entnommen sind, leesten hier eine hervorragende Hilfestellung:

- cama.R1‰R2/D -cama.R1/‰ -cama.R2/


- Bedingung_an_R2.R1‰R2/DR1‰ -Bedingung_an_R.R2/ 2

- Auswahl.-cama.R//D -cama.-Auswahl.R//

- Auswahl.R1‰R2/D -Auswahl.R1/‰ -Auswahl.R2/

Die zweite Formel ist ein Spezialfall der ersten, die allerdings sehr häufig vorkommt.
Die vierte Regel gilt immer dann, wenn die Auswahl alle verknüpfenden Attribute des
Verbunds umfasst.
Die vier Regeln besagen, dass wir Verbund, Restriktion und Projektion vertauschen
dürfen. Die Reihenfolge spielt also keine Rolle. Bevor wir also einen aufwendigen Verbund
ausführen, werden wir erst einmal die Relationen mittels Projektion und Restriction
verkleinern. Dorado grueso:

I Wir führen zuerst erforderliche Restriktionen und Projektionen in unseren


Relationen aus und wenden erst dann einen Verbund an.
Beziehen sich Gruppierungen nur auf einzelne Relationen, so werden diese
ebenfalls vorgezogen.

También incluiremos un operador Where y seleccionaremos un operador grupo por


operador con el operador de unión. Ebenso entfernen wir zunächst no benötigte Attribute. Die
Vertauschungen von Restriktion und Verbund Bringen in der Regel erhebliche Performance-
Vorteile. Kann beispielsweise über einen Index zugegriffen werden, so müssen nur die
benötigten Daten von der Datenbank eingelesen werden. Wir saven damit zusätzliche
Lesevorgänge von der Festplatte. Und auch becario muss dann nur eine kleine
7.5 Optimierung des Select-Befehls 259

Relation weiter verarbeitet werden. Los grupos seleccionados meist ein aufwendiges Sortieren.
Es ist natürlich wesentlich günstiger, einzelne Relationen zu sortieren, statt großer
Verbundrelationen. Das Entfernen nicht benötigter Attribute (Projektion) bisagra trae no
geringe Vorteile, denn wir sparen beim Einlesen keine Lesezugriffe. Die Daten sind ja
zeilenweise abgelegt. Allerdings führen die nun wegen der weggelassenen Attribute kleineren
Relationen auch hier zu kleineren internanen temporären Relationen.
Sollten wir diese Hinweise gelegentlich vergessen, so wird der Optimizer einspringen,
der obige vier Regeln natürlich ebenfalls beherrscht. Es ist daher gar nicht so einfach
Datenbanken zu überlisten. Wir wollen es trotzdem versuchen. Soy Abschn.5.4haben wir
unter anderem die SichtVAuftragvorgestellt, siehe auch Tab.5.5. Esta visión fue aus
folgendem Befehl erzeugt:

SELECCIONAR AuftrNr, Datum, K.Nombre, P.Nombre, SUM (Gesamtpreis) Auftrag


DE ÚNETE a Kunde K ON K.Nr = Auftrag.Kundnr
UNIRSE Personal PAG USANDO(Persona)
UNIRSE Auftragsposten USANDO (Auftrnr)
GRUPO POR Auftrnr, Datum, K.Nombre, P.Nombre;

Heer gibt es zwar keine Where-Klausel, wir können jedoch die Group-By-Klausel
vorziehen. Schließlich bezieht sich die Gruppierung ausschließlich auf die Relation
Auftragsposten. Estos detalles internos no pueden usarse en el optimizador. Wir
schreiben unseren Select-Befehl daher selbst um:

SELECCIONAR AuftrNr, Datum, K.Nombre, P.Nombre, Summe


DE Auftrag
UNIRSE (Seleccione Nr, Nombre de Kunde) K ON K.Nr =
Auftrag.Kundnr
UNIRSE (Seleccione Persnr, Nombre de Personal) P
USANDO (Persnr)
ÚNETE (Seleccione Auftrnr, Sum(Gesamtpreis) como Summe
De Auftragsposten
Grupo Por Auftrnr) AP USANDO (Auftrnr)

Trotz der sehr kleinen Relationen reduzieren sich laut Ausführungsplan die Kosten
etwas. Bei großen Relationen wären die Einsparungen deutlicher.
In der relacionaalen Algebra gelten für Verbund und Produkt auch das Assoziativ- und
Kommutativgesetz. Además, estos Gesetze können wir gewinnbringend anwenden, denn es
gilt:

I Verbessern die Performance, wenn wir in einem Verbund und einem Kreuzprodukt
die kleinere Relation zuerst ausführen.

Ab sofort geben wir die kleinere Relation in einem Select-Befehl zuerst an. Natürlich
berücksichtigen wir dabei eine eventuell vorherige Restriction. Este Merkregel dorado vor
260 7 Actuación en Datenbanken

allem für größere Relationen. Bei kleinen Relationen werden beide Tabellen in den
Arbeitsspeicher geladen und vermischt. En este otoño se dice el Reihenfolge keine Rolle. Para
lograr grandes efectos en las relaciones entre personas, se deben utilizar las tres operaciones
de unión más efectivas y se generaron:

- Unión de bucle anidado

- Unión hash
- Fusionar Unirse

Unión de bucle anidado:Este Únase a los dos mejores Schleifen ineinander geschachtelten.
Die erste Relation wird Zeile für Zeile geladen, und je Zeile wird diese mit allen Zeilen der
zweiten Relation verknüpft. Reicht der Arbeitsspeicher nicht aus, so muss die zweite Relation
immer wieder geladen werden. Bei Optimaler Ausnutzung der Blockstruktur können wir
zeigen, dass die Anzahl der zu lesenden Blöcke zwischen

AnzahlDBlockanzahl.R1/CBlockanzahl.R2/

y
AnzahlDBlockanzahl.R1/Blockanzahl.R2/CBlockanzahl.R1/
liegt. La funciónBlockanzahlgibt dabei die Anzahl der Blöcke zurück, die eine Relation in der
Datenbank belegt. Der erste Ausdruck ergibt sich, wenn beide Relationen komplett in den
Arbeitsspeicher passen. Beide Relationen werden dann nur einmal in den Rechner geladen.
Andernfalls se convirtió en la primera relaciónR1einmal eingelesen. Die zweite Relación R2muss
dann bis zuBlockanzahl(R1)-mal von der Datenbank geholt werden. También soyR1
kleiner tambiénR2, así que ahorramos con Lesevorgänge, cuando somos primerosR1ausführen.

Unión hash:Aquí se incluyen las relaciones entre una Hashtabelle y una plataforma
Hashtabellen compartida. Nacheinander werden this Tabellenplätze von beiden
Relationen geladen und miteinander verbunden. Zuletzt müssen diese Tabellenplätze
noch gemischt werden. Wir fassen also alle Datensätze bis zu dreimal an, beim Erzeugen
der Hashtabellen, beim Verbinden und beim Mischen. Die maximale Anzahl von
Lesevorgängen ergibt sich also zu:

AnzahlD3 .Blockanzahl.R1/CBlockanzahl.R2// :

Ist der Speicherplatz knapp, so ist es beim Hash Join besonders wichtig, die kleinere
Relation als erste anzugeben. Passt etwa die erste kleinere Relation komplett in den
Arbeitsspeicher, so muss nur die größere dreimal geladen werden. Zu Informationen zu
Hashalgorithmen sei auf Ottmann und Widmayer (2012) verwiesen.
Fusionar Unirse:Heer werden die beiden Relationen zunächst sortiert und anschließend
zusammen gemischt. Die maximale Anzahl an Lesevorgängen ist dabei identisch zum Hash
Join. Beim Merge Join spielt es keine Rolle, welche der beiden Relationen zunächst verwendet
wird.
7.5 Optimierung des Select-Befehls 261

Ein Vergleich dieser Join-Varianten ist schwierig. Cuando tenga más experiencia, haga un
Merge Join con el propio Arbeitsspeicher auskommt, un Nested Loop Join sin embargo, puede
ser de varias maneras. Ist eine Relation wesentlich kleiner als die other, so ist meist der Hash
Join von Vorteil. Fast immer gilt aber, dass es ratsam ist, die kleinere Relation voranzustellen.
Schaden tut muere nie.
Auch außerhalb von Restriction und Verbund können wir Befehle optimieren. Ganz wichtig
sind Indexe, die wir bereits in Abschn.7.2behandelt haben. Allerdings ist es ganz wichtig, dass
wir die Befehle so schreiben, dass ein Index auch verwendet wird. Besonders imperformant
verhält sich die wichtige FunktionRecortar.

I Die Verwendung der FunktionRecortarführt dazu, dass ein Index nicht verwendet
werden kann. Wir sollten stattdessen die FunktionRTrimbenutzen!

La funciónRecortarentfernt auch führende Leerzeichen. Dies beeinflusst die Ordnung eines


Attributs enorm, der Index wird wertlos. La funciónRTrimentfernt nur schließende Leerzeichen.
Dies hat auf die Ordnung keinen Einfluss. Eine Besonderheit weist Oracle auf: Hier darf statt
eines Indexes auf eine Spalte auch ein Index auf einen Spaltenausdruck erfolgen. En Abschn.
7.2Hatten wir einen Index auf den Wohnort gesetzt. Wenn in den Anwendungen dieser
Wohnort immer immer mittels der FunktionSuperiorin Großbuchstaben umgewandelt wird, so
wird der Index unbrauchbar. En Oracle hätten wir dies aber schon beim Setzen des Indexes
berücksichtigen können:

CREAR ÍNDICE IUmfrageWohnort ON Umfrage(Upper(Wohnort));

Jetzt wird der Index von vornherein wie gewünscht gesetzt. Natürlich wird nun der Index
nur dann verwendet, wenn wir mittels der FunktionSuperiorauf den Wohnort zugreifen.
Nicht nur beim Produkt und beim Verbund werden große Zwischenergebnisse
erzeugt, auch mit einem Unterselect-Befehl generieren wir ähnlich große temporäre
Daten. Besonderer Aufmerksamkeit bedürfen die OperadoresEnyexiste. Hier gelten
genau die gleichen Aussagen wie beim Verbund: Die Teilrelationen sollten so klein wie
möglich sein.

I Wir verwenden Unterselect-Befehle so, dass möglichst kleine Unter-Relationen


entstehen.

Häufig stehen wir vor der Frage, welcher der beiden OperadoresEnbzw.No eny existe
bzw.No existeintérprete. Estas Frage lässt sich no eindeutig beantworten. En Abschn.4.1.4
zur Where-Klausel hatten wir die Frage nach allen Mitarbeitern, die weniger als
Mitarbeiter 3 verdienen, auf drei verschiedene Arten beantwortet. Intuitiv war der Befehl
mit dem Vergleich im Where-Teil (siehe Abb.7.10). Die Variante mit dem Verbund war
etwas komplexer. La variante con el operadorexiste(siehe Abb.7.9) bisagragen sah nicht
nur komplex sondern auch imperformant aus. Zumindest Letzteres es
262 7 Actuación en Datenbanken

Tejido. 7.9 Select-Befehl mit Exists-Operator

Tejido. 7.10Select-Befehl mit Vergleichsoperator

Nicht der Fall. Ein Blick auf den Ausführungsplan zeigt, dass alle drei Varianten ziemlich gleich
schnell ausgeführt werden, siehe dazu doswei der drei Ausführungspläne in Abb.7.9 y7.10.

Zuletzt sei nochmals darauf bisagrawiesen, dass die einzelnen Datenbanksysteme nicht
grundsätzlich Optimum Ausführungspläne generieren. Schließlich kennen die an und für
7.6 Procedimiento almacenado 263

sich sehr guten Algorithmen no die exakten Daten und ebenso nicht die Programmlogik. Wir
kommen auf das Ausgangsbeispiel in diesem Abschnitt zurück. Fragen wir in einem
Frauenverband nach den männlichen Mitgliedern, so weiß eine Datenbank in der Regel nicht,
dass es nur wenige männliche Mitglieder gibt. Aquí puede encontrar dos opciones de
configuración adicionales: Para poder usar un histograma, puede hacerlo. Dies verursacht aber
einen hohen Aufwand für die Datenbank. Oder wir geben dem Optimizer einen Hinweis.
En todos los bancos de datos modernos podemos utilizar el optimizador con sugerencias,
sugerencias y sugerencias. Soll etwa beim Zugriff auf die Relationumfragaciónaus Abschn.7.2
No se puede usar el índice, por lo que se escribe en Oracle:

Seleccione/*+ NO_INDEX(Umfrage) */* Desde Umfrage Donde...

Her werden Hinweise as Kommentare direkt nach dem Select-Befehl geschrieben. En SQL
Server, siga el enlace With-Klausel directamente detrás del From-Klausel. Heer gibt es keinen
Hinweis, der Indexe generell verbietet. Aber mit dem HinweisEscaneo de fuerzawird ein
Durchsuchen der Relation erzwungen. Wir schreiben:

Seleccione * Desde Umfrage Con (FORCESCAN) Donde...

En MySQL lautet der entsprechende Befehl:

Seleccione * Desde Umfrage Ignorar Índice (IUmfrageWohnort) Donde...

Auch hier werden die Hinweise nach der From-Klausel geschrieben. In unserem
Beispiel ist der ParameterIUmfrageWohnortcon el Create-Index-Befehl definido
Indexname.
Generalmente se recomienda usar instrucciones en inglés, ya que en el rango del
Optimizador se escuchan correctamente los ajustes. Im gazielten Einzelfall können die
Hinweise die Antwortzeiten aber nochmals deutlich senken. Zur weiteren Information sei vor
allem auf die Handbücher der Hersteller verwiesen.

7.6 Procedimiento almacenado

In der Praxis werden internalhalb einer Transaktion meist mehrere SQL Befehle nacheinander
abgearbeitet. Diese Befehle werden über das Netz an die Datenbank gereicht. Diese nimmt die
Befehle entgegen und bearbeitet sie. Anschließend kommen die Ergebnisse wieder einzeln
zum Anwender zurück. Nicht nur die Datenbank, sondern das gesamte System inclusive der
benötigten Netzwerkverbindungen ist hoch belastet. Dieses ständige Hin- und
Hertransportieren von Daten schlägt sich negativ in der Gesamtantwortzeit nieder.

Es gibt daher mindestens dos Vorteile, um solche Befehle in einer Prozedur


zusammenzufassen und in der Datenbank abzuspeichern:
264 7 Actuación en Datenbanken

Erstens können wir so immer wieder vorkommende Befehlsfolgen zu einer Einheit


zusammenfassen, was die Übersicht deutlich verbessert. Und dosweitens gewinnen wir Performance,
da der Prozeduraufruf nur ein einziges Mal über das Netz geschickt werden muss. Alle internen
Aufrufe erfolgen dann internalhalb der Datenbank. Wir sprechen hier vonProcedimientos
almacenados, da diese Prozeduren direkt in der Datenbank abgelegt werden. Es handelt sich
también un pequeño programa de Datenbank, die von extern aufgerufen werden.
Los procedimientos almacenados están incluidos en la norma SQL3 de 1999 y en SQL2003.
Estas normas relativas a las normas vigentes no permiten que los bancos de datos y la norma
SQL estén suspendidos. Schließlich hatten die einzelnen Hersteller längst ihre eigenen
Implementierungen vorgenommen. Oracle verwendet beispielsweisePL/SQLAdemás de la
programación y el servidor SQL, el mismo programaTransaccion SQL. No MySQL contiene
SQL2003, lo que hace que los primeros procesos sean relativos.
Habíamos estado en Abschn.5.7Dispare Kennen gelernt. Dies sind ebenfalls Prozeduren. Der
Unterschied zu den Stored Procedimientos besteht darin, dass Trigger zu bestimmten Ereignissen
und Stored Procedimientos explícitos aufgerufen werden.
Wir zeigen die Funktionsweise von Stored Procedimientos an einem Beispiel. Gelegentlich
gibt der Fahrrad-Händler Nachlässe auf bestimmte Waren. In einer Werbeaktion sollen daher
die Preise bestimmter Artikel um einen vorgegebenen Betrag reduziert werden. El
dazugehörige Eintrag erfolgt in der RelationArtículo. Allerdings will der Händler sicherstellen,
dass der Rabatt nicht mehr als 50% beträgt, und setzt dazu folgende Prozedur in Oracle ein:

CREAR O REEMPLAZAR PROCEDIMIENTO


Rabatt(artnr Int, nachlass Numérico)
COMO
altPreis Numérico(8,2);
neuPreis Numérico(8,2);
COMENZAR

SELECCIONAR Precio EN altPreis


DE Artículo
DÓNDE anr = artnr;
neuPreis := altPreis - nachlass;
SI neuPreis < 0.5 * altPreis ENTONCES neuPreis := 0.5 * altPreis; TERMINARA SI;

ACTUALIZAR Artículo
COLOCAR Preis = neuPreis, Netto = Netto * neuPreis/altPreis, Steuer = Steuer *
neuPreis/altPreis
DONDE Anr = artnr; EXCEPCIÓN
CUANDO OTROS ENTONCES
DBMS_OUTPUT.PUT_LINE ('Fehler in Prozedur Rabatt'); FIN;

/
7.6 Procedimiento almacenado 265

Este Beispiel zeigt die Leistungsfähigkeit von Prozeduren auf. Aquí se realizará un
préstamo, y se obtendrá un máximo de 50% de descuento sobre el precio y un precio
reducido. Dies erfolgt komplett im Datenbanksystem. Der Benutzer führt nur einen Befehl
aus:

ejecutar rabatt(100002, 50)

Este otoño incluye un artículo de 100002 por 50 euros reducidos. Este Befehl zeigt auch die
hervorragende Handhabung: Auf einfachste Weise kann der Anwender jeden Artikel um den
gewünschten Betrag erniedrigen.
Un procedimiento enthält immer vier Teile:

1. Prozedurkopf mit Parametern


2. Deklarationsteil zwischen den BezeichnernComoyComenzar
3. Programmrumpf mit Anweisungen
4. Ausnahmebehandlung

Dabei können Teil 2 y 4 entfallen. Die Ausnahmebehandlung comenzó con el


BezeichnerExcepción. Con el BezeichnerCuando otros entonceswird darauf
bisagrawiesen, dass bei allen Fehlern der dann folgende Code ausgeführt wird. En Oracle
können wir Meldungen mit Hilfe der FunktionPut_Lineen el paqueteDbms_Salida
ausgeben. Weiter muss in Oracle in der Regel eine Prozedur mit einem Schrägstrich (“/“)
abgeschlossen werden.
Este procedimiento se incluye en SQL Developer después de los registros en el Stichwort
Procederangezeigt. Die Prozedur kann dort auch direkt gestartet werden.
Las aplicaciones entre Oracle, SQL Server y MySQL se encuentran entre
procedimientos almacenados. Esta es la situación con SQL Server:

CREAR PROCEDIMIENTO Rabatt @artnr Int, @nachlass Numérico (8,2) AS

DECLARAR @altPreis Numérico(8,2),


@neuPreis Numérico(8,2);
COMENZAR A INTENTAR

SELECCIONAR @altPreis = Preis


DE Artículo
DÓNDE anr = @artnr;
SET @neuPreis := @altPreis - @nachlass; SI
@neuPreis < 0.5 * @altPreis
ESTABLECER @neuPreis := 0.5 * @altPreis;
ACTUALIZARArtículo
COLOCAR Preis = @neuPreis, Netto = Netto
* @neuPreis/@altPreis,
Steuer = Steuer * @neuPreis/@altPreis Anr =
DÓNDE @artnr ;
266 7 Actuación en Datenbanken

FINALIZAR INTENTO

COMENZAR A CAPTAR

SELECCIONE 'Fehler beim Ausfuehren der Prozedur Rabatt'; FINAL DE


CAPTURA
IR

Die Unterschiede sind schnell erklärt. Opción de actualización de SQL ServerO reemplazar
nicht. Stattdessen gibt es zusätzlich den Alter-Procedure-Befehl. Los parámetros y variables se
activarán en el momento @ vorangestellt. Eine Rückgabe von Werten eines Select-Befehls
erfolgt durch Zuweisung im Select-Teil. Um im Fehlerfall eine Ausnahme zu werfen, wird ein
Try-Catch-Block verwendet.
Este procedimiento se realizará de la siguiente manera:

ejecutar rabatt 100002, 50

Alternativamente, este producto se puede gestionar y utilizar directamente en SQL


Server Management Studio. Wir finden die Prozedur internalhalb unserer eingerichteten
Datenbank unter dem StichwortProgramacióny dort bajoGespeicherte Prozeduren.

Zuletzt wollen wir auch noch MySQL incorporado. El código normativo de


MySQL:

DELIMITADOR //
CREAR PROCEDIMIENTO Rabatt(artnr Int, nachlass Numeric(8,2)) BEGIN

DECLARAR altPreis Numérico(8,2),


DECLARAR neuPreis Numérico(8,2);
SELECCIONAR Precio EN altPreis
DE Artículo
DÓNDE anr = artnr;
SET neuPreis = altPreis - nachlass;
SI neuPreis < 0.5*altPreis ENTONCES ESTABLEZCA neuPreis = 0.5*altPreis; TERMINARA
SI;
ACTUALIZAR Artículo
COLOCAR Preis = neuPreis, Netto = Netto * neuPreis/altPreis, Steuer = Steuer *
neuPreis/altPreis
DÓNDE Anr = artnr;
FIN; //

MySQL utiliza un desarrollador para asegurar el final de un proceso. Dieser wurde mit
dem BefehlDelimitadorGesetzt. Utilice un procedimiento en SQL Server para modificar el
procedimiento para su configuración. Ebenso müssen lokale Variablen mitDeclarar
deklariert werden, allerdings erst im Anweisungsteil. Un manual de usuario como Oracle
o SQL Server no está disponible en MySQL. Se puede utilizar MySQL 5.5
7.7 Otras mejoras 267

die Fehlerbehandlung aber die AufrufeSeñalyRenunciaverwendet werden. Wir rufen this


Prozedur auf mit:

llamar a rabat( 100002, 50 )

Este procedimiento se incluye en MySQL Workbench en el banco de datos actualizado bajo


el StichwortRutinaseingetragen.
Natürlich ist unser Beispiel nicht optima. Wir sollten beispielsweise in der Prozedur
noch überprüfen, ob der angegebene Artikel überhaupt existiert. Als Einführung mag
dieses Beispiel aber voll genügen. Wir verweisen im Weiteren insbesondere auf die
Handbücher der Datenbankhersteller.

7.7 Otras mejoras

Die Liste an weiteren Optimierungsmöglichkeiten ist sehr lang. Aquí sei im Detail auf
weiterführende Literatur verwiesen, insbesondere auf Connolly und Begg (2015), Elmasri
y Navathe (2002), Gulutzan y Pelzer (2002) y Kemper y Eickler (2015). Zwei Besonderheiten
sollen aber erwähnt werden.
En MySQL es estándar una configuración automática de confirmación. Es wird dringend
empfohlen, diesen Automatismus auszuschalten. Ein Commit ist ein recht aufwendiger Befehl,
der immer auch eine Ausgabe in die Redo-Logdatei (siehe Abschn.8.2.2) erzwingt. Darüber
hinaus ist kein sinnvoller Transaktionsbetrieb möglich.

I consejoEn MySQL seleccionaremos la confirmación automática.

Podemos conectarnos con el automatismoEstablecer confirmación automática = 0dauerhaft


ausschalten oder mitIniciar transacciónExplique una transacción iniciada. Wir verweisen auch auf
Abschn.8.7.3.
Eine erhebliche Performancesteigerung erhalten wir auch, wenn wir sehr ähnliche Befehle
nicht immer wiederholen. Wollen wir beispielsweise in einer Anwendung mehrere Aufträge und
deren Positionen ausgeben, so wäre ein mehrfaches Ausführen aufwendig. Wir wollen dies an
einem Beispiel zeigen, in dem wer die Auftragsdaten von Auftrag 1, 2 und 4 ausgeben wollen.
Configuramos PHP y PDO en Kap.6voraus:

$sql = "Seleccione Auftrnr, Artnr, Anzahl, Gesamtpreis


Desde Auftragsposten
Donde Auftrnr = ?" ; $conn-
$stmt = >preparar($sql);
$stmt->bindParam( 1, 1 ); // 1. Fragezeichen: Auftrag 1 $stmt->execute() ;

$stmt->bindParam( 1, 2 ); // 1. Fragezeichen: Auftrag 2 $stmt->execute() ;


268 7 Actuación en Datenbanken

$stmt->bindParam( 1, 4 ); // 1. Fragezeichen: Auftrag 4 $stmt->execute() ;

Este código es nur als Vorzeigebeispiel gedacht. In der Praxis werden zwischen den
einzelnen Execute-Aufrufen weitere Ausführungen erfolgen. Wichtig an diesem Beispiel
ist, dass wir den Query-Aufruf in dos Teile zerlegt haben, in eine Prepare- und eine
Execute-Methode. Der wesentliche Vorteil ist, dass der Parser nur ein einziges Mal
ausgeführt werden muss. Dies gilt auch für den Optimizer, immer vorausgesetzt, dass die
in der Restriktion verwendeten Parameter halbwegs gleichverteilt sind.
El métodoenlazarParamVerbindet die eventuell mehrfach vorkommenden Fragezeichen im
SQL-Befehl mit tatsächlichen Werten. El primer parámetro de este método gibt an, welches
Fragezeichen im SQL-Befehl, comienza en 1, ersetzt wird. Im zweiten Parameter steht der
Ersetzwert. Dies darf auch eine variable sein. In unserem Beispiel wurde das erste und einzige
Fragezeichen nacheinander mit den Werten 1, 2 und 4 verknüpft.

7.8 Fassammenfassung

Este capítulo ofrece un ajuste superior a las modificaciones del rendimiento en SQL. Da
Performancemaßnahmen no normiert sind, down sofort die doch erheblichen Unterschiede
der Implementierungen in den einzelnen Datenbanken auf. Trotzdem überwiegen die
Gemeinsamkeiten:
Todos los bancos de datos configuran un optimizador de alta calidad y unas
estadísticas mejoradas. Para poder utilizar Optimum zu arbeiten, verwenden diese
Optimizer neben der Anzahl der Zeilen je Relation auch die Anzahl der unterschiedlichen
Werte je Spalte je Relation. Der Kehrwert wird als Selektivität bezeichnet. Esta selección es
entscheidend, um bei Restriktionen und Gruppierungen die Anzahl der Zeilen der
Ergebnisrelation abschätzen zu können.
Herausragende Verbesserungen erhalten wir mit dem Setzen von Indexen, da die Zeilen
einer Relation nicht geordnet sind. Die Indexe sollten jedoch mit Bedacht eingesetzt werden.
Ein Zuviel kann leicht ein Zuviel des Guten sein.
Partitionierungen sind insbesondere bei sehr großen Relationen enorm hilfreich. Sie
reduzieren die Zugriffszeiten auf bestimmte Daten erheblich und beschleunigen dank
paraleloler Ausführungen auch umfangreiche Abfragen. Manche Abfragen enthalten viele
Verbundverknüpfungen (Uniones). Hier können bei häufigen Lesezugriffen materialisierte
Sichten deutliche Performancesteigerungen Bringen.
Ein Optimizer leistet in der Praxis eine hervorragende Arbeit. Doch nur der Anwender kennt
seine Daten am besten. Mit Sicherheit kann er durch geschickte Select-Befehle noch mehr an
Performance herausholen. Anregungen wurden in diesem Kapitel mehrfach gegeben. Auch das
Setzen von Hinweisen kann den Optimizer weiter verbessern.
Las acciones de rendimiento son enormes. En este capítulo no hay
procedimientos almacenados ni enlaces de parámetros.
7.9 Übungsaufgaben 269

7.9 Übungsaufgaben

Aufgaben
1. ¿Worin besteht der Mehraufwand des kostenbasierten Optimizers gegenüber dem
regelbasierten? ¿Warum werden heute trotzdem kostenbasierte Optimizer eingesetzt?

2. Der folgende Befehl gibt alle Auftragspositionen aus, die der KundeTienda Fahrrad con
sombrero Auftrag gegeben:

SELECCIONE A.Bezeichnung, AP.Anzahl, Datum


DESDE Auftrag NATURAL INNER ÚNETE Auftragsposten AP
INNER JOIN KUNDE K ON Nr=Kundnr INNER
JOIN Artículo A ON Anr=Artnr
WHERE K.Name = 'Tienda Fahrrad';

¿Cómo se activa el optimizador? Geben Sie den geänderten Befehl an.


3. Versehen Sie das AttributBezeichnungla relaciónArtículoen el Beispieldatenbank
Bicicletamit einem Index. Ist ein eindeutiger Index mittels des Bezeichners Único
sinnvoll?
4. In einem großen Dienstleistungsunternehmen werden zentral Aufträge
entgegengenommen und an Sachbearbeiter weitergeleitet, deren Einsatzort in
der Nähe des Kunden liegt. Dazu existe en el Datenbank eine RelationPersonal,
die die benötigten Daten der Sachbearbeiter speichert, insbesondere auch den
Namen und den Einsatzort. Wegen einer großen Anzahl von Sachbearbeitern ist
die Suche nach möglichen Sachbearbeitern in der Nähe des Kunden
zeitaufwendig. Schreiben Sie einen Index, um die alfabético Suche nach
Sachbearbeitern an bestimmten Einsatzorten zu beschleunigen.
5. La partición de rango está prohibida. Welche dos großen Vorteile bietet
this Partitionierung bei sehr großen Relationen?
¿Cómo es la partición de Hash?
6. Was ist der große Vorteil der Referenzpartitionierung? ¿Cómo se puede
realizar esta partición en SQL Server y MySQL?
7. Materialisierte Sichten müssen aktuell gehalten werden. Dies bedingt einen hohen
Aufwand. Wo werden daher diese Sichten fast ausschließlich eingesetzt und
warum?
8. Der Optimizer änderte den Befehl in Aufgabe 2 ab. ¿Warum wohl?
9. ¿Quieres un Merge-Join combinado con Nested-Loop-Join y Hash-Join por separado?
10. Warum beeinflusst eine Group-By-Klausel die Performance so negativ? Warum
kann in der Regel ein existierender Index auf das zu gruppierende Attribut nicht
verwendet werden?
11. Schreiben Sie un procedimiento almacenadoclase previa, die den Preis aller Artikel um den als
Parameter angegebenen Prozentsatz sentkt. Muere dorado también para el precio.
270 7 Actuación en Datenbanken

aller Aufträge. Die Prozedur überprüft, dass der Nachlass nicht großer als 10
Prozentpunkte beträgt.
12. Unsere Firma Bike hätte einen sehr großen Lieferantenstamm. Gesucht werden
häufig Lieferanten, die bestimmte Artikel liefern. Nacheinander sollen dann zu
einer Liste von Artikeln die entsprechenden Lieferanten angezeigt werden. ¿Cómo
puedo utilizar un programa PHP modificado?

Literatura

Alapati, S. (2013).Recetas de ajuste de rendimiento de Oracle Database 12c. Presione.


Connolly, T., & Begg, C. (2015).Sistemas de bases de datos(6. Aufl.). Pearson.
Fecha, CJ (2003).Una introducción a los sistemas de bases de datos(8. Aufl., Bd. 1). Addison-Wesley.
Dewson, R. (2012).Inicio de SQL Server 2012 para desarrolladores. Presione.
Elmasri, R., & Navathe, S. (2002).Grundlagen von Datenbanksystemen(3. Aufl.). Addison-Wesley. Fiorillo, C.
(2013).Libro de recetas de optimización del rendimiento de Oracle Database 11gR2. Paquete. Gulutzan, P., &
Pelzer, T. (2002).Ajuste del rendimiento de SQL. Addison-Wesley. Kemper, A., & Eickler, A. (2015).
Datenbanksysteme – Eine Einführung. Oldenburgo. Loney, K. (2009).Oracle11 g – La referencia universal.
Hanser.
Ottmann, T., & Widmayer, P. (2012).Algoritmos y estructuras de datos. Espectro. Schwartz, B., &
Zaitsev, P. et al. (2012).MySQL de alto rendimiento(3. Aufl.). O'Reilly. Shah, R., & Thaker, B. (2012).
Rendimiento de Microsoft SQL Server 2012. Libro de cocina de tuning. Paquete.
Unterstein, G., & Matthiessen, M. (2012).Bancos de datos relacionales y SQL en teoría y práctica.
Saltador.
Concurrencia y recuperación
8

Supervisión
Der Aufbau von Datenbanken und der Zugriff auf diese Datenbanken wurden in den
vorhergehenden Kapiteln ausführlich besprochen und geübt. In der Praxis ist
entscheidend, dass diese Zugriffe die Konsistenz einer Datenbank unter keinen
Umständen verletzen, auch nicht im Fehlerfall, und auch dann nicht, wenn hundente
Anwendungen paralelo zugreifen. Wir wollen in diesem Kapitel ausgiebig über die
Sicherstellung der Konsistenz in Situationen wie Parallelbetrieb und Rechnerabsturz
sprechen.
Unter Recovery verstehen wir die Rekonstruktion einer Datenbank im Fehlerfall.
Aufgabe der Recovery ist es, nach aufgetretenen Problemen und Fehlern die Konsistenz
der Daten zu gewährleisten. Unabhängig von der Art der Probleme, wie etwa plötzlicher
Rechnerausfall oder sogar Feuer im Rechenzentrum, muss die konsistente
Wiederherstellung der Daten möglich sein.
concurrencia ist der englische Begriff für Parallelbetrieb. Gefordert ist hier das
Zulassen gleichzeitiger Zugriffe mehrerer Benutzer auf eine Datenbank. Ohne
entsprechende Maßnahmen können durch solch gleichzeitige Zugriffe
Konsistenzverletzungen und Datenverlust auftreten. Dies lässt sich mit
entsprechenden Synchronisationsmechanismen unterbinden.

Wir stellen die Probleme und dazugehörigen Lösungen zu Recovery und Concurrency in
diesem Kapitel ausführlich vor. Wir verwenden die englischen Bezeichnungen, da sie auch in
der deutschsprachigen Literatur weit verbreitet sind.
Para todos los apostantes, todos los bancos de datos pequeños tienen en cuenta la
recuperación y la concurrencia. En los sistemas pequeños, habrá más seguridad de
seguridad, y en las posiciones se eliminarán los daños causados por el fuego. Muere
272 8 Concurrencia y Recuperación

kann aber auch hier schon sehr mühsam, aufwendig und fehleranfällig sein. Parallelbetrieb wird in
diesen Datenbanken a menudo no rudimentär unterstützt.
Ein ganz other Bild ergibt sich in großen Rechenzentren. Betrachten wir nur die
Datenbanken großer Versicherungen und Banken. Die Daten müssen ständig und von überall
verfügbar sein. Datenverluste und Inkonsistenzen müssen unter allen nur denkbaren
Umständen verhindert werden. Gleichzeitig müssen diese Datenbanken effizient betrieben und
kurze Antwortzeiten garantiert werden. Sicherheit und Konsistenz auf der einen und schnelle
Transaktionen auf der der anderen Seite scheinen sich zuwidesprechen. Mit hohem
technischen Aufwand und entsprechenden Algorithmen lassen sich die Anforderungen aber
lösen. Werden dies aufzeigen.
Trotz der scheinbar verschiedenen Zielsetzungen verzahnen sich Recovery und
Concurrency. La recuperación debe realizarse en paralelo y la concurrencia no es
una recuperación rudimentaria. Insbesondere sind beide Begriffe sehr eng mit der
Transaktionsverarbeitung verbunden. Comenzaremos este Kapitel daher mit einem
Überblick über den Transaktionsbetrieb.

8.1 Transacciones en bancos de datos

En la guarida Abschn.1.5y1.6wurde die Wichtigkeit von Transaktionen im


Datenbankbetrieb betont: Das KonsistenzmodellÁCIDOfordert Atomarität, Konsistenz,
Isolation und Dauerhaftigkeit. Eine Transaktion ist nach Definición eine
konsistenzerhaltende Operation. Wir arbeiten daher nur mit Transaktionen und schließen
diese an Konsistenzpunkten ab. Estos puntos de coherencia son los correctos del diseño
del banco de datos y de los programas de cambio autorizados.
Damit eine Datenbank immer konsistent bleibt, muss Atomarität garantiert werden: Jede
einzelne Transaktion wird entweder vollständig ausgeführt oder überhaupt nicht! Und jede
einzelne Transaktion läuft transparent und nachvollziehbar ab, also unabhängig davon, ob sie
sich allein im System befindet oder noch hundente weitere Transaktionen paralelo ausgeführt
werden. Estos productos deben estar completamente llenos, y también en todos los casos, sin
peligro. Garantizamos que todos los pagos se realizarán en un banco de datos con tres cuentas
bancarias:

- Eine Transaktion wird immer vollständig zurückgesetzt, wenn sie wegen aufgetretener
Fehler nicht beendet werden kann (Atomarität).
- Eine abgeschlossene Transaktion ist persistente gespeichert und kann auch bei Ausfall der
gesamten Datenbank rekonstruiert werden (Dauerhaftigkeit).
- Eine Transaktion läuft immer so ab, als sei sie allein im System. Insbesondere bleibt die
Konsistenz der Transaktion unberührt (Konsistenz, Aislamiento).

Moderne Datenbanksysteme erfüllen diese tres Anforderungen. Dazu wird der


Parallelbetrieb mit Hilfe von Locks serialisiert, jeder Datenbankzugriff protokolliert und jede
8.1 Transacciones en bancos de datos 273

Änderung sofort sicher abgespeichert. Im Fehlerfall können damit noch offene Transaktionen
vollständig zurückgesetzt und bereits abgeschlossene Transaktionen wiederhergestellt
werden.
Wir wollen insbesondere das Problem der Atomarität an einem einfachen Beispiel
aufzeigen: Ein Reisender bucht einen Flug von Berlin nach San Francisco. Er legt dabei
Zwischenlandungen en Frankfurt y Nueva York ein. Er bucht also genau genommen drei
Einzelflüge, siehe Abb.8.1. Natürlich soll jede einzelne Buchung nur erfolgen, wenn auch die
beiden anderen durchgeführt werden. Die drei Buchungen sind demnach eine atomare Einheit:
Wir benötigen eine Transaktion!
Wir belegen also nacheinander je einen freien Platz in drei Flugzeugen und schließen zum
Schluss diese Transaktion mit dem BefehlComprometerseab. En PHP puedes seguir lo
siguiente:

$conn->query(ACTUALIZAR Flugbuchung SET... ) ;//Berlín - Frankfurt $conn-


>query(ACTUALIZAR Flugbuchung SET... ) ;//Frankfurt - NuevaYork $conn-
>query(ACTUALIZAR Flugbuchung SET... ... ) ;//Nueva York -
//San Francisco
$conn->commit() ; //Transacción abschließen

Misslingt eine dieser tres Buchungen, así que wird in den Catch-Block gesprungen und die
Transaktion mittels eines Rollback-Befehls zurückgesetzt. El modelo de coherenciaÁCIDO wird
also bei korrekter Programmierung vollständig unterstützt.
Stürzt jedoch mitten in dieser Transaktion der Rechner ab, oder werden paralelo dazu
weitere Buchungen für die gleichen Flügen durchgeführt, so können ernste Probleme
auftreten. Sind die Flüge bereits fast ausgebucht, so kann dies zu Überbuchungen führen. Nach
Rechnerabstürzen könnten Teilflüge bereits reserviert sein, nicht jedoch der gesamte Flug. Es
lägen also Reservierungen vor, die in Wirklichkeit letztlich nicht stattfanden. ¡En todos estos
casos el banco de datos no es más coherente! Eine Datenbank muss demnach sowohl in der
Recovery als auch im Parallelbetrieb (Concurrency) dafür sorgen, dass die eben geschilderten
Probleme nicht auftreten können.

Buchung 1 Buchung 2 Buchung 3

Berlina Francfort Nueva York San Francisco

Tejido. 8.1Flugbuchung como transacción


274 8 Concurrencia y Recuperación

8.2 Recuperación

Die Recovery befasst sich mit demWiederherstellen von Daten nach aufgetretenen
schweren Fehlern. Estos Fehler lassen sich grob in dos Klassen einteilen, en Hardware-
und Softwarefehler. Eine kleine Liste dieser Fehler ist im Folgenden angegeben:

Ferretería FehlerStromausfall, Wackelkontakte, Festplattenausfall,


Arbeitsspeicherausfall, Netzausfall, Brand (Feuer und Löschwasser).

Software FehlerFehler in der Datenbanksoftware, im Betriebssystem, im


Anwendungsprogramm, in der Übertragungssoftware.

Eine gewisse Vorsorge wird ein Datenbankadministrator dadurch treffen, dass er die Hardund
Software auch nach dem Gesichtspunkt der Zuverlässigkeit auswählt. Dies minimiert die
Ausfallrate, ganz verhindert wird sie dadurch jedoch nicht. Die grundsätzliche Forderung im
Fehlerfall ist, dass keine Daten verlorengehen, dass eine Rekonstruktion aller Daten also immer
möglich ist,y dass dabei die Datenbank-Integrität und -Konsistenz erhalten bleibt.

Prinzipiell wird daher ein Administrator mehrstufig vorgehen: Er wird mindestens einmal
pro Woche eine Komplettsicherung und täglich eine Differenzsicherung des Datenbestandes
vornehmen. Werden werden alle Änderungen in der Datenbank protokolliert. Este
"elektronische Logbuch" está altoLogdatei oderArchivo de registro .
Eine Zusammenfassung dieser Vorgehensweise se encuentra en la pestaña.8.1. Wir sind uns
im Klaren, dass diese Sicherheitsmaßnahmen aufwendig sind. Die umfangreichen Sicherungen
können wir in die ruhigen Nachtstunden verlagern. Das Mitprotokollieren aller Änderungen
bisagragen belastet die Datenbank im normalen Produktionsbetrieb. Wir können jedoch auf die
Logdatei no verzichten, da wir nur so die Konsistenz der Daten auch im Fehlerfall garantieren
können. Stürzt nämlich ein Rechner mitten in einer Transaktion ab, so muss diese Transaktion
beim Wiederaufsetzen der Datenbank zurückgesetzt werden. Die Alternative, diese Transaktion
fortzusetzen und zu beenden, liegt in der Regel nicht vor, da die Recovery nicht weiß, welche
Aktionen noch hätten durchgeführt werden müssen. Aber dank einer persistenten Logdatei
können wir umgekehrt nachvollziehen, welche Aktionen offene Transaktionen bisher bereits
durchgeführt haben. Und genau diese können wir dann zurücknehmen.

Pestaña. 8.1Forderungen an eine Sicherung des Datenbestandes

Zeitlicher Rahmen Seguridad


wöchentlich Komplettsicherung des Datenbestandes
etiqueta diferenciación
im laufenden Betrieb Protokollierung jeder Änderung in einer Logdatei
8.2 Recuperación 275

También podemos acceder a las Forderungen en Tab.8.1nicht verzichten. Además, el


Datenbank hochperformant ablaufen. Daher ist es naheliegend, möglichst viele Daten im
Arbeitsspeicher zu halten, um die langsamen Zugriffe auf die Festplatten zu minimieren. Ein
plötzlicher Ausfall des Arbeitsspeichers zeigt aber gerade dann verhehrende Wirkung. Wir
müssen also sicherstellen, dass jede noch so kleine Änderung sofort in die Logdatei
geschrieben wird. Die Logdatei befindet sich in einem persistenten Speicherbereich, in der
Regel auf einer Festplatte. Nur so können im Fehlerfall alle Änderungen noch nicht
abgeschlossener Transaktionen nachvollzogen und rückgängig gemacht werden.

8.2.1 Recuperación y registro

Para una transacción en Fehlerfall wiederherstellen zu können, müssen geänderte Daten nicht
nur in der Datenbank sondern auch in einer Logdatei gespeichert werden. Nur so können
geänderte Datenbankdaten gegebenenfalls wieder zurückgenommen werden. Dass wir die
Logdatei auf einem nichtflüchtigen Medium ablegen, versteht sich von selbst. Weiter dürfte
offensichtlich sein, dass das Abspeichern der Logdatennoche auf demselben Medium erfolgen
sollte, auf dem die Datenbank gespeichert ist. Ein Ausfall dieses Mediums, in der Regel eine
Magnetplatte, würden die Logdaten und die Datenbankdaten gleichzeitig zerstören, eine
Recovery wäre nicht mehr möglich.
seguridady Performance müssen im Datenbankbetrieb gewährleistet sein. Ein moderner
Datenbankbetrieb erfüllt daher heute folgende Voraussetzungen:

- El banco de datos es un medio externo no autorizado y directo del servidor del


zugreifbar.
- Las fechas de registro se encuentran en un medio externo no autorizado y sin
acceso directo al servidor.
- Zur Entlastung des Ein- und Ausgabeverkehrs und zur Performancesteigerung werden
gelesene Datenbankdaten in einem internen Arbeitsspeicherbereich (Datenbank-
Puffer, inglés: Cache) möglichst lange zwischengespeichert.
- Alle Daten werden vom Datenbank-Puffer gelesen. Sind die gesuchten Daten nicht im
Puffer, so werden diese zunächst von der Datenbank in den Puffer geholt.
- Todos los Schreibvorgänge erfolgen im Datenbank-Puffer. Die Aktualisierung der
Datenbank es asincrónico zu einem späteren Zeitpunkt.

Die Informationen, welche Daten der Datenbank im Puffer stehen, und welche geändert
wurden, heißenMetadatos und werden in einem eigenen Bereich im Arbeitsspeicher verwaltet.
Zu den Metadaten zählen auch die Informationen zu allen offenen Transaktionen und über die
Synchronization beim Puffer- und Logdatenzugriff.
Die Datenbankpufferung im Arbeitsspeicher reduziert sowohl die Laufzeiten als auch
den Datentransfer zwischen Datenbank und Arbeitsspeicher erheblich. Los grandes
bancos de datos Puffers pueden almacenar cientos de Gigabytes. Die Verwaltung dieses
276 8 Concurrencia y Recuperación

komplexen Datenbankbetriebs übernimmt das Datenbankverwaltungssystem. Eine Übersicht


über die Arbeitsweise einer Datenbank mit Datenbankpufferung und Sicherung in die
Logdateien vermittelt Abb.8.2.
Wir beachten die Pfeile in Abb.8.2. Wir schreiben in die Datenbank und in die Logdateien,
wir lesen aber ausschließlich von der Datenbank. Das Schreiben in die Logdateien wird für die
Recovery zwingend benötigt, hier lässt sich wenig optimieren. Anders verhält es sich mit dem
Lesen und Schreiben in und von der Datenbank. Esta transferencia de datos será mínima. Da
wir Änderungen in noch nicht beendeten Transaktionen im Recovery-Fall zurücksetzen müssen,
bietet sich der in Tab.8.2Algoritmo an.
Die Besonderheit dieses Algorithmus ist, dass wir alle Änderungen zunächst nur in die
Logdateien schreiben. Von der Datenbank selbst wird insidehalb der Transaktion
höchstens gelesen. Antes de que las transacciones se realicen en el banco de datos
exportado. Für die Recovery ist es ganz wichtig, dass wir sowohl die zu ändernden Daten
als auch die Änderungen in den Logdateien ablegen.

IDefinición: imagen anterior, imagen posteriorDie zu ändernden Daten in einer Datenbank heißen
Imagen anterior . Die neuen, geänderten Daten heißenImagen posterior .

Im Falle eines Rollbacks werden alle von der Transaktion vorgenommenen Änderungen
mittels der Before-Images zurückgenommen. Um nicht von den Logdateien lesen zu müssen,
werden die Before-Images in der Regel bis Transaktionsende zusätzlich in den Metadaten
hinderlegt. Da Änderungen der Transaktion noch nicht in die Datenbank

Arbeitsspeicher:
Datenbank-Puffer (caché): Metadatos:

bloque
3

Logdateien

1 2
1: Lesen aus der Datenbank, caídas
Daten nicht im Cache
2: Schreiben en el Datenbank, cae
Platz im Cache benötigt wird
3: Ständiges Sichern in die Log-
dateien
banco de datos

Tejido. 8.2Funciones de registro de datos y DB-Puffers


8.2 Recuperación 277

Pestaña. 8.2Transaktionsbetrieb mit Log und Arbeitsspeicherpufferung

Daten werden von der Datenbank eingelesen, falls sie


Leer las fechas
no bereits im Puffer des Arbeitsspeichers sind.
Sichern der bishe- Zu ändernde Daten werden in die Logdatei geschrieben
rigen daten (Imagen anterior).
Por debajo (Actualizar/Eliminar/Insertar) der Daten im
Ändern der Daten
Arbeitsspeicher, Sperren der Einträge für andere Benutzer.
Sichern der geän- Geänderte Daten werden in die Logdatei geschrieben
fecha de derten (Imagen residual).
Obige vier Schritte wiederholen sich internalhalb einer
...
Transaktion in der Regel mehrfach.
transacciones Transaktionsende in Logdatei schreiben. Sperren
con COMPROMISO freigeben. Änderungen in die Datenbank schreiben.
Rücksetzen der Metadaten der Transaktion.
transacciones
Geänderte Daten im Arbeitsspeicher mittels der
con reversión
Before-Images restaurieren. Sperren freigeben.

geschrieben wurden, muss auf die Datenbank selbst nicht zugegriffen werden. Gegebenenfalls
muss nur der zurückgesetzte Block im Cache für ungültig erklärt werden, um alle Spuren der
Änderung zu verwischen. Bei einem erneuten Zugriff werden dann die Originaldaten von der
Datenbank gelesen. ¡Und dort befindet sich ja noch der Datenstand zu Beginn der Transaktion!

Stürzt der Datenbankserver ab, so können wir den Zustand des Datenbankpuffers mit
Hilfe der Before-Images reconstruieren. Alle noch offenen Transaktionen werden
zurückgesetzt. Sollte der Arbeitsspeicher nach dem Absturz nicht mehr zugreifbar sein, so
ist nach dem Hochfahren keine Aktion erforderlich. Offene Transaktionen sind damit
automatisch gelöscht, die Datenbank muss no restauriert werden.
Allerdings kann es vorkommen, dass bei einem Rechnerabsturz Daten abgeschlossener
Transaktionen noch nicht vollständig in die Datenbank geschrieben wurden, oder dass die
Datenbank selbst zerstört ist. Jetzt hilft uns, dass wir auch den Abschluss einer Transaktion in
den Logdateien vermerkten. Im schlimmsten Fall, einem Totalverlust der Festplatte mit allen
Datenbankdaten, spielen wir die letzte Sicherung ein. Anschließend vollziehen wir alle
Transaktionen mittels der After-Images nach. Änderungen, die zu keiner bereits beendeten
Transaktion gehören, werden dabei übersprungen. Wir erhalten am Ende den neuesten
konsistenten Stand der Datenbank.
Der en la pestaña.8.2Beschriebene Transaktionsbetrieb es einfach, besitzt aber auch Schwächen:

- Daten von sehr lange laufenden Transaktionen müssen im Arbeitsspeicher gehalten


werden.
- Ein Absturz während des Schreibens der geänderten Daten am Transaktionsende bedarf
einer komplexen Recovery, da überprüft werden muss, welche Daten schon geschrieben
wurden und welche nicht.
- Das Schreiben immer zu Transaktionsende kann zu punktuellen Überlasten führen.
278 8 Concurrencia y Recuperación

Pestaña. 8.3 Transaktionsende in der Praxis

transacciones Transaktionsende in der Logdatei vermerken. Sperren


con COMPROMISO freigeben.
Rücksetzen der Metadaten der Transaktion. Geänderte
Daten im Arbeitsspeicher werden mittels der Before-
transacciones
Images restauriert. Alle geänderten Daten, die bereits in
con ROLLBACK
die Datenbank geschrieben wurden, werden für ungültig
erklärt. Sperren werden freigeben.
Enderungen Geänderten Daten werden asynchron (unabhängig
discurso von Transaktionen) in die Datenbank geschrieben.

Insgesamt ist dieser einfache Betrieb zu inflexibel und wird daher in der Praxis nicht
eingesetzt. Stattdessen wird zusätzlich erlaubt, Daten jederzeit in die Datenbank
schreiben zu dürfen, unabhängig davon, ob eine Transaktion bereits abgeschlossen ist
oder nicht. Ebenso ist es nicht erforderlich, Daten von beendeten Transaktionen schnell in
die Datenbank zu exportieren. Wir ändern das en Tab.8.2beschriebene Transaktionsende
zu dem in Tab.8.3Algoritmo descrito.
Der wesentliche Unterschied zum vorhergehenden Verfahren ist, dass wir jederzeit das
Schreiben in die Datenbank zulassen. Beim Rollback y bei der Recovery deben quedar en la
playa, dass eventuell bereits geänderte Daten von noch nicht abgeschlossenen Transaktionen
in der Datenbank gespeichert wurden. Estas imágenes deben usarse con imágenes anteriores.
Ebenso sind die gespeicherten Datenbankdaten no notwendigerweise aktuell. Änderungen
auch abgeschlossener Transaktionen werden häufig mit Verzögerung in die Datenbank
geschrieben. Im Recovery-Fall müssen daher gegebenenfalls die entsprechenden After-Images
in die Datenbank übernommen werden.
Mit dem letztgenannten Verfahren bleibt der Datenbankbetrieb flexibel, und gleichzeitig
wird im Fehlerfall optima reagiert. Natürlich hängt die Gesamt Performance des Systems zum
Großteil vom Aufbau der Logdateien ab. Schließlich schreiben wir ununterbrochen in diese
Dateien. Im nächsten Abschnitt schauen wir uns diese Logdateien daher etwas genauer an.

8.2.2 Aufbau der Logdateien

In einer Datenbank können pro Sekunde viele Tausend Änderungen vorgenommen


werden, die alle umgehend in die Logdateien geschrieben werden. Dies erfordert einen
auf hohen Durchsatz ausgerichteten Aufbau dieser Logdateien. Zum näheren Verständnis
comienza con un Kurzüberblick über den Aufbau von Speichermedien im Allgemeinen.
Jedes Speichermedium (z. B. eine Festplatte) wird vor dem Erstgebrauch formatiert. Dabei
werden alle Speicherplätze dieses Mediums in gleiche Einheiten zusammengefasst, in
sogenannte Blöcke. El tamaño de bloque grande es máximo de 2 kilobytes (2 kB). En
pequeños bancos de datos desde 2 kB hasta 4 kB, en grandes bancos de datos
8.2 Recuperación 279

También 16 kB o 32 kB, incluidos hasta 64 kB. Diese Blöcke sind die Einheit der Ein- und
Ausgabe. ¡Wir lesen und schreiben also nicht einzelne Bytes sondern immer ganze Blöcke!
Erhöhen wir also das Gehalt eines Mitarbeiters um 3%, por lo que ändern wir nur wenige
Bytes, schreiben aber immer immeren ganzen Block, beispielsweise 16 kB. Analog lesen wir von
der Datenbank immer einen ganzen Block in den Datenbankpuffer (siehe Abb.8.2).
Und jetzt kommt die Performance bei Logdateien ins Spiel. Während wir beim Zugriff auf die
Datenbank immer ganze Blöcke lesen und schreiben müssen, merken wir uns in den
Logdateien nur die Before- and After-Images. Doch auch in die Logdatei schreiben wir nur
blockweise. Aus diesem Grund fassen wir mehrere Änderungen, auch die von otras
transacciones, zusammen. Und erst wenn ein Block voll ist, schreiben wir diesen in die
Logdatei. Somit entspricht ein einziger Schreibvorgang in eine Logdatei vielen Änderungen in
der Datenbank. Da wir außerdem nur sequentiell in die Logdateien schreiben, müssen wir den
Lese-/Schreibkopf der Festplatte nicht bei jedem Zugriff neu positionieren. Estos formatos de
archivo mejorados también incluirán transmisión gratuita y una duración de grabación
extrema, por lo que también se pueden reproducir archivos de video de lectura normal con una
duración de más de 100 MB por segunda vez. Darüber hinaus speichern wir in der Praxis die
Protokolle in mehrere Logdateien, was den Maximaldurchsatz weiter erhöht. En este caso
Logdateien Hinterlegen wir:

- Todas las imágenes anteriores con número de transacciones y tiempo de tiempo


- Todas las imágenes posteriores con número de transacciones y tiempo de tiempo

- Dazugehörige Metadaten wie Transaktionsnummer, Transaktionsende, gehaltene Sperren

Wird eine Datenbank zerstört, así que müssen wir auf die letzte Sicherung zugreifen und alle
Änderungen abgeschlossener Transaktionen seit dieser Sicherung mit Hilfe der After-Images
nachvollziehen. Noch offene Transaktionen werden mittels der Before-Images zurückgesetzt.

Wir sehen, dass wir für die Recovery alle After-Images seit der letzten Sicherung benötigen.
Von den Before-Images brauchen wir bisagragen nur die Daten der noch nicht beendeten
Transaktionen. Podemos dar todas las imágenes anteriores al final de una transacción. Die
After-Images bewahren wir aber auf jeden Fall bis zur nächsten Sicherung auf! Dies ist der
Grund, warum die Logs auf mindestens dos Dateien verteilt werden.

IDefinición: Deshacer registro, Rehacer registroUna fecha de registro, todas las imágenes anteriores y
metadatos modificados se activan, deshacer registro o deshacer registro.
Eine Logdatei, die alle After-Images und dazugehörige Metadaten enthält, heißt Redo-Logdatei
oder kurzRehacer registro .

Las fechas internas de los registros de deshacer se guardan en el intervalo de tiempo


relativamente corto, ya que las transacciones se realizan en menos segundos. Andererseits gibt es
Situationen, etwa bei Concurrency-Problemen, wo Undo-Daten noch eine gewisse Zeit benötigt
280 8 Concurrencia y Recuperación

werden. En Oracle gibt es beispielsweise eine einstellbare Zeitspanne, in der garantiert wird,
dass Undo-Daten nicht gelöscht werden. Gleichwohl ist es nur eine Frage von Minuten, in der
Daten immer wieder überschrieben werden. Aus Performancegründen wird empfohlen, este
Undo-Log auf einer eigenen Festplatte oder SSD abzulegen. En Oracle ab V11 g, los juegos de
palabras se ajustan automáticamente a un banco de datos con nombres propios de espacios
de tablaDesdotbs1für die Undo-Daten angelegt.
El registro de deshacer se utilizará para la recuperación y también en la reversión para
finalizar las transacciones realizadas. El Redo-Log se activará únicamente para la
recuperación y se escribirá de forma secuencial. Ein Lesen erfolgt nur im Recovery-Fall.
Redo-Logs können sehr groß werden, da die Logdaten bis zur nächsten Datensicherung
gespeichert werden müssen. Gleichzeitig soll das Schreiben in das Redo-Log
hochperformant erfolgen. In der Praxis werden daher meist mehrere Redo-Logdateien
eingesetzt, in Oracle sind mindestens zwei Redo-Logdateien vorgeschrieben. Es posible
que se utilicen más anillos, estos Redo-Logs se abrirán en los propios medios.
El tamaño máximo de un registro de rehacer está en MySQL en la versión 5.6 de 512
GB, pero en otros sistemas el tamaño máximo no está explícito. En SQL Server y Oracle
podemos archivar los Redo-Logs, en Oracle enRegistros de archivo , en SQL Server en una
sola personaCopias de seguridad de registros . Los juegos de Redo-Logs y los Redo-Logs
archivados se mostrarán en el juego de Oracle.
Oracle schreibt zwingend dos Redo-Logs vor, empfiehlt aber mindestens drei, die meist
Rehacer01.log,Rehacer02.lognosotros. heißen. Estos registros de rehacer son relativamente
pequeños, en el rango no son 100 MB. Die genaue Größe legt der Administrator fest. Ist nun das
erste Redo-Log mit Daten gefüllt, so werden folgende Aktionen angestoßen:

- Todos los demás Redo-Einträge aparecen en el último Redo-Log


- El Redo-Log se guarda en un archivo Archiv-Redo-Log
- Todas las operaciones realizadas en el Redo-Log se realizan en el banco de
datos.
- Das Redo-Log no se activará

En Abd.8.3gehen wir davon aus, dass die Redo-DateiRehacer01gefüllt sei. Die Aktionen
sind in dieser Abbildung durch Pfeile angedeutet. Das Gleiche geschieht, wenn die Datei
Rehacer02vollgeschrieben ist. Ist auch die letzte Redo-Datei gefüllt, so wird zyklisch zur
ersten zurückgesprungen. Diese sollte mittlerweile gelöscht sein und wieder zum
Beschreiben zur Verfügung stehen. Dieses Vorgehen hat große Vorteile. La fecha de
rehacer se mantiene en el medio adecuado, el registro de rehacer archivo también puede
colocarse en la banda magnética interna. Además, en Recovery-Fall solo se activan y no se
activa el Redo-Log, ya que todas las otras fechas bancarias están activas.
Es ist äußerst unwahrscheinlich, dass sowohl der Rechner als auch die Datenbank und die
Redo-Dateien ausfallen. Auszuschließen ist dies jedoch nicht. Faste alle Datenbankhersteller
bieten daher an, die Redo-Dateien automatisch zu multiplexen, also doppelt zu halten. Extrem
sicher fahren Datenbankbetreiber, wenn sie den gesamten Datenbank-
8.2 Recuperación 281

Zyklisches
Überschreiben

Rehacer01 Rehacer02 Rehacer03

wen voll

Archivo
Registro
banco de datos

Tejido. 8.3Rehacer registros y archivar registros en Oracle

betrieb spiegeln, einschließlich Rechner und Datenbank. Este escenario es extremadamente


adecuado para las fechas estándar. Sicherheitshalber werden die Spiegelsysteme räumlich
getrennt betrieben, um auch im Katastrophenfall, etwa bei Flugzeugabstürzen, sofort mit einer
Kopie weiterarbeiten zu können.
Das zyklische zwingende Schreiben aller geänderten Daten in the Datenbank erfolgt in
Oracle automatisch, wenn ein Redo-Log is gefüllt. Aber auch in other Systemen werden
Änderungen regelmäßig in die Datenbank geschrieben. Dies erfolgt immer zu
bestimmten Ereignissen, den Checkpoints. Die Bedeutung von Checkpoints beschreiben
wir im nächsten Abschnitt.

8.2.3 Recuperación y puntos de control

Im letzten Abschnitt wurde aufgezeigt, wie durch ausgefeilte Algorithmen and der paralelon
Protokollierung in Redo- and Undo-Logs der sichere Datenbankbetrieb effizient garantiert
werden kann. Damit aber im Fehlerfall die Recovery schnell abläuft, und die Datenbank meist in
wenigen Minuten wieder zur Verfügung steht, bedarf es weiterer Überlegungen, auf die wir im
Folgenden eingehen.
Betrachten wir nochmals Abb.8.2und den im Arbeitsspeicher befindlichen Datenbankpuffer.
Ist dieser Puffer groß genug, so können einmal gelesene Daten enorme lange im
Arbeitsspeicher gehalten werden. Somit können Blöcke immer wieder beschrieben werden,
ohne jemals auf die Datenbank zurückgeschrieben und wieder gelesen werden zu müssen. Die
Anzahl der Lese- und Schreibvorgänge auf die Festplatte bleibt sehr klein, die Antwortzeiten
wegen der schnellen Zugriffe auf den Arbeitsspeicher sind erfreulich niedrig.
282 8 Concurrencia y Recuperación

In der Praxis wird aber irgendwann auch der größte Puffer voll. Um neue Blöcke
einlesen zu können, müssen bestehende verdrängt werden. Aquí puedes ver el
algoritmo LRU y:

IDefinición: Algoritmo LRUEl algoritmoLRU (Usado menos recientemente) wählt aus einer
gegebenen Anzahl von Daten diejenigen aus, die am längsten nicht mehr verwendet wurden.

Este algoritmo se utilizó en Betriebssystemen und Datenbanken, siehe etwa Elmasri,


Navathe (2002). In der Praxis werden modifizierte LRU-Algorithmen zum Verdrängen von
Blöcken aus dem Datenbankpuffer eingesetzt. Es gibt im Detail mehrere Varianten dieses
Algorithmus. Ihnen liegt immer folgende Idee zugrunde:
Der gesamte Datenbankpuffer wird in two Teile eingeteilt, in den eigentlichen Puffer mit
den Datenbankblöcken und in einen Bereich von Blöcken, die frei verfügbar sind. Bei den freien
Blöcken unterscheiden wir zwischen den Blöcken, die sofort verwendet werden können und
denjenigen, die zunächst noch in die Datenbank geschrieben werden müssen. Dies ergibt in
Summe das in Abb.8.4gezeigte Gesamtbild. Die Grenzen zwischen freien und verwendeten
Blöcken sind dabei fließend.
Immer wenn die Anzahl der freien Blöcke unter einen vorgegebenen Grenzwert fällt, wird
ein Programm aufgerufen, das eine großere Anzahl von lange nicht mehr verwendeten Blöcken
ermittelt und dem freien Bereich zuordnet. Alle nur gelesenen Blöcke werden sofort
freigegeben, alle noch zu schreibenden Blöcke kommen in einen Spezialbereich (en Abb.8.4
derechos unten). Alle sich dort befindlichen Blöcke werden jetzt sofort in die Datenbank
geschrieben. Anschließend werden sie ebenfalls den freien Blöcken zugeordnet.
Dieses hocheffiziente Verfahren führt dazu, dass Blöcke, auf die immer wieder zugegriffen
wird, nie verdrängt werden. Solche Blöcke heißenPuntos calientes . Estos sind aus
Performancegründen erwünscht, da sie die langsamen Festplattenzugriffe reduzieren. Es gibt
aber auch dos wichtige Gründe, Hot Spots zu vermeiden:

Datenbank-Puffer (caché):

Bloque libre

bloque

Bloque libre
(noch zu schreiben)

Tejido. 8.4Modificación del algoritmo LRU en Datenbankpuffer


8.2 Recuperación 283

- Hot Spots führen dazu, dass der Datenstand auf der persistenten Festplatte sehr alt
sein kann. Im Fehlerfall muss dann dieser Datenstand Schritt für Schritt aufwendig
aktualisiert werden.
- Hot Spots führen dazu, dass die dazugehörigen Metadaten nicht gelöscht werden können.
Aus Performancegründen werden die Metadaten in der Regel zyklisch überschrieben. Esto
se esconde detrás de los puntos calientes.

Wir wollen den letzten Punkt noch etwas genauer trachten. Wir puffern mit den
Datenbankblöcken auch alle dazu benötigten Informationen, etwa den Zeitstempel der
jeweiligen Änderung zusammen mit der Transaktionsnummer, meist auch Before- und
Afterimage. Esta información se almacena en el banco de datos metadatos y se puede utilizar
para realizar transacciones abgeschlossene de forma segura, cuando el bloque dazugehörige
en el banco de datos se registra y se actualiza. Um die Metadaten effizient zu verwalten,
werden diese Daten als frei markiert, wenn sie nicht mehr benötigt werden. Die alten
Metadaten werden durch die neuen zyklisch überschrieben. Dies setzt allerdings voraus, dass
die alten Metadaten auch wirklich gelöscht werden dürfen.
Die Metadaten ließen sich anders, wenn auch nicht ganz so performant verwalten. Dass im
Fehlerfall aber alle Änderungen aller Hotspots nachvollzogen werden müssen, würde enorme
viel Aufwand und Zeit kosten. Es könnte Stunden dauern, bis die Daten beim Neuaufsetzen
wieder aktuell sind. So lange wollen Anwender und Kunden in der Regel aber unter keinen
Umständen warten.
Wir müssen demnach die Hotspots entschärfen. Dazu schreiben wir alle geänderten Blöcke
des Datenbankpuffers zwangsweise in die Datenbank zurück. Estos Zeitpunkte Heißen puestos
de control.

IDefinición: punto de controlDer Zeitpunkt, an dem alle im Datenbankpuffer geänderten,


aber noch nicht actualisierten Daten auf die externe Datenbank geschrieben werden, heißt
Control .

In einem modernen Datenbankbetrieb treten Checkpoints regelmäßig auf. Entweder werden


Checkpoints nach bestimmten vorgegebenen Zeitabständen oder nach gewissen Ereignissen
angesteuert. Los juegos de disparos en Oracle contienen un punto de control que está bajo control
cuando se realiza una nueva sesión de registro. Es hängt damit von der Last und der Größe der
Logdateien ab, wie häufig ein Checkpoint ausgeführt wird. In der Regel finden pro Stunde mehrere
Checkpoints ahora.
Los puntos de control establecidos previamente, dass auch geänderte Daten nicht abgeschlossener
Transaktionen in die Datenbank geschrieben werden dürfen. Es werden schließlich alle geänderten Daten,
die noch nicht in der Datenbank gespeichert wurden, auf das externe Medium transportiert. Debe tener en
cuenta que estas fechas se guardan en el registro de deshacer.
Der große Vorteil von Checkpoints ist, dass in der Regel beim Rechnerabsturz nur das letzte
Redo-Log gelesen werden muss, um alle Daten in der Datenbank zu actualisieren.
284 8 Concurrencia y Recuperación

E/S de Anzahl

CP = Punto de control

CP CP t

Tejido. 8.5Zeitlich pulsierender Anstieg von Ausgaben an Checkpoints

Der Nachteil von Checkpoints ist, dass in diesem Augenblick viele Daten in die
Datenbank geschrieben werden. Dies verursacht einen pulsartigen, relativ periodischen
Anstieg der Anzahl der Ausgaben, Schematisch dargestellt in Abb.8.5. An den Checkpoints
steigen die Ausgaben an enorme, um dann rasch wieder abzusinken. Leader erhöhen sich
zu diesen Zeitpunkten auch die Antwortzeiten um ein Vielfaches. Aber auch diese nehmen
ganz schnell wieder ab. Esta versión se activará, da nun bei einem Rechnerabsturz die
Daten schnell wiederhergestellt werden können.
Estos datos confidenciales incluyen un banco de datos gratuito que puede utilizar sus
propios datos, además de las transacciones en clase clásica. Betrachten wir dazu zwei
Zeitpunktet1yt2. Zum Zeitpunktt2geschieht ein schwerer Softwarefehler, so dass die
Arbeitsspeicherdaten ungültig sind. Im schlimmsten Fall fällt der gesamte Rechner aus,
im günstigsten Fall sind nur einzelne Blöcke im Cache betroffen. Der letzte Checkpoint vor
diesem Crash sei der Zeitpunktt1. Wir können alle seit der letzten Sicherung
abgelaufenen Transaktionen entsprechend dieser beiden Zeitstempel klassifizieren, siehe
auch Abb.8.6:

Tejido. 8.6Cómo se realizan las


T1
transacciones en Softcrash-Fall
T2

T3

T4

T5

t1 t2 t
Control choque suave
8.2 Recuperación 285

- La menge der zum Zeitpunktt1bereits beendeten Transaktionen (T1).


- Die Menge der vor dem Zeitpunktt1begonnenen und nach dem Zeitpunktt1beendeten
Transaktionen (T2).
- Die Menge der vor dem Zeitpunktt1begonnenen und zum Zeitpunkt des Crash noch nicht
abgeschlossenen Transaktionen (T3).
- Die Menge der nach dem Zeitpunktt1begonnenen und bereits beendeten
Transaktionen (T4).
- Die Menge der nach dem Zeitpunktt1begonnenen und zum Zeitpunkt des Crash noch nicht
abgeschlossenen Transaktionen (T5).

MorirTransacciones T2 y T4 sind abgeschlossen. Es ist aber nicht sichergestellt, dass alle


Änderungen auch in die Datenbank geschrieben wurden. Vom Zeitpunkt des letzten
Checkpoints bis Transaktionsende wird die Datenbank bezüglich dieser Transaktionen
actualizado. Die benötigten Informationen werden dem letzten Redo-Log entnommen. Es ist
dabei die Reihenfolge der einzelnen Änderungen zu beachten. Hilfestellung hierzu leisten die in
der Logdatei ebenfalls gespeicherten Metadaten.
MorirTransacciones T3 y T5 Müssen zurückgesetzt werden, da sie zum Zeitpunkt des
Softcrashes noch nicht bedet waren. Es müssen alle Änderungen, die bereits in die Datenbank
geschrieben wurden, zurückgenommen werden. Aquí encontrará el registro de deshacer.

MorirTransacciones T1 ¡sind vom Crash nicht betroffen!


Ein Crash erfolgt meist viele Stunden nach der letzten Sicherung. Der letzte Checkpoint
bisagragen liegt nur wenige Minuten zurück. Folglich sind praktisch immer mindestens 90%
aller Transaktionen vom TypT1. Die Recovery wird daher in der Regel sehr schnell ablaufen, da
nur die restlichen ganz wenigen Transaktionen überprüft werden müssen.
Unsere Beschreibung der Recovery bezieht sich auf den Fall, dass nur der Rechner
selbst abstürzt, in der Regel also auf Softwarefehler. Leider kann auch eine Festplatte
ausfallen, auf der wesentliche Teile der Datenbank abgespeichert sind. Zur Vorsorge gibt
es hier dos Möglichkeiten:

- Der Datenbankbetreiber verlässt sich auf die Recovery und besitzt nureinen Aktuellen
Datenbestand der Datenbank.
- Der Datenbankbetreiber erwartet höchste Verfügbarkeit und arbeitet mit gespiegelten
Datenbankdaten.

Auch im ersten Fall sind keinerlei Daten verloren. Wir müssen neue Hardware besorgen, die
letzte Sicherung einspielen und den Datenbankbetrieb mit Hilfe der Redo-Logs komplett
nachvollziehen. Dies wird zwar einige Zeit in Anspruch nehmen, dies Daten sind aber dann
wieder voll verfügbar.
Im zweiten Fall geht das Wiederherstellen wesentlich schneller. Nach dem Anschließen der
neuen Hardware läuft die Datenbank sofort weiter. Die Datenbankdaten werden gleichzeitig
auf die nuevo Hardware übertragen. In diesem Fall gibt es noch feine Nuancen.
286 8 Concurrencia y Recuperación

Wir können einfach nur die Datenbankdaten spiegeln, etwa mittels einer Raid-1-Platte. Oder wir
spiegeln gleich das gesamte System inclusive des Rechners und der gesamten Peripherie.
Damit wären wir gegen praktisch alle Eventualitäten gerüstet.
Wir fassen diesen Sachverhalt kurz zusammen: Ein sicherer Datenbankbetrieb erfordert den
Einsatz von Logdateien. Um im Falle eines Komplettausfalls des Systems schnell reagieren zu
können, bedarf es eines zusätzlichen Aufwands, der erheblich sein kann.

- Caída inicial: Datenbankbetrieb mit Redo- und Undo-Logdateien zusammen mit der
Verwendung von Checkpoints.
- Etwas aufwendiger: Die Logdateien werden mit Hilfe von Raid-1-Systemen gespiegelt.
- Noch aufwendiger: Zusätzlich wird die Datenbank gespiegelt.
- Extremo aufwendig: Das gesamte System wird gespiegelt und durch feuerfeste Wände
getrennt.

Es ist eine Frage der Notwendigkeit und der zur Verfügung stehenden Mittel, welche
Variante gewählt wird. Die aufwendigen Fälle garantieren, dass auch beim gleichzeitigen
Ausfall mehrerer Systeme (z. B. Rechner und Datenbank) keine Daten verloren gehen und die
Recovery sehr schnell durchgeführt werden kann.
Wir verweisen auf die folgende weiterführende Literatur: In Date (1983y2003) werden
die Probleme der Recovery sehr gut beschrieben. Detalles Ausführliche finden wir vor
allem en Kemper und Eickler (2015) y Conolly y Begg (2015).

8.3 Concurrencia

Wir sind bisher mehr oder weniger stillschweigend davon ausgegangen, dass alle
Transaktionen in zeitlicher Reihenfolge nacheinander ausgeführt werden. Y cae sie sich doch
zeitlich überlappen, por lo que sollten sie sich zumindest nicht gegenseitig beeinflussen. En
grandes bancos de datos no se puede garantizar el pago. Großrechner erreichen schon heute
einen Spitzendurchsatz von tausend und mehr Transaktionen pro Sekunde, wobei eine
Transaktion meist nur eine Sekunde dauert. Dies bedeutet, dass häufig ein tausend und mehr
Transaktionen gleichzeitig ablaufen! Dass sich so viele Transaktionen zu keiner Zeit gegenseitig
beeinflussen, ist Wunschdenken und entspricht nicht der Realität. Trotzdem muss immer
gewährleistet werden, dass die Konsistenz der Datenbank nicht verletzt wird. Es dorado
folgende Grundregel:

I Regla: Grundregel der ConcurrencyJede Transaktionhat soabzulaufen, als sei sie


allein im System.

Wie diese Regel schon andeutet, spielt auch bei der Concurrency der Begriff der Transaktion
eine zentrale Rolle. Nur im Transaktionsbetrieb sind Recovery und Concurrency überhaupt
denkbar. Leider ist diese Grundregel auch im Transaktionsbetrieb nicht einfach
8.3 Concurrencia 287

zu erfüllen. Erfreulicherweise lassen sich die auftretenden Problemfälle in drei Kategorien


einteilen, in

- das Problem der verlorengegangenen Änderung,


- das Problem der Abhängigkeit von noch nicht abgeschlossenen Transaktionen,
- das Problem der Inkonsistenz der Daten.

Wir stellen alle drei Probleme im Einzelnen ausführlich vor.

Problema de verlorengegangenen ÄnderungEine Transaktion, nenen wir sieTA1, liest


Daten einer gegebenen RelaciónRmit einem Select-Befehl in einen internen Bereich ein.
Dort Bearbeitet esta transacción die Daten und speichert die Änderungen mit einem
Update-Befehl in der Datenbank wieder ab. Dies wird zum Problem, wenn fast gleichzeitig
eine weitere TransaktionTA2einen ähnlichen Zugriff auf die RelationRdurchführt.
Betrachten wir dieses Szenario in Abb.8.7. Aquí se leen además de las transacciones que
cambian las fechas y se modifican estas joyas por separado.TA1schreibt sein Ergebnis in
die Datenbank, und kurz darauf überschreibtTA2estas condiciones. Los cambios deTA1
gehen demnach verloren, el Datenbank no es más entero y vermutlich nicht más
consistente.
Ein anschauliches Beispiel ist die Flugbuchung aus Abschn.8.1. Unser Reisebüro stellt fest,
dass auf einem bestimmten Flug von Frankfurt nach New York noch drei Plätze frei wären und
bucht dos davon. Ganz geringfügig versetzt, analógico Abb.8.7, bucht ein weiteres Reisebüro
ebenfalls zwei Plätze. Und schon wäre das Flugzeug überbucht. Es kommt noch schlimmer: Die
Datenbank gibt an, dass sogar noch ein Platz frei wäre. Schließlich wurden ja die Änderungen
unseres ersten Reisebüros überschrieben. Unser Reisebüro gibt die erfolgreiche Reservierung
an seine Kunden weiter. Schließlich lag ja ein Commit vor!
Este Beispiel zeigt uns, dass im Parallelbetrieb Konsistenz und Integrität einer Datenbank
Massiv Bedroht sind. Bevor wir aber näher auf Lösungen eingehen, sehen wir uns noch die
beiden weiteren Probleme an.

Problem der Abhängigkeit von nicht abgeschlossenen TransaktionenDieses Problem sieht


harmlos aus, ist in letzter Konsequenz aber ähnlich kritisch wie das letzte. tramitado

Tejido. 8.7Problema de
verlorengegangenen Änderung TA1 TA2

Seleccione R
Seleccione R


Actualizar R
Comprometerse Actualizar R La actualización de
t Comprometerse
¡TA1 geht verloren!
288 8 Concurrencia y Recuperación

Tejido. 8.8Abhängigkeit von


nicht abgeschlossenen TA1 TA2
Transaktionen
Actualizar R
Seleccione R …

Retroceder
TA1 más mentira ungültige
t Comprometerse
¡Fecha!

wir hierzu Abb.8.8. La transacciónTA2Después de realizar una operación de


retroceso, la función de reversión no se activará hasta el final. Zwischenzeitlich liest
die TransaktionTA1este Änderung, die aber so niemals gültig wird.
Das Lesen nicht gültiger Daten sieht harmlos aus, stellt aber in bestimmten Situationen ein
echtes Problem dar. Darf etwa ein Kunde wegen hoher Schulden sein Girokonto nicht belasten,
so kann er bei leerem Girokonto keine Überweisungen vornehmen. Mit etwas Geschick ginge
dies aber doch: Ein Freund überweist ihm Geld, er belastet daraufhin sein Konto und sein
Freund zieht anschließend die Überweisung mit einem Rollback wieder zurück! ¡Auf diese Weise
könnte das Konto erheblich in die roten Zahlen abrutschen!
Noch schlimmer wirkt es sich aus, wenn noch das Problem der verlorengegangenen
Änderung dazu kommt: Die TransaktionTA1könnte nicht nur lesend, sondern auch schreibend
zugreifen! Dann würden mit dem Rollback vonTA2también muere vonTA1geänderten Daten
zurückgesetzt.

Problema de la coherencia de las fechasSelbst dann, wenn una transaktion nichts


ändert, kann eine unglückliche Verzahnung mit otra transaktion zu falschen Resultaten
führen. Dies zeigt unser drittes Problem mit der Inkonsistenz der Daten. Betrachten wir
dazu drei Konten eines Geldinstituts (Abb.8.9). La transacciónTA1überprüft den Inhalt
dieser drei Konten und gibt die Summe dieser Konten aus. Zur gleichen Zeit bucht die
TransaktionTA2Una apuesta de 600 euros por cuenta de 3 a cuenta de 1 um. Damit hat
sich die Kontosumme nicht geändert (in unserem Beispiel wären dies 1400 Euro), doch
unsere TransaktionTA1liefert ein falsches Ergebnis zurück!
Este dritte Fall zeigt, wie einfach es in einem ungeschützten System ist, die Grundregel der
Concurrency zu verletzen. Transacción de LäuftTA1alleine ab, so erhalten wir den korrekten
Betrag von 1400 Euro. Trifft sie ungünstig aufTA2, so erhalten wir ein ganz anderes und damit
falsches Ergebnis. Besonders verheerend wirkt sich aber das Problem der verlorengegangenen
Änderung aus. Hier werden Daten von korrekt mit Commit beendeten Daten überschrieben
und damit gelöscht!
Estos tres estilos de música son diferentes, en paralelo, sin cables de seguridad, se
pueden crear rápidamente y con voluntad propia. Dies setzt sich bei der Recovery fort.
Dort spielt die Reihenfolge der abgearbeiteten Transaktionen eine wichtige Rolle. Im
Parallelbetrieb ist aber nicht immer entscheidbar, welche Transaktion die erste
8.3 Concurrencia 289

TA1 TA2
Summiere drei Kontoinhalte Más de 600 € de Konto3 auf Konto1

Seleccione Konto1 (400 €)


Seleccionar Konto3 (700 €)
Seleccione Konto2 (300 €)
Actualizar Konto3 (700-600=100 €)

Seleccionar Konto1 (400 €)
Seleccione Konto3 (100 €) Actualizar Konto1 (400+600=1000 €)
Ausgabe: Verano (800 €) Comprometerse

t
Comprometerse

Tejido. 8.9El problema de la coherencia de tinta

guerra. Verschärft wird this Situation durch die Metadaten, die synchron zu den Logdaten
geschrieben werden müssen.
Wir benötigen daher Mechanismen, die die die Grundregel der Concurrency sicherstellen.
Gleichzeitig müssen wir eine Reihenfolge der Transaktionen festlegen können. ¡Necesitamos
realizar transacciones en serie! Dafür gibt es dos gegensätzliche Ansätze.

Estrategias para la serialización de transacciones


- Estrategia optimista de concurrencia
- Estrategia de concurrencia pesimista

Moriroptimista Las estrategias adoptadas por las siguientes personas: Jede Transaktion darf
in der Datenbank beliebig ändern, wobei die drei obigen Probleme bewusst in Kauf genommen
werden. Wird allerdings bei Transaktionsende festgestellt, dass auch andere Transaktionen die
gleichen Daten Bearbeiteten, so wird einRetrocederdurchgeführt und die Transaktion neu
gestartet.
Konträr dazu verhält sich die Strategiespesimista Verfahrens. Aquí vamos a cambiar las
fechas de una transacción, pero no se aplican para todas las otras transacciones. Antes de
realizar transacciones, estas actividades se realizarán de forma gratuita. Greift eine Transaktion
also auf bestimmte Daten zu, so ist für alle other Transaktionen der Zugriff darauf verwehrt.
Antes de realizar transacciones, se pueden realizar otras transacciones con estas fechas.

Das optimistische Verfahren ist einfach zu implementieren. Es kann sich aber leicht
aufschaukeln: Dos transacciones, die sich beeinflussen, könnten beide zurückgesetzt und neu
gestartet werden. Schon interagieren sie wieder und Beginnen von neuem. Vielleicht kommt
jetzt noch eine dritte Transaktion dazu, und das System schaukelt sich auf. Schon bei relativ
geringen Konfliktwahrscheinlichkeiten besteht die Gefahr, dass sich der Konflikt nicht mehr
auflöst. Dabei ist die Implementierung des optimistischen Verfahrens wirklich einfach und
erfolgt über Zugriffszähler auf jeden einzelnen Block im Datenbankpuffer. Dadurch kann
jederzeit festgestellt werden, ob auch andere Transaktionen auf die verwendeten Blöcke
zugegriffen haben.
290 8 Concurrencia y Recuperación

Pestaña. 8.4 Vor- und Nachteile der Serialisierungsstrategien

Estrategia optimista Estrategia pesimista


Implementación inicial del
Barra universal universal
rendimiento del Gute
vorteile Grundregel der Concurrency
Grundregel der Concurrency
kann garantiert werden
kann garantiert werden
Kann sich aufschaukeln: Aufwendige Implementierung
Noche daher nur in Spezialfällen Provoziert Wartezeiten
einsetzbar anderer Transaktionen

Da in der Praxis nicht garantiert werden kann, dass einige Daten immer immer wieder von
mehreren Transaktionen gelesen und geändert werden, wird heute fast ausschließlich das
pessimistische Verfahren eingesetzt. Dieses Verfahren serialisiert alle auf gleiche Daten
zugreifenden Transaktionen.
Jede Transaktion, die bestimmte Daten liest oder schreibt, setzt auf diese Daten eine Sperre.
Estas actividades se realizarán primero en transacciones sin costo alguno. Alle weiteren
Transaktionen, die die die gleichen Daten bearbeiten wollen, müssen wegen der gesetzten
Sperre warten. Mit dem Freigeben dieser Sperre wird the erste wartende Transaktion geweckt.
Esto es cierto por sí solo, y pueden convertirse en nuevos arquitectos. Somit verhalten sich bei
der pessimistischen Strategie Transaktionen nicht nur so, als seien sie nacheinander
abgelaufen, sie sind es tatsächlich. Der Implementierungsaufwand dieses Verfahrens ist hoch.
Es ist eine Sperrverwaltung einzuführen, die die die komplette Serialisierung miteinander
konkurrierender Transaktionen übernimmt. Wir gehen darauf ausführlich im nächsten
Abschnitt ein. tabla8.4zeigt uns eine kleine Übersicht über die Vor- und Nachteile der beiden
Strategien.

8.4 Espermecanismos

Das im letzten Abschnitt besprochene pessimistische Verfahren erfordertMecanismos de


esperma . Wir bezeichnen solche Sperren imWeiteren alsCerraduras . Die Realisierung dieser
Locks geschieht in der Praxis mit Hilfe von Semaphoren, einfachen Zählern. Generalmente se
incluyen cerraduras, um Betriebsmittel vor mehreren gleichzeitigen Zugriffen zu schützen, in
Datenbanken sind dies unsere Relationen. MorirGrundidée bei Datenbanken ist Folgende:

- Cuando existe una relación de bloqueo


- Eine Transaktion holt vor jedem Zugriff auf eine Relation automatisch den
dazugehörigen Lock, falls sie diesen Lock noch nicht besitzt
- Ist der Lock von einer other Transaktion belegt, so wartet die Transaktion bis zur
Lockfreigabe in einer Warteschlange
- Bei Transaktionsende werden alle von dieser Transaktion gehaltenen Locks freegeben
8.4 Espermecanismos 291

Tejido. 8.10Cerraduras:
Synchronisierung durch Serialisierung tabla
TA1

TA2

TA3 serialización

Dies führt dazu, dass sich Transaktionen gegenseitig sincronizadas, indem sie
nacheinander auf Tabellen zugreifen. Dies illustriert sehr schön Abb.8.10. Heer wollen
drei Transaktionen fast gleichzeitig eine Tabelle Bearbeiten. Dank unserer Locks darf
zunächst nur eine Transaktion auf die gewünschte Tabelle zugreifen, die anderen beiden
müssen warten. Nach dem Commit dersten Transaktion belegt die dos Transaktion die
Tabelle, schließlich, wieder nach einem Commit, die dritte. Die drei Transaktionen laufen
nacheinander ab. Vor jeder Tabelle existiert also eine Warteschlange, die nach dem
Prinzip FCFS (First Come First Serve) wird. Der bisher am längsten Wartende wird also
jeweils als nächster bedient.
Los bancos de datos modernos se abren automáticamente en cualquier lugar con un
bloqueo automático y se usan primero en las transacciones de forma gratuita. Esta
garantía no permite ninguna otra transacción.
Dieses Vorgehen des Holens eines Locks,bevor eine Tabelle angefasst wird, ist extrem
wichtig! Eine Tabelle no es una tabla automática, ya que no se puede utilizar de forma
automática. Eine entsprechende Vorsorge ist deshalb zwingend erforderlich. Los bloqueos
gratuitos activados están en SQL directamente con la activación de confirmación y reversión.
Bei Datenbanken, auf die nur selten zugegriffen wird, ist ein Tabellenlock
eigentlich nicht erforderlich. Es un bloqueo único para el banco de datos registrado.
Umgekehrt bremst ein Tabellenlock bei sehr häufigen Zugriffen extrem. Wir
benötigen ainee Lock-Granularität. Folgende Lockgranulate sind von Interesse, siehe
auch Abb.8.11:

- Bloqueo de banco de datos : Sperre für die gesamten Datenbank,


- Bloqueo de tablas : Sperre für jede Relation (Tabelle),
- Tupel-Lock: Sperre für jedes Tupel jeder Relación,
- Bloqueo Eintrags : Sperre für jeden Attributseintrag jeder Relation.

Beim Arbeiten mit Datenbank-Lock können keine dos Benutzer gleichzeitig mit der
Datenbank arbeiten. Beim Verwenden von Eintrags-Locks gibt es extrem viele Sperren.
Los principales bancos de datos utilizan Tupel-Locks, así como Oracle, SQL Server y
MySQL. Vereinzelt kommen auch Tabellen-Locks vor. Wir müssen uns also im Klaren sein,
dass eine moderne Datenbank für jede Tabellenzeile jeder Relation einen eigenen
292 8 Concurrencia y Recuperación

Datenbanksperre

banco de datos
tabla
Tabellensperren

Tupelsperre

tabla

Eintragssperre

Tejido. 8.11Granulado de esperma en Datenbanken

Bloquee vorhalten muss. Dies können also Millionen oder Milliarden von Locks sein!
Andererseits ist nun die Konfliktwahrscheinlichkeit gering, dass dos Transaktionen gleichzeitig
die gleiche Zeile einer Relation Bearbeiten. Y las caídas provocan dos relaciones con los
diferentes lugares, por lo que se sincronizarán los bloqueos húmedos y húmedos.
Obwohl Tupelsperren die Konfliktwahrscheinlichkeit schon erheblich reduzieren, sind
Datenbanken bemüht, die Wartezeiten auf belegte Locks noch weiter zu minimieren.
Wenn wir bedenken, dass meist 80 bis 90 Prozent aller Zugriffe Lesezugriffe sind, und wer
weiter beachten, dass Lesezugriffe keine Daten ändern, so ist es fast natürlich, in einer
Datenbank Lese- und Schreibzugriffe bezüglich der Locks unterschiedlich zu behandeln.
Schließlich stört es überhaupt nicht, wenn mehrere Lesende gleichzeitig auf die gleiche
Zeile zugreifen.
Andererseits müssen wir wegen der Abhängigkeit von noch nicht abgeschlossenen
Transaktionen und der Inkonsistenz der Daten (siehe letzter Abschnitt) Lesende und
Schreibende gegenseitig synchronisieren. Para estas gleichzeitiges Lesen zu ermöglichen,
definieren wir dos unterschiedliche Sperrmechanismen:

IDefinición: bloqueo exclusivo, bloqueo compartidoEinBloqueo exclusivo Auf ein Objekt weist alle
weiteren Exklusiv- und Share-Lockanforderungen auf dieses Objekt zurück.
EinBloqueo compartido Auf ein Objekt lässt weitere Share-Lockzugriffe auf este Objekt zu,
weist aber exklusive Lockanforderungen zurück.

Es liegt monja en Datenbanken folgendes Vorgehen auf der Hand:

- Antes de elloslesenden Zugriff auf eine Zeile wird einBloqueo compartido para este Zeile geholt,
8.4 Espermecanismos 293

- Vor dem schreibenden Zugriff auf eine Zeile wird ein Exklusiv-Lock for diese Zeile
geholt.

Dieses Vorgehen gilt analog für Tabellenoder Eintragssperren. Esta modificación es


perfecta para todos, ya que se pueden hacer varias cosas en paralelo, y también en las
fechas correctas. Nur die schreibenden Zugriffe geschehen weiterhin isoliert. Wir
erweitern jetzt die Grundidee zu Sperrmechanismen in Datenbanken mittels Share-Locks
como sigue:

- Jede Zeile einer Relation wird beim Zugriff durch einen eigenen Share- bzw.
Bloqueo exclusivo.
- Una transacción realizada mediante un bloqueo compartido en un momento determinado
automáticamente cuando se activa el Share-Lock, este bloqueo no se activa. Vor einem
schreibenden Zugriff holt sie den entsprechenden Exklusiv-Lock.
- Wird ein Share-Lock se activa y no se ofrece ninguna opción de bloqueo exclusivo en otras
transacciones, por lo que se puede realizar la transacción con Share-Lock. Dies gilt auch
dann, wenn are transaktionen diesen Share-Lock besitzen.
- Wird ein Exklusiv-Lock angefordert, and gibt es keine Share- und Exklusiv-Lock-
Anforderungen other Transaktionen, so erhält the Transaktion de Exklusiv-Lock.
- Andernfalls wartet die Transaktion beim Anfordern eines Share- oder Exklusiv-Locks bis zur
Lockfreigabe in einer Warteschlange.
- Al realizar una transacción, se activa un Share-Lock en una ventana y se utiliza el
Exklusiv-Lock en esta ventana, por lo que el Share-Lock se activa
automáticamente en un Exklusiv-Lock, por lo que esta transacción se cancela.
- Bei Transaktionsende werden alle gehaltenen Locks freeigeben.

Wir sehen, dass der Algorithmus gegenüber der Grundidee etwas komplexer wurde.
Dafür erhalten wir ein Höchstmaß an Parallelität. Unsere Hoffnung ist nun, dass die
Grundregel der Concurrency bei unseren drei Problemen aus dem letzten Abschnitt mit
Hilfe dieser Sperrmechanismen eingehalten wird. Wir Holen also vor jedem
Datenbankzugriff den entsprechenden Sharebzw. Bloqueo exclusivo. Estas camas
incorrectas implican un gran problema en dos ocasiones.

Problema de verlorengegangenen ÄnderungBeide Transaktionen fordern zum Lesen einen


Share-Lock an, den sie auch beide erhalten. Anschließend möchten Sie ihren Share-Lock in
einen Exklusiv-Lock umwandeln. En otras joyas, además de otras transacciones, un Share-Lock
debe mantenerse en el Freigabe con estas cerraduras. Beide Transaktionen warten also auf die
Freigabe eines Locks, den die jeweils andere Transaktion besitzt, siehe Abb.8.12. Este tipo de
protección no es necesaria para que nadie se acerque más a ella. Beide Transaktionen warten
beliebig lange und können folglich auch den beabsichtigten Update nicht ausführen.
294 8 Concurrencia y Recuperación

TA1 TA2

S-Lock anterior
Seleccione R S-Lock anterior
Seleccione R


X-Lock anterior
Warten X-Lock anterior S = Compartir
t Warten X = Exclusivo

Tejido. 8.12Sperren beim Problem der verlorengegangenen Änderung

Solche Verklemmungen können bei Sperrmechanismen generell auftreten. Esta situación se


verá reflejada enPunto muerto.

IDefinición: punto muertoEine Verklemmung, bei der mindestens dos Transaktionen


gegenseitig auf die Freigabe eines oder mehrerer Locks warten, heißtPunto muerto .

Cuando también veremos, unser Problem der verlorengegangenen Änderung mit Hilfe
von Share- und Exklusiv-Locks zu lösen, so stoßen wir auf einen Deadlock. Estos puntos
muertos no se encuentran en los detalles. Insbesondere sind wir an auflösung dieser
Deadlocks interessiert. Zunächst wollen wir aber noch die beiden othereren im letzten
Abschnitt angesprochenen Probleme betrachten.

Problem der Abhängigkeit von nicht abgeschlossenen TransaktionenAquí se


transfiere la transacciónTA2einen Exklusiv-Lock an und erhält ihn. TransacciónTA1Las
bisagras no activan el Share-Lock ni se eliminan. Mit dem Rollback gibt die Transaktion
TA2all ihre Locks free. El Share-Lock sigue la transacciónTA1zugeteilt, und diese greift
monja lesend zu, siehe Abb.8.13. Zum Unterschied zu unserem Beispiel ohne Locks lesen
wir jetzt ausschließlich gültige Daten, Daten die von abgeschlossenen Transaktionen
kommen und nicht mehr zurückgesetzt werden können. Wir erkennen aus der Abbildung
deutlich, dass sich die beiden betroffenen Transaktionen serialisieren. TransacciónTA1
Wird im Prinzip erst nach dem Ende vonTA2gestartet. Die Transaktionen verhalten sich
nun tatsächlich so, als seien sie jeweils allein im System. Die Grundregel der Concurrency
wird voll unterstützt.
Die Wirkung unserer Sperrmechanismen ist offensichtlich. Transaktionen, die keine
Datensätze gemeinsam anfassen, backern sich grundsätzlich nicht. Die wenigen otras
transacciones, die zufälligerweise auf gleiche Daten zugreifen, werden serialisiert.

Problema de la coherencia de las fechasUnser Problem der Inkonsistenz der Daten


führt wieder zu einem Deadlock. Betrachten wir dazu Abb.8.14. TransacciónTA1fordert
nacheinander drei Share-Locks zu den Konten 1 bis 3 an. Die beiden ersten Locks werden
Traducido del inglés al español - www.onlinedoctranslator.com

8.4 Espermecanismos 295

TA1 TA2

X-Lock anterior
S-Lock anterior Actualizar R
Warten
Warten …
Warten
Warten Revertir (Lockfreigabe) S = Compartir
t Seleccione R X = Exclusivo

Tejido. 8.13Sperren bei der Abhängigkeit von offenen Transaktionen

gewährt, yTA1liest die Kontendaten. In der Zwischenzeit erhält TransaktionTA2Un Share-


Lock en el contacto 3 y puede hacerlo después de leer las fechas en un bloqueo exclusivo.
Im Folgenden wird daher der TransaktionTA1Der Share-Lock auf Konto 3 activado.TA1
muss auf Lockfreigabe warten. Rápido gleichzeitig erhältTA2Einen Share-Lock auf Konto
1. Schließlich dürfen mehrere Transaktionen paralelo lesend zugreifen. Zum Update von
Konto 1 benötigtTA2Aber einen Exklusiv-Lock, und dieser wird nun verweigert. Wieder
warten dos transacciones realizadas en Freigabe von Sperren, un Deadlock ist
eingetreten.
En Summe können wir sagen, dass wir alle vorgestellten Probleme lösen, wer wir
Deadlocks vernünftig erkennen und auflösen können. Wir wären in der Lage die
Grundregel der Concurrency mit Hilfe von Sperrmechanismen zu erfüllen. Noch stehen
uns aber Deadlocks im Weg.
Die drei beschriebenen Probleme sind deshalb so wichtig, weil sie zeigen, dass schon allein
die Kombination zwischen lesenden und schreibenden Transaktionen Schwierigkeiten bereitet.
Bei reinen schreibenden Transaktionen treten Problema de concurrencia ver-

TA1 TA2
Summiere drei Kontoinhalte Más de 600 € por Konto3 después de Konto1

S-Lock Konto3 disponible


S-Lock Konto1 anterior
Seleccione Konto3 (700 €)
Seleccione Konto1 (400 €)
X-Lock Konto3 disponible
S-Lock Konto2 disponible
Actualizar Konto3 (700-600=100€)
Seleccione Konto2 (300 €)
S-Lock Konto1 anterior
S-Lock Konto3 disponible
Seleccione Konto1 (400 €)
Warten
X-Lock Konto1 anterior
t Warten
S = Compartir
X = Exclusivo

Tejido. 8.14Sperren beim Problem der Inkonsistenz der Daten


296 8 Concurrencia y Recuperación

TA1 TA2

X-Lock para R1 anterior


X-Lock para R2 anterior
Actualización R1
Actualizar R2

X-Lock para R2 anterior


X-Lock para R1 anterior
Warten
t Warten
S = Compartir
X = Exclusivo

Tejido. 8.15Puntos muertos en sich überkreuzenden Schreiben

stärkt auf, ebenso Puntos muertos. Dies wollen wir an einem einfachen Beispiel
zusammen mit Abb.8.15aufzeigen. TransacciónTA1fordert einen Exklusiv-Lock fürR1un,
TA2 Un candado exclusivo paraR2. Después de la actualización, se activará junto con un
bloqueo exclusivo para otras joyas. Sie müssen gegenseitig auf Lockfreigabe warten, was
nie geschehen wird. Ein Deadlock liegt vor.
Este Beispiel zeigt eindrucksvoll, dass dos Transaktionen besunders anfällig für
Deadlocks sind, wenn sie Aufgaben in jeweils umgekehrter Reihenfolge bearbeiten.
El problema de la concurrencia werden in der Literatur sehr ausführlich behandelt.
Empfehlenswert sind die etwas älteren Werke Date (1983y2003). Aus der neueren
Literatur mit einer ausführlichen Behandlung der drei hier besprochenen Probleme seien
Conolly und Begg (2015) y Kemper y Eickler (2015) besonders erwähnt.

8.5 Puntos muertos

Estoy completamente ausente sind wir dreimal auf Deadlocks gestoßen. Estos interbloqueos se
activan, ya que las transacciones que se realizarán durante el proceso de bloqueo no se pueden
realizar por sí solas. Um ein endloses Warten zu vermeiden, muss von außen beobachtet und
gegebenenfalls eingegriffen werden. Noch besser wäre es aber, wer wir Deadlocks
grundsätzlich vermeiden könnten. Wir wollen uns daher zunächst damit befassen.

Estrategias de eliminación de interbloqueosIm letzten Abschnitt haben wir gesehen, dass ein
Bearbeiten von Daten in jeweils unterschiedlicher Reihenfolge schnell zu einem Deadlock führen
kann, siehe Abb.8.15. Dies zeigt uns aber umgekehrt den Weg, wie wir Deadlocks vermeiden können:
Wir führen eine Ordnung beim Zugriff auf unsere Datensätze ein. También podemos utilizar todos los
objetos de un banco de datos siguiendo las siguientes indicaciones:

- Orden alfabético de todas las relaciones


- Ordnung der Tupel nach dem Primärschlüssel Innerhalb einer Relation
8.5 Puntos muertos 297

Fordern wir jetzt, dass eine Relation ausschließlich Zugriffe auf Relationen gemäß dieser
Anordnung durchführt, so werden auch die Locks in dieser Reihenfolge angefordert, Deadlocks
können nicht mehr auftreten. Dies wird sofort offensichtlich, wern wir unsere Deadlockfälle im
letzten Abschnitt betrachten. Immer war die unterschiedliche Reihenfolge der Zugriffe der
beiden Transaktionen die Ursache. Es lässt sich beweisen, dass unter Einhaltung einer festen
Reihenfolge der Zugriffe keine Deadlocks auftreten können.
Voraussetzung ist, dass sich wirklich alle Transaktionen an diese Reihenfolge halten.
Sollten Transaktionen während der Abarbeitung feststellen, dass sie noch Daten
benötigen, diese Anordnung verletzten, so muss die Transaktion mit einem Rollback
abgebrochen und komplett neu gestartet werden. In der Praxis erweisen sich die
Deadlock-Vermeidungsstrategien im Datenbankeinsatz als nicht flexibel genug. Estos
algoritmos son cada vez más altos y están diseñados, cuando los errores de Deadlocks
son complejos y aufwendig ist, etwa in verteilten Datenbanken. Detalles del
Deadlockvermeidung sei auf Date (1983) y Kemper y Eickler (2015) verwiesen, ebenso auf
Bücher zu Betriebssystemen, z. B. Tanenbaum (2016).

DeadlockerkennungNo podemos evitar los interbloqueos, por lo que debemos incluir


algoritmos para activar los interbloqueos. Am einfachsten ist es, auf Lockfreigabe
wartende Transaktionen zu beobachten. Überschreitet die Wartezeit dieser Transaktionen
einen vorgegebenen Schwellwert, so können wir annehmen, dass sie sich in einem
Deadlock befinden. Este algoritmo einfache hat aber tres entscheidende Nachteile:

- Una transacción, el tiempo prolongado en Lockfreigabe Wartet, no debe estar en un


Deadlockzustand detrás.
- Nach welcher Zeit eine auf Lockfreigabe wartende Transaktion wegen Verdacht auf
Deadlock abzubrechen ist, ist in der Regel nicht bekannt.
- Ein zu langes Warten bis zum Abbruch einer Transaktion verlängert die Antwortzeiten im
System generell.

Letztendlich ist anhand der Wartezeit no entscheidbar, ob sich eine Transaktion in


einem Deadlock befindet oder nicht. Warten wir zu lange, so steigt die Antwortzeit der
Transaktion. Warten wir nur kurz, so werden auch nicht in einem Deadlock verstrickte
Transaktionen zurückgesetzt.
Glücklicherweise gibt es einfache Mechanismen, um Deadlocks zweifelsfrei zu erkennen:
Wartegraphen. Dazu protokollieren wir alle Transaktionen, die auf Lockfreigabe warten,
zusammen mit den den Transaktionen, die den gewünschten Lock halten. Wartet etwa die
TransaktionTA1auf die Freigabe eines Locks, der von der TransaktionTA2gehalten wird, so wird
im Protokoll ein gerichteter Wartegraph angelegt. Dies entspricht einem Pfeil vonTA1después
TA2(TA1!TA2). Wartet monja etwa auchTA2auf die Freigabe eines Locks durchTA3, así que
kommt ein Pfeil vonTA2despuésTA3hizu. Cataratas zusätzlich noch TA3auf die Freigabe eines
Locks durchTA1wartet, so führt der weitere Pfeil zu einem geschlossenen Zyklus im
Wartegraphen, siehe Abb.8.16: ¡Ein Deadlock liegt vor!
298 8 Concurrencia y Recuperación

Tejido. 8.16Transacciones
Wartegraph dreier TA1

TA2 TA3

Mit Hilfe von Wartegraphen können wir also sehr einfach Deadlocks identifizieren. Wir
müssen dazu nur zu jeder auf Lockfreigabe wartenden Transaktion einen gerichteten Graphen,
also einen Pfeil, hinzufügen. Gleichzeitig wird überprüft, ob es einen geschlossenen Zyklus von
der neuen Pfeilspitze zurück zur wartenden Transaktion gibt. Wenn ja, so liegt mit der neuen
Lockanforderung ein Deadlock vor. In unserem Beispiel hatten wir einen Pfeil vonTA3después
TA1eingezeichnet. Von der PfeilspitzeTA1führt ein gerichteter Pfad zuTA3zurück. Se activa un
punto muerto.
Verlässt eine Transaktion ihren Wartezustand, da sie den gewünschten Lock erhält, so werd
selbstverständlich der entsprechende Pfeil im Wartegraphen wieder entfernt. Meist warten nur
wenige Transaktionen auf Lockfreigabe. Die Verwaltung eines Wartegraphen ist für eine
Datenbank daher nur ein minimaler Zusatzaufwand.

Punto muertoDie Deadlockerkennung übernimmt die Datenbank. Schließlich sollen ja


die betroffenen Transaktionen nicht dauerhaft im Wartezustand verweilen. Haben sich
also dos Transaktionen verklemmt, so wird für eine dieser Transaktionen der
Wartezustand beendet. Gleichzeitig wird für this Transaktion ein Fehler, genauer ein
Deadlockfehler, zurückgemeldet. Jetzt muss esta transacción correcta y óptima reagieren.
Estas transacciones también se realizarán. Der gewünschte SQL-Befehl wurde jedoch mit
einer Fehlermeldung abgewiesen und daher nicht ausgeführt, so dass die Transaktion
höchstwahrscheinlich nicht erfolgreich zu Ende geführt werden kann. Der naheliegende
Versuch, den SQL-Befehl nochmals zu versuchen, wäre ein schwerer Fehler. ¡Wirden würden
sofort wieder im Deadlock stecken! El Deadlockfehlermeldung zeigt unserer Transaktion
nämlich, dass mindestens eine andere Transaktion auf die Freigabe eines Locks wartet, die sie
selbst hält. Sonst hätte es ja keinen Deadlock gegeben.
In praktisch allen Fällen gibt es für die betroffene Transaktion daher nur eine einzige
sinnvolle Lösung:Zurücksetzen der Transaktionund Durchführen eines Neustarts. Wir
haben dies bereits in Kap.6geübt und verweisen explizit auf Abschn.6.4.6. Mit dem
Zurücksetzen der Transaktion werden Locks freeigegeben. Puedes hacerlo con todas las
demás transacciones bloqueadas en Deadlock. Die Wartezustände werden sich auflösen.
Mit dem Neustart der Transaktion kann este vermutlich jetzt problemlos die gewünschten
Aufgaben ausführen.
Estoy dejando de lado dos problemas de concurrencia en un punto muerto. Durch das
Rücksetzen jeweils einer der beiden Transaktionen und einem Neustart dieser
Transaktion kommen wir tatsächlich in beiden Fällen zum Erfolg. Wir wollen dies am
Beispiel der verlorengegangenen Änderung und dem Rücksetzen und Neustart der
TransaktionTA2zeigen. En Abd.8.17erhaltTA2eine Deadlock-Fehlermeldung. Sie führt
8.6 Concurrencia y SQL 299

TA1 TA2
S-Lock anterior
Seleccione R
S-Lock anterior
Seleccione R


X-Lock anterior
Warten X-Lock anterior
Punto muerto
Retroceder
Actualizar R
Comprometerse
S-Lock anterior
Seleccione R

X-Lock anterior
Actualizar R
t S = Compartir
Comprometerse X = Exclusivo

Tejido. 8.17Deadlockerkennung bei der verlorengegangenen Änderung

Daraufhin einen Rollback durch. Transacción Damit erhältTA1den angeforderten Lock,


führt die Änderungen in der RelationRdurch und beendet die Transaktion mit einem
Commit. maldita seaTA1ihren gehaltenen Lock zurück. Beim Neustart von Transaktion
TA2Esto significa que el Share-Lock está activado y que no se activará.TA1 bereits
gespeicherten Daten. Diese werden dann ebenfalls geändert, und die Transaktion
schließt zuletzt mit einem Commit ab.
Cuando esto es así, los Grundregel der Concurrency se eingehalten. Jede Transaktion
se encarga de ello, als sei sie allein im System. Gibt es Probleme, so erfolgen
Fehlermeldungen. Bei nicht behebbaren Fehlern, etwa im Deadlockfall, setzen wir die
betroffene Transaktion zurück. Los Grundregel der Concurrency ist erfüllt, auch wenn
Transaktionen gegebenenfalls zunächst zurückgesetzt und dann nochmals gestartet
werden.

I Beier Deadlock-Fehlermeldung setzen wir die betroffene Transaktion sofort


zurück. Gegebenenfalls erfolgt ein Neustart dieser Transaktion.

Zu weiterführenden Detalles verweisen wir wierer auf Date (1983) y Kemper y Eickler (
2015), ebenso auf Tanenbaum (2016).

8.6 Concurrencia y SQL

SQL es una generación diferente. SQL fragt deshalb nicht, wie ein Datum ausgelesen oder
geschrieben wird, sondern nur, welches Datum gelesen oder geschrieben werden soll.
Ähnlich verhält es sich bei den Spermechanismen in SQL.
300 8 Concurrencia y Recuperación

SQL funciona, la concurrencia es segura y también todos los tres en este capítulo
se describen como problemas de serialización de transacciones. SQL no es
interesantecomoeste Lösung. Nur das Umsetzen der Concurrency wird gefordert.

Concurrency bedeutet für eine Datenbank gleichzeitig einen hohen Aufwand. Para
estas opciones de ajuste de joyas, defina SQL a través del nivel de concurrencia:

- escritura sucia
- lectura sucia
- Lectura no repetible
- Fantasma

El nivelescritura suciaentspricht dem Problem der verlorengegangenen Änderung, das


in den letzten beiden Abschnitten besprochen wurde, siehe auch Abb.8.7y8.17. La norma
SQL (como SQL2003) verweist darauf, dass Dirty Writes grundsätzlich verboten sind! No
utilice la norma SQL de escritura sucia ni la explique en el nivel de concurrencia. Wegen
der Wichtigkeit der Dirty Writes führen wir diese aquí aber explizit mit auf.

Nivel de estudiolectura suciaKennen wir ebenfalls. Es handelt sich um das Problem der
Abhängigkeit von noch nicht abgeschlossenen Transaktionen, siehe auch Abb.8.8. Este
nivel se incluye, como también lo hacen otros, se explica en la norma SQL descrita. In
diesem Level können also Daten gelesen werden, die so nie gültig werden. Letztlich
werden also Lesezugriffe immer erlaubt, die dabei auftretenden Probleme werden
bisagranommen.
Estoy niveladoLectura no repetibleNo garantizamos que este producto sea un gelesener
mínimo. El interior de la transacción no está garantizado. Otras transacciones pueden incluirse
también. Ein wiederholter Zugriff in einer Transaktion auf den gleichen Inhalt kann in diesem
Level also zu durchaus unterschiedlichen Ergebnissen führen.
El nivelFantasmaerlaubt, dass beim wiederholten Lesen Innerhalb einer Transaktion
eine oder mehrere Zeilen auftauchen, die beim vorherigen Lesen noch nicht vorhanden
waren. Otras transacciones pueden realizarse en nuevas fechas. Estos nuevos tiempos se
convierten en fantasmas.
La norma SQL (SQL2003) ver más Nivel de aislamiento. Este es el siguiente:Leer no
comprometido,Leer comprometido,Lectura repetibleySerializable. El segundo paso
es el nivel de aislamiento y la pestaña Nivel de concurrencia.8.5. Wir sehen, dass wir
im LevelSerializablekeinerlei Unsicherheiten zulassen. En este nivel se cumple el
Grundregel de concurrencia.
La norma SQL se utiliza en transacciones críticas más bajas y no se ajustan los niveles
de seguridad. Natürlich ist in der Regel eine Verletzung der Concurrency zu unterbinden.
Es gibt jedoch Anwendungen, wo ein Dirty Read kein Problem darstellt. Sammelt
beispielsweise eine Transaktion für rein statistische Zwecke bestimmte Daten, so wäre in
8.6 Concurrencia y SQL 301

Pestaña. 8.5Nivel de aislamiento

escritura sucia lectura sucia No repetible Fantasma


Nivel de aislamiento
¿erlaubt? ¿erlaubt? ¿Leer dudas? ¿erlaubt?
Leer no comprometido neín Ja Ja Ja
Leer comprometido neín neín Ja Ja
Lectura repetible neín neín neín Ja
Serializable neín neín neín neín

Esta transacción del nivelLeer no comprometidodurchaus vorstellbar. Esta


transacción no se realizará en ningún otro lugar.
Zum Setzen eines bestimmten Levels wird als erste Anweisung einer Transaktion der Befehl
Establecer transacciónverwendet. Este lautet Befehl:

ESTABLECER EL NIVEL DE AISLAMIENTO DE TRANSACCIONES Nivel

También se encuentra el nivel en la pestaña.8.5vorgestellten Niveles de aislamiento anzugeben.


Welcher Level in einer Datenbank Standardmäßig eingestellt ist, hängt von den einzelnen
Datenbankherstellern und den globalen Einstellungen ab.
Wir wollen noch aufzeigen, wie estos Leveleinstellungen realisiert werden können. Wir
haben im Abschn.8.4Share- und Exklusivlocks kennen gelernt. En la pestaña.8.6zeigen wir
beispielhaft, wie mit Hilfe dieser Locks die einzelnen Levels erreicht werden können. Wir gehen
dabei von zeilenweisen Sperren aus.
Bereits im nivelLeer no comprometidoSind Dirty Writes nicht erlaubt. Die Transaktionen
setzen daher zum Schreiben Exklusiv-Locks auf die entsprechenden Zeilen. Um también Dirty
Reads zu vermeiden, arbeiten Transaktionen beim Schreiben mit Kopien. Erst mit dem Commit-
Befehl werden this Kopien in die Originaldatensätze geschrieben. Damit lesen andere
Transaktionen nur Daten von abgeschlossenen Transaktionen. Para garantizar la seguridad de
las aplicaciones, es necesario sincronizar también las aplicaciones de uso. Aquí puedes disfrutar
de Share-Locks.
La combinación combinada de cerraduras compartidas y exclusivas no garantiza el nivel
Serializable. Zählt etwa una transacción die Anzahl aller Zeilen una relación, por lo que esta
transacción será un Share-Lock para todas las veces. Otras transacciones pueden realizarse

Pestaña. 8.6Mögliche Realisierung der Isolationslevel mit Locks

Cerraduras exclusivas Schreiben Bloqueos compartidos Rango-


Nivel de aislamiento
en Schreiben en copia en la lectura Cerraduras

Leer no comprometido Ja neín neín neín


Leer comprometido Ja Ja neín neín
Lectura repetible Ja Ja Ja neín
Serializable Ja Ja Ja Ja
302 8 Concurrencia y Recuperación

nen also keine Änderungen mehr vornehmen. Damit wir der LevelLectura repetible
garantizado. Fügt eine andere Transaktion aber eine neue Zeile hinzu, so ist dies erlaubt.
Schließlich hält keine andere Transaktion einen Lock auf this new Zeile. Liest aber unsere
Transaktion nochmals alle Zeilen, so wird die Anzahl jetzt höher sein. Sie hat ja nun eine
Zeile mehr gelesen, nämlich unser Phantom.
Para este Phantom, puede utilizar un dispositivo de seguridad automático, además de
un bloqueo de alcance (Range-Lock). Ein solcher Bereichslock könnte ein Lock auf die
gesamte Relation sein. Zum Lesen, Ändern und Löschen Holen wir uns den
entsprechenden Share-Lock. Nur zum Einfügen setzen wir den Exklusiv-Lock. Damit wird
das Phantom obstaculizado. Detalles können en Kifer et al. (2006) nachgelesen werden.

8.7 Concurrencia en la práctica

Alle Datenbanken unterstützen Concurrency umfassend. Beim Zugriff auf Relationen werden
implizit Sperren gesetzt, eine Deadlockerkennung ist selbstverständlich. Die meisten
Datenbanken besitzen auch Befehle zum expliziten Setzen von Locks. Auf diese Besonderheiten
wollen wir hier aber nicht weiter eingehen. Muchos son interesantes, como los diferentes
herstellers que implementan varios niveles de aislamiento, y welche Sperrmechanismen
eingesetzt werden.

8.7.1 Concurrencia en Oracle

Oracle modifica dos niveles de aislamiento:Leer comprometidoySerializable. Es ist daher


in Oracle no möglich, Daten von noch nicht abgeschlossenen Transaktionen zu lesen.
Nivel de configuración estándar de Oracle denLeer comprometido. Mit den folgenden
Befehlen kann in den LevelSerializablegewechselt werden:

Establecer nivel de aislamiento de transacciones serializable;


Establecer nivel de aislamiento de sesión Serializable;

En dos ocasiones en otoño no se realizarán transacciones activas, pero la sesión se


realizará en el nivel más alto.
Oracle weist darauf hin, dass lesende Zugriffe andere schreibende Transaktionen
grundsätzlich nicht backern und umgekehrt. Oracle verwendet also keine Locks beim
Lesezugriff! Schreibende Zugriffe werden mit Exklusiv-Locks auf Zeilenebene geschützt.
Funciona en el nivelLeer comprometidoProblemas, da otras transacciones nur die nicht
geänderten Daten einer Transaktion sehen.
Estoy niveladoSerializableArbeitet Oracle mit einer optimistischen Sperrstrategie für die
Lesezugriffe: Lesende Transaktionen dürfen immer ohne Sperren zugreifen. Gleichzeitig
überprüft Oracle, ob beim wiederholten Lesen Änderungen auftraten, ebenso wird das
8.7 Concurrencia en la práctica 303

Fantasma überprüft. Bevor Daten ausgegeben werden, die die die die Grundregel der Concurrency
verletzen würden, wirft Oracle einen Fehler:

ora-08177: No se puede serializar el acceso para esta transacción

Dieser Fehler tritt nur deshalb auf, weil Oracle beliebige Lesezugriffe erlaubt. Dies
erhöht zum einen die Parallelität der Zugriffe. Zum anderen kommt es dann aber
gelegentlich zu dieser Fehlermeldung, die dann in Programmen explizit mit überprüft
und abgefangen werden muss. Ein Neustart der Transaktion, wie etwa auch beim
Deadlock, wird nun dringend empfohlen.

8.7.2 Concurrencia en MS SQL Server

Microsoft SQL Server admite el estándar SQL en condiciones de concurrencia. Es sind todos los
niveles de aislamiento implementados. También podemos realizar el nivel con Hilfe von
Exklusiv- und Share-Locks. El Phantom se bloqueará, ya que se activará el bloqueo de rango. Es
werden aber nicht die jeweiligen Tabellen selbst, sondern die dazugehörigen Schlüssel
gesperrt. Microsoft no utiliza este bloqueo de rango de teclas Verfahren. Mit folgendem Befehl
kann jederzeit überprüft werden, welcher Level in der SQL Datenbank gesetzt ist:

opciones de usuario de dbcc

Mit dem BefehlEstablecer transacciónkann der Level geändert werden. Diese Änderung gilt bis
zum Ende der Session oder einer erneuten Änderung. Es por eso que no tenemos nada que hacer, ya
que en SQL Server una transacción está explícita conComenzar transaccióngestartet werden muss.

8.7.3 Concurrencia en MySQL

Grundsätzlich unterstützt MySQL nor im SpeichermodellInnoDB Transacciones. InnoDB está


bajo Windows y Unix como modelo estándar. Estamos configurados en otros lugares, este
modelo, en MySQL y también activado el motor, está activo.
Configuración estándar de MySQL con InnoDB en el modo de confirmación automática:
cuando se realiza una confirmación, se realiza automáticamente una confirmación. En este
caso, el otoño puede evitar que se produzcan puntos muertos. Ein Transaktionsbetrieb mit
Konsistenzpunkten ist dies aber nicht. Necesitamos hacer el modo de transacción también en
InnoDB. Dazu gibt es dos Möglichkeiten:
Los nuevos usuarios pueden iniciar automáticamente transacciones en Oracle
después del inicio absoluto. Dazu setzen wir:
304 8 Concurrencia y Recuperación

Colocar Confirmación automática = 0;

Dos veces podemos seleccionar y escribir de forma explícita en SQL Server al comenzar las
transacciones:

Iniciar transacción;

En beiden Fällen unterstützt mon MySQL alle vier Isolationslevel. Wir können
beispielsweise den LevelSerializablePor las siguientes razones:

Establecer nivel de aislamiento de transacciones serializable;


Establecer el nivel de aislamiento de transacciones de sesión Serializable;

Standardmäßig ist der LevelLectura repetibleGesetzt. MySQL implementa


estos niveles de aislamiento con bloqueos exclusivos y compartidos en las
ventanas de una tabla. Para evitarlo, se utilizará un algoritmo de bloqueo de
siguiente tecla. Sólo como en SQL Server podemos bloquear y no inhalar. En
MySQL no podemos utilizar los Schlüsseln utilizados ni siquiera para los nuevos
campos de aplicación. Transaktionen, die einen Insert-Befehl ausführen wollen,
müssen warten. El algoritmo original está disponible en el manual en línea.

8.8 Fassammenfassung

Este Kapitel zeigt die Notwendigkeit des Transaktionsbetriebs eindrucksvoll auf. Sowohl
Recovery también incluye concurrencia y no hay transacciones disponibles.
Bemerkenswert ist der hohe Aufwand, der sich hinder einem sicheren Datenbankbetrieb
verbirgt, ein Aufwand in zweierlei Hinsicht: Erstens beim Datenbankhersteller mit der
Implementierung der entsprechenden Möglichkeiten und zweitens im Betrieb durch den
zusätzlichen Rechenaufwand, die recht häufigen Plattenzugriffe und die Serialisierung.
Die Concurrency wird in der Praxis mittels Sperrmechanismen sichergestellt. Estos
mecanismos sincronizados se sincronizan y garantizan una secuencia de operaciones de
transacción, que se sincronizan con las mismas fechas. Da Deadlocks auftreten können,
müssen diese vom Datenbankverwaltungssystem erkannt und aufgelöst werden. Letzteres
geschieht in der Regel mittels des Zurücksetzens einer der betroffenen Transaktionen. Aquí
está el juego de recuperación, con la ayuda de deshacer registros de los últimos tiempos para
realizar una transacción que ya no se puede realizar. Wir erkennen die enge Verzahnung
zwischen Recovery und Parallelverarbeitung.
Die vorgestellten Mechanismen zur Sicherstellung der Recovery unterstützen auch voll den
Parallelbetrieb. Erst die Concurrency erzwingt beispielsweise wegen der vielen paralelo
abzuarbeitenden Transaktionen Checkpoints. También podemos utilizar los registros con la
fecha, detener las páginas en la memoria caché y guardar los metadatos primero a través de la
conexión paralela.
8.9 Übungsaufgaben 305

La recuperación está garantizada gracias a las imágenes de antes y después junto con el
compromiso de registro en la fecha de registro de un banco de datos en todas las situaciones
en las que se encuentre. Beispielsweise muss bei Stromausfall nur auf den letzten Checkpoint
aufgesetzt und die Datenbanksitzung ab diesem Zeitpunkt unter Zuhilfenahme des Redo-Logs
nachvollzogen werden.
Si los cambios no se activan, la recuperación y la concurrencia no se realizarán en
las transacciones. La recuperación y la concurrencia garantizan la consistencia en
Fehlerfall und im Parallelbetrieb. Ihre "Arbeitseinheiten" sind daher
konsistenzerhaltende Mutationen: die Transaktionen.

8.9 Übungsaufgaben

Aufgaben
1. In einem sicheren Datenbankbetrieb wurde gerade das Transaktionsende in die
Logdatei geschrieben. Doch noch vor der Rückmeldung der im Prinzip beendeten
Transaktion an den Benutzer stürzt das ganze System ab. ¿Wid beim nächsten
Hochfahren die Transaktion deshalb zurückgesetzt? Begründen Sie Ihre Antwort!
2. ¿Fueron los puntos de control? Beschreiben Sie weiter den Nachteil, wenn eine Datenbank
ohne Checkpoints arbeiten würde.
3. In einigen einfachen Datenbankanwendungen ist die Recovery-Unterstützung
deaktiviert oder zumindest stark eingeschränkt. Woran liegt das?
4. Welche Schritte müssen vom Systemadministrator bzw. vom
Datenbankverwaltungssystem im Einzelnen durchgeführt werden, wenn eine
einzelne Transaktion wegen eines Software-Fehlers abstürzt?
5. Der Systemverwalter bemerkt im laufenden Datenbankbetrieb, dass die Festplatte, auf
der die Daten der Datenbank gespeichert sind, nicht mehr fehlerfrei arbeitet
(Schreibfehler). Welche Maßnahmen müssen im Einzelnen ergriffen werden, um
mögliche fehlerbehaftete Schreibvorgänge seit der letzten Sicherung zu eliminieren?

6. Unter welchen Voraussetzungen kann auf ein Before-Image verzichtet werden?


7. Unter welchen Voraussetzungen kann auf ein After-Image verzichtet werden?
8. ¿Ward bei den Logdaten zwischen Undo-Log y Redo-Log unterschieden?
9. ¿Cómo funcionan los puntos muertos? ¿Wie beseitigt man sie, ohne die Konsistenz der
Datenbank zu zerstören?
10. Im Parallelbetrieb kann man auch ohne Sperrmechanismen auskommen. ¿Um welches
Verfahren handelt es sich, und warum wird es kaum eingesetzt?
11. In einem kleinen Mehrbenutzer-Datenbankverwaltungssystem existiere als
Sperrmechanismus nur ein einziger Lock (globaler Datenbanklock). ¿Pueden en
este sistema ein Deadlock entstehen?
306 8 Concurrencia y Recuperación

12. Im Parallelbetrieb ist es nicht immer leicht zu sagen, ob eine TransaktionAvor oder
nach una transacciónBacre. Kann dieses Problem immer entschieden werden,
wenn wir mit Sperrmechanismen arbeiten?
13. Betrachten wir das Problem der Inkonsistenz der Daten und deren Lösung mittels
Locks in Abb.8.9. Laufen ebenfalls en un Deadlock, wenn wenn en TransaktionTA1
zunächst Konto 3, dann Konto 2 y Konto 1 abgefragt hätten? ¿Dónde están las
cerraduras das Problem der Inkonsistenz der Daten überhaupt aufgetreten?

Literatura

Connolly, T., & Begg, C. (2015).Sistemas de bases de datos(6. Aufl.). Pearson.


Fecha, CJ (1983).Una introducción a los sistemas de bases de datos(Bd. 2). Addison-Wesley. Fecha, CJ
(2003).Una introducción a los sistemas de bases de datos(8. Aufl., Bd. 1). Addison-Wesley. Eirund, H.,
& Kohl, U. (2010).Datenbanken – leicht gemacht. Springer Vieweg.
Elmasri, R., & Navathe, S. (2002).Grundlagen von Datenbanksystemen(3. Aufl.). Addison-Wesley.
Gulutzan, P., & Pelzer, T. (1999).SQL-99 completo – De verdad. Libros de I + D. Kemper, A., & Eickler, A.
(2015).Datenbanksysteme – Eine Einführung. Oldenburgo.
Kifer, M., Bernstein, A., & Lewis, PM (2006).Sistemas de bases de datos: una aplicación orientada a aplicaciones
acercarse. Pearson.

van der Lans, RF (2007).Una introducción a SQL. Pearson.


Loney, K. (2009).Oracle11 g – La referencia universal. Hanser.
Meier, A. (2003).Bancos de datos relacionales: Eine Einführung für die Praxis. Springer Taschenbuch.
Mehlhorn, K. (1988).Algoritmos de estructura de datos y eficacia(Bd. 1). Teubner. Ottmann, T., &
Widmayer, P. (2012).Algoritmos y estructuras de datos. Espectro. Schubert, M. (2007).Bancos de datos
. Teubner. Sedgewick, R. (2014).Algoritmos. Estudio Pearson. SQL (2003).SQL03: Lenguaje de base de
datos SQLISO 9075. Tanenbaum, AS (2016).Sistemas de apuestas modernos. Pearson.

Unterstein, G., & Matthiessen, M. (2012).Bancos de datos relacionales y SQL en teoría y práctica.
Saltador.
Wirth, N. (2000).Algoritmos y estructuras de datos: versión Pascal. Teubner. Zehnder,
CA (2005).Sistemas de información y bancos de datos. vdf Hochschulverlag.
Moderne Datenbankkonzepte
9

Supervisión
In den bisherigen Kapiteln konzentrierten wir uns auf relacionale Datenbanken. Estos
bancos de datos son einfach aufgebaut, leicht zu verstehen und einfach zu bedienen. Sie
orientieren sich am Transaktionsbetrieb und gelten als sehr sicher und jederzeit
verfügbar. Doch mit den enorm wachsenden Datenmengen und dem weltweiten Zugriff
treten Engpässe auf: Um den geforderten schnellen Datenaustausch von überall zu
ermöglichen, werden neue Datenbankmodelle und -konzepte erforderlich.
In den 80er Jahren des letzten Jahrhunderts setzten sich Relationsale Systeme durch.
Todas las relaciones sind gleichwertig, wir sprechen auch von einem flachen
Datenmodell. Komplexe Strukturen müssen daher aufwendig an relacionale Systeme
angepasst werden. In den 90er Jahren kamen daher objektorientierte Datenbanken auf,
um dieses Manko zu beheben. Letztlich setzten sie sich aber kaum durch. Im
Wesentlichen sind nur einige sogenannte objektrelationale Datenbanken wie Oracle,
DB2 y PostgreSQL im Einsatz. Werden im dosteil teil estos capiteles die
objektrelationalen Konzepte am Beispiel von Oracle aufzeigen.
In den letzten Jahren stieg das Interesse für verteilte Datenbanken enorm an. Aquí sei
nur das StichwortNubeerwähnt. Hinter diesem Wort verbirgt sich das Internet, wo wir
Daten in einer Wolke Hinterlegen können. El mostoWolkepasst exakt: Große
Datenmengen befinden sich irgendwo Innerhalb einer riesigen Wolke. Der genaue
Speicherort bleibt uns verborgen. Mit dieser neuen Sichtweise entstanden auch ganz
neue Zugriffssprachen, die wir unter dem BegriffNo SQLzusammenfassen. Este Kapitel
gibt im ersten Teil einen kleinen Überblick über den aktuellen Stand verteilter
Datenbanken. Dabei wird das Hauptgewicht auf die Definición und die Idea der verteilten
Datenbanken gelegt.
308 9 Moderne Datenbankkonzepte

In verteilten Datenbanken werden die Daten nicht wie bisher zentral gespeichert, sondern
auf mindestens dos Rechner oder gleich im gesamten Netz verteilt. Es versteht sich fast von
selbst, dass dadurch eine weitere Komplexitätsstufe hinzukommt, nämlich die Verwaltung der
einzelnen Datenbestände. Schließlich muss die Datenbank wissen, wo die gewünschten Daten
stehen. Bei Mehrfachhaltung von Daten ist zudem wichtig, welche der Daten derzeit gültig sind.
Wir wollen auch auf das Protokoll des Zwei-Phasen-Commit eingehen, das bereits seit vielen
Jahren im praktischen Einsatz ist.

9.1 Bancos de datos Verteilte

Cuando tengamos fechas en otras investigaciones o en la nube legen wollen, werden wir
hauptsächlich mit dos Fragen konfrontiert:

- ¿Worin liegt der Vorteil der getrennten Datenhaltung gegenüber der zentralen
Speicherung?
- Wie funktioniert die Verwaltung verteilter Datenbanken bzw. ¿Inwieweit muss der
Datenbankbenutzer beim Umstieg auf verteilte Systeme umdenken?

Wir gehen im Folgenden auf diese beiden wichtigen Fragen ein. Bei der Beantwortung der
zweiten Frage steht in der Praxis die Forderung im Vordergrund, dass der Benutzer möglichst
wenig von der Verteilung bemerkt. Dies veranlasste J. F. Date zu einer Aufstellung von zwölf
Regeln, die in einem verteilten System erfüllt sein sollten. Wir stellen diese im übernächsten
Unterabschnitt vor und gehen anschließend auf die Schwierigkeiten beim Einhalten dieser
Regeln ein. Estas Überlegungen führten dann zu Beginn des Jahrtausends zum so genannten
CAP-Theorem. Wir gehen auch darauf kurz ein.

9.1.1 Vorteile der verteilten Datenhaltung

Der Hauptgrund für die Verteilung liegt in der schnellen Verfügbarkeit. Daten ausschließlich
zentral zu halten, kann bei extrem vielen Zugriffen schnell zum Engpass werden. Weltweit
operierende Unternehmen sind ebenfalls dezentral aufgebaut. Es existieren meist mehrere
Fabriken, Werke oder Zweigstellen. Aber auch bei kleineren Firmen gibt es
Unternehmensbereiche, Abteilungen oder zumindest verschiedene Projekte. Daraus folgt
direkt, dass bereits die anfallenden Daten verteilt sind. Es ist quasi ein Schritt zurück, diese
verteilten Daten zentral zusammenzufassen. Und wir fragen uns, ob dies im Zeitalter der
Vernetzung überhaupt noch notwendig ist.
Ein wichtiger Vorteil dezentraler Datenhaltung liegt darin, dass häufig lokal zugegriffen
wird. Denken wir nur etwa an ein Geldinstitut mit vielen Zweigstellen. Viele Nachfragen und
Geldbewegungen geschehen Innerhalb der einzelnen Zweigstellen. Wir müssen in diesen
Fällen die zentralen Rechner nicht belasten.
9.1 Bancos de datos Verteilte 309

Ein weiterer Vorteil der Verteilung von Daten liegt in der Ausfallsicherheit. Setzen wir
voraus, dass dass dass verteilte System no zentralen Server besitzt, so wird der Ausfall
eines beliebigen Rechners das Netz nicht vollständig lahmlegen. Im Gegenteil, bis auf die
Daten des einen Rechners bleiben alle weiteren zugreifbar. Damit wird eine alta
Ausfallsicherheit garantiert. Aquí está el sistema central de transferencia de Aquiles. Der
Ausfall des zentralen Datenbankservers legt das gesamte System lahm.
Ein weiterer Vorteil liegt in der Optimalen Verteilung auf hunderte von Systemen. Así que
können tausende paralelole Abfragen auf verschiedene Rechner und Datenbanken gelenkt
werden. Die Antwortzeiten bleiben niedrig.
Wird in diesen Systemen auch viel geändert, so ist es äußerst schwer, die über alle Systeme
verteilten Daten konsistent zu halten. Dieser enorm hohe Kommunikationsaufwand führt dazu,
dass sich die Vor- und Nachteile letztendlich gegenseitig aufheben.

9.1.2 Die zwölf Regeln zur verteilten Datenhaltung

Bereits die ersten Veröffentlichungen zu verteilten Datenbanken beschäftigten sich mit der
Frage, wie sichergestellt werden kann, dass der Benutzer mit den Problemen der Verteilung
nicht konfrontiert wird. Wir bezeichnen dies als das fundamentale Prinzip verteilter
Datenbanken:

I Regel: Fundamentos Prinzip verteilter DatenbankenEin verteiltes System solllte


sich dem Anwender gegenüber genauso wie ein centralles verhalten.

Um dieses Prinzip zu garantieren, stellte J. F. Date einen Forderungskatalog für verteilte


Datenbanken auf. Este catálogo, consulte la fecha (1990), umfasst zwölf Regeln, die
idealerweise erfüllt sein sollten. Puede consultar la pestaña.9.1aufgelistet.
Estas normas están en un sistema modificado que no se notifica en ningún
momento, pero también en otros sistemas. Wir gehen auf this zwölf Regeln im
Folgenden kurz ein:

1.Lokale Eigenständigkeit jedes einzelnen Rechners


Jeder einzelne Rechner im verteilten System besitzt eine maximal mögliche Autonomie.
Dies bedeutet insbesondere, dass ein lokaler Zugriff auf lokal gespeicherte Daten nicht
misslingen sollte, weil ein anderer Rechner momentan nicht zugreifbar ist. Esta garantía
garantizada es válida, siempre y cuando todas las fechas locales estén registradas y todas
las fechas locales sean válidas. Dies impliziert die lokale Garantie von Integrität, Sicherheit
und Transaktionsmechanismen.
2.Keine zentrale Instanz, die das System leitet und verwaltet
Aus der lokalen Eigenständigkeit folgt direkt, dass es keine zentrale Instanz geben darf,
die die die die verteilte Datenbank allein verwaltet. Doch auch wenn die Regel 1 noche
310 9 Moderne Datenbankkonzepte

Pestaña. 9.1 Die zwölf Regeln von Date

1. Lokale Eigenständigkeit jedes Rechners


2. Keine Zentrale Verwaltungsinstanz
3. Ständige Verfügbarkeit
4. Lokale Unabhängigkeit
5. Fragmentierung gegenüber unabhängigkeit
6. Replicación de fechas sin cambios
7. Optimierte verteilte Zugriffe
8. Verteilte Transaktionsverwaltung
9. Unabhängigkeit von der Hardware
10. Unabhängigkeit von Betriebssystemen
11. Unabhängigkeit vom Netz
12. Unabhängigkeit von den Datenverwaltungssystemen

Voll erfüllt sein sollte, ist eine zentrale Verwaltung nicht wünschenswert: Das
Gesamtsystem wird verwundbar, sei es, dass die zentrale Instanz ausfällt oder sei es
nur, dass zentrale Rechner zum Engpass wird.
3.Ständige Verfügbarkeit
In einem verteilten System sollte es nie erforderlich sein, aus Gründen der
Datenbankverwaltung das gesamte System oder auch nur erhebliche Teile davon
abzuschalten.
4.Lokale Unabhängigkeit
Unter lokaler Unabhängigkeit verstehen wir, dass der Benutzer nicht wissen muss, wo die
einzelnen Daten gespeichert sind. Diese Regel erleichtert die Programmierung erheblich,
da die gleichen Program auf allen Rechnern der verteilten Datenbank ohne Anpassung
ablaufen. Estas reglas están implícitas en todo lo que se refiere a las fechas establecidas
en las fechas en las que se cree que Rechner zwecks weiterer Bearbeitung geholt werden
können.
5.Fragmentierung gegenüber unabhängigkeit
Fragmentierung ist eine Erweiterung der Partitionierung (siehe auch Abschn.7.3) und
heißt, dass vorgegebene Dateneinheiten, etwa Relationen oder divisionierte Relationen,
auf mehrere Rechner verteilt sein können. Denken wir nur an eine große Personaltabelle,
in der alle Mitarbeiter einer Firma geführt werden. Aus Performancegründen ist es
empfehlenswert, die Mitarbeiterdaten der einzelnen Niederlassungen lokal zu halten, die
RelationPersonalTambién auf mehrere Rechner zu verteilen. Genau this Möglichkeit
fordert this fünfte Regel. El mostoUnabhängigkeitweist darauf hin, dass der Benutzer
nicht merken soll, ob Daten fragmentiert sind oder nicht.
6.Replicación de fechas sin cambios
Unter Datenreplikation verstehen wir, dass Kopien von Daten auf mehreren Rechnern
gleichzeitig gehalten werden dürfen. Dies verbessert sowohl die Performance, falls häufig
auf die gleichen Daten lokal zugegriffen wird, als auch die Verfügbar-
9.1 Bancos de datos Verteilte 311

Keit. Die Replikation besitzt aber auch einen schwerwiegenden Nachteil: Werden die
Daten in einem der Replikate geändert, so müssen auch alle other Kopien angepasst
oder zumindest invalidiert werden. Die Verwaltung dieser Replikate und deren
Invalidierung bedingen einen hohen Aufwand. Wieder ist this Verwaltung alleinige
Aufgabe des Verteilten Datenbanksystems, das sich nach Aussage dieser Regel für
den Benutzer genauso zu verhalten hat wie ein System, das keine Replikate
unterstützt.
7.Optimierte verteilte Zugriffe
La optimización de la conexión está en un sistema totalmente modificado que no se puede
utilizar en un centro, ya que las fechas se deben transportar por (el mismo idioma).
Optimierung heißt, dass jeder einzelne Zugriff möglichst ohne Umwege erfolgen sollte, y
dass die Anzahl der Zugriffe für eine Anfrage minimiert wird. Fragen wir etwa am Rechner
in München nach allen Artikeln, die im Lager in Hamburg vorrätig sind, so genügt ein
Befehl. Dies impliziert in der Praxis aber viele Zugriffe: Wir müssen zunächst erfahren, wo
die Hamburger Daten stehen, und erst dann können wir auf die Lagerdaten zugreifen.
Moderne nichtrelationale Ansätze versuchen hier zu optimieren.
8.Verteilte Transaktionsverwaltung
También en sistemas conectados y transacciones atómicas. La recuperación y la
concurrencia deben realizarse sin problemas. Als Anwendungsbeispiel werden wir in
Abschn.9.1.6den Zwei-Phasen-Commit kennen lernen. Er basiert darauf, dass
zunächst alle betroffenen Rechner des verteilten Systems eine lokale Transaktion
ausführen und erst dann, wenn alle Teilsysteme mit aeinem Lokalen Commit enden,
auch ein globaler Commit erfolgt. Dies erfordert eine globale Kontrolle
undwidespricht damit der zweiten Regel. Wir diskuteren dies ausführlich in den
nächsten Abschnitten.
9.Unabhängigkeit von der verwendeten Hardware
Esta transferencia es de gran generell erfüllt. Los PC con sistemas de comunicaciones
universales se comunican entre sí y con grandes dimensiones. La plataforma de hardware
dice que no hay ningún rollo.
10.Unabhängigkeit von den verwendeten Betriebssystemen
Diese Regel ist im Wesentlichen nur ein Unterpunkt der vorhergehenden. Windows,
MacOS, UNIX y MVS, um nur einige zu nennen, arbeiten Hand in Hand.
11.Unabhängigkeit vom verwendeten Netzwerk
Im Zeitalter des Internets und der globalen Vernetzung mit entsprechenden Protokollen
ist diese Forderung weitgehend erfüllt.
12.Unabhängigkeit von den Datenbankverwaltungssystemen
Este reglamento no es tan autónomo como el anterior. Doch die einzelnen
Datenbankhersteller nähern sich dank einheitlicher Protokolle einander an.
Utilice la interfaz de usuario de Internet utilizando JSON y PHP/PDO. Die
Kommunikationssprache zwischen den einzelnen
Datenbankverwaltungssystemen war bis vor wenigen Jahren noch einheitlich
SQL. Hier haben sich inzwischen aber auch andere Sprachen etabliert. Wir
kommen auf NoSQL in this Kapitel noch kurz zu sprechen.
312 9 Moderne Datenbankkonzepte

Leider ist es nicht möglich, alle zwölf Regeln gleichzeitig zu erfüllen, da sie sich
teilweise broadsprechen: Es ist beispielsweise in der Praxis unmöglich, in einem verteilten
System alle betroffenen Replikate beim Commit gleichzeitig zu aktualisieren. Werden
daher meist die eine oder andere oder gleich mehrere Regeln nur teilweise erfüllen
können. Die Regeln 1 bis 6 sind ein ehrgeiziges Ziel und sind heute in vielen verteilten
Systemen weitgehend implementiert. Die Regeln 9 bis 11 sind inzwischen
selbstverständlich. Doch die Forderungen 7, 8 y 12 sind äußerst anspruchsvoll und
nowidespruchsfrei. Die Regeln 7 y 12 erwarten einheitliche Schnittstellen mit einem
einheitlichen Transaktionsbetrieb. Regel 8 fordert verteilte Transaktionen, die mit den
starren Reglementierungen in SQL kaum zu realisieren sind.
Wir müssen letztendlich Kompromisse schließen. Im nächsten Abschnitt werden wir
Verfügbarkeit, sicheren Transaktionsbetrieb und Verteilung der Daten gegeneinander
abwägen.

9.1.3 Teorema de Das CAP

Bei stetig steigenden Datenmengen werden bestehende Rechensysteme früher oder


später zum Engpass. Sie müssen durch leistungsfähigere Systeme ersetzt werden. Wir
sprechen hier von einerescalera vertical. Esta configuración de lectura no es segura, por
lo que el final de los años 90 comenzó a funcionar, las fechas en la WEB auf viele Rechner
zu verteilen. Esta Verteilung Heißtescalera horizontal. Viele Systeme nehmen die Daten
auf und stellen diese verteilt zur Verfügung.
Esta función funciona en la configuración sólo cuando las fechas no se replican cuando
se necesitan más registros. Es gelang nicht, die Regeln 4 bis 7 zu vereinen: Nur wenn
jedes Datum genau auf einem Rechner gespeichert wurde, war die volle
Transaktionssicherheit gewährleistet. En el año 2000, estellte schließlich E. Brewer das
CAP-Theorem vor, siehe Brewer (2000). Este Satz dice:

I Satz: Teorema CAPconsistencia (Cconsistencia), Verfügbarkeit (Adisponibilidad)


und Ausfalltoleranz (Tolerancia de la redPAGartitions) können in verteilten
Datenbanken nicht gleichzeitig erfüllt werden.

Drücken wir dieses Theorem etwas anders aus: Nur dos wei dieser drei Eigenschaften
können in einer verteilten Datenbank gleichzeitig vollständig realisiert werden. Die englischen
Anfangsbuchstaben dieser drei Eigenschaften gaben diesem Satz ihren Namen. Betrachten wir
diese Eigenschaften etwas näher:

C wie Consistencia (Konsistenz)Konsistenz kennen wir bereits vom Transaktionsbetrieb


und vom ACID-Modell (siehe Abschn.1.6). Sie besagt, dass zur gleichen Zeit alle mehrfach
gehaltenen gültigen Daten übereinstimmen müssen. Si las fechas actualizadas se
actualizan correctamente, podrá utilizar el atomizador según el modelo ACID.
9.1 Bancos de datos Verteilte 313

Die Konsistenz ist in einem Transaktionsbetrieb eine zwingende Voraussetzung und in der
achten Regel von Date aufgeführt.

A wie Disponibilidad (Verfügbarkeit)Verfügbarkeit ist weit umspannend und umfasst vor


allem die Regeln 3 und 7. Insbesondere darf der Ausfall einzelner Rechner nicht zum Ausfall
des gesamten Systems führen. Letztlich muss eine Anfrage an einem Rechnerknoten immer zu
einem Ergebnis führen. Dabei spielt auch eine kurze Antwortzeit eine wichtige Rolle. In einem
Transaktionsbetrieb ist Verfügbarkeit ebenfalls sehr wichtig.

P wie Tolerancia de particiones (Ausfalltoleranz)Ausfalltoleranz taucht in den zwölf Regeln


von Date nicht direkt auf, ist aber versteckt gleich in mehreren enthalten. Hier geht es darum,
dass in Netzen Daten verloren gehen können, oder auch nur verspätet zugestellt werden. Dies
kann kurzzeitig zu Konsistenzverletzungen führen. Das Gesamtsystem sollte tolerant mit diesen
Problemen umgehen, insbesondere sollte es deshalb nicht ausfallen oder komplett
zurückgesetzt werden müssen.
Da nach CAP-Theorem nicht alle drei Eigenschaften gleichzeitig erfüllt sein
können, können wir die drei Eigenschaften als drei sich nicht gemeinsam
schneidende Kreise zeichnen. Wir erhalten damit das Bild aus Abb.9.1. También
veremos en esta imagen, tres Schnittmengen gibt, con marcas C-A, C-P y P-A. Estos
Schnittmengen wollen wir etwas genauer trachten:

Sistema CAHier kommt es auf Konsistenz und Verfügbarkeit an. Wer bewegen uns im
klassischen Bereich der Relationsalen Datenbanksysteme. Dies heißt aber nicht, dass es in
CA-Systemen keine Verteilung gibt. Schon seit mehr als 20 Jahren wird beispielsweise das
Zwei-Phasen-Commit-Protokoll in verteilten Datenbanken mit großem Erfolg eingesetzt.
Auf this Protokoll werden wir in Abschn.9.1.6noch ausführlicher eingehen. Auf

Tejido. 9.1CAP-Eigenschaften

C C A
consistencia A Verfügbarkeit

PAG
Ausfalltoleranz
314 9 Moderne Datenbankkonzepte

Netzwerkfehler debe in diesen Systemen explizit reagiert werden. Estos


automatismos no se pueden utilizar.

Sistema CPHier kann es bei Netzwerkproblemen zu Unregelmäßigkeiten und damit


unterschiedlichen Datenständen kommen. In diesen Systemen hat die Konsistenz oberste
Priorität. Wir verzichten stattdessen auf die Verfügbarkeit. In der Praxis heißt dies, dass wir bei
ernsten Problemen das Gesamtsystem, zumindest aber die betroffenen Teilsysteme
herunterfahren und reparieren müssen. Damit werden CP-Systeme letztlich ähnlich wie CA-
Systeme behandelt, denn nach dem Hochfahren liegt auch die Verfügbarkeit wieder vor.

Sistema PAAquí tritt die Konsistenz in den Hintergrund. Die Daten sind im Prinzip
beliebig internalhalb des Systems verteilt. Replikate dürfen vorliegen. Der Teilausfall von
Komponenten impliziert nicht den Gesamtausfall. El sistema es muy alto. Allerdings geht
dies auf Kosten der Konsistenz. Dies heißt aber nicht, dass este sistema es inconsistente.
Vielmehr kann nur die sofortige Konsistenz der Daten nicht garantiert werden. Schließt
etwa eine Transaktion nach durchgeführten Änderungen mit einem Commit ab, so
werden die einen Transaktionen bereits die neuen Daten lesen, andere Hinggen noch die
alten. Selbstverständlich kann das System mit diesen inkonsistenten Datenständen
umgehen und wird im Laufe der Zeit alle Daten weeder sincronizate.
PA-Systeme gibt es erst seit wenigen Jahren. Algunos bancos de datos NoSQL incluyen estos
sistemas PA. Se encuentran Amazon Dynamo, CouchDB, Casandra y Riak erwähnt. Auf diese
Systeme werden wir kurz im übernächsten Abschnitt eingehen. Cloud-Systeme basieren zum
großen Teil ebenfalls darauf. Natürlich können PA-Systeme die Konsistenz nicht völlig außer
Acht lassen. E. Brewer stellte deshalb ein eigenes Konsistenzmodell BASE vor, das wir uns im
nächsten Abschnitt näher ansehen.

9.1.4 El modelo de consistencia BASE

El teorema CAP dice esto, no todas las tres características propias de la coherencia, la
verificación y la tolerancia a la caída se pueden lograr. En un sistema PA se activará la
consistencia del tiempo. Auf Konsistenz insgesamt kann aber in keinem System verzichtet
werden. E. Brewer dijo en Brewer (2000) ein Konsistenzmodell namens BASE vor, das auch
in einem PA-System eingehalten werden kann. Die vier Buchstaben von BASE stehen
dabei für:

- B asicamenteA disponible: Die Verfügbarkeit des Systems ist wichtiger als die Konsistenz
- S Estado frecuente: Nach Transaktionsende wird die Konsistenz fließend (weich) erreicht
- mi Consistencia ventual: Schlussendlich sind die Daten konsistent
9.1 Bancos de datos Verteilte 315

En los bancos de datos relacionales clásicos, se indica el modelo ACID en el fondo del orden.
Unter keinen Umständen dürfen Daten verloren gehen. Anders verhält es sich mit vielen Cloud-
Datenbanken. Heer kommt es auf die extrem schnelle Verfügbarkeit an. Ob Daten sofort oder
erst in einer Stunde gültig sind, spielt dann oft eine untergeordnete Rolle. Aquí está el modelo
BASE fragmentado. Ansonsten gibt es in NoSQL-Datenbanken eine große Bandbreite. Die einen
nähern sich eher dem BASE-, die anderem dem ACID-Modell an.
Naturalmente, es un banco de datos verteilte en un lugar tan complejo como un banco
central. Je näher sich un solche Datenbank beispielsweise dem ACID-Modell nähert, umso mehr
muss im Parallelbetrieb synchronisiert werden. Auf verschiedenen Rechnern kann die Uhrzeit
geringfügig voneinander abweichen. Auch werden zum Serialisieren eventuell
rechnerübergreifende Locks benötigt. Und schon können über Rechnergrenzen hinweg
Deadlocks auftreten. Tenemos algoritmos complejos completos, los juegos de palabras en
Fecha (1983) gut beschrieben sind.

9.1.5 Überblick über moderne Datenbanksysteme

Neben den klassischen Relationsalen Datenbanken lassen sich die heutigen modernen
Datenbanken in vier Kategorien unterteilen:

- Clave/Valor-Datenbanken
- Dokumentenbasierte Datenbanken
- Spaltenorientierte Datenbanken
- Graphen-Datenbanken

La idea deClave/Valor-Datenbankenist einfach: Wir speichern die einzelnen Datensätze


zusammen mit dem Schlüssel ab. Ein Datensatz ist meist eine Zeichenkette, kann aber auch aus
aus einer komplexen Struktur bestehen. El último banco de datos clave/valor es BerkeleyDB.
Estas versiones están en las primeras versiones de los años 70 bajo Unix incorporado. Heute ist
das kommerzielle Amazon-System Dynamo bekannt bekannt. Als Open Source sei Riak
erwähnt. Los bancos de datos de clave/valor son einfach zu skalieren y daher im Cloud-
Computing weit verbreitet. Einen sehr schönen Überblick se encuentra en Edlich et al. (2011).

Enbancos de datos documentadoswerden alle Daten als Dokumente abgelegt. Estos


bancos de datos se han registrado en Lotus Notes. In diesen Datenbanken gibt es keine
fest vorgeschriebenen Strukturen, da sich praktisch alle Daten als Dokumente definieren
und speichern lassen. Dies ist vor allem bei WEB-Anwendungen von großem Vorteil. Esto
se debe a que no hay conexión entre MongoDB y CouchDB.
Spaltenorientierte Datenbankenspeichern die Daten nicht zeilen-sondern spaltenweise. In
der Praxis werden heute nur selten reine spaltenorientierte Modelle eingesetzt. Vielmehr
orientieren sich die meisten dieser Datenbanken am Big-Table-Konzept von Google. Genau
genommen handelt es sich dabei um eine Mischform von Key-Value- und
316 9 Moderne Datenbankkonzepte

Pestaña. 9.2 Zuordnung moderner Datenbanken

Sistema CA Sistema CP Sistema PA


Oráculo
Relacional
servidor SQL
Bancos de datos
MySQL,…
Valor clave Dinamo
BerkeleyDB
Bancos de datos Riak
Dokumentenbasierte
MongoDB sofádb
Bancos de datos

Spaltenorientierte Mesa grande


casandra
Bancos de datos HBase

Spalten-Datenbanken. Eine Big-Table wird beispielsweise sowohl durch einen Zeilen-als


auch einen Spaltenindex indiziert. Zusätzlich wird mit den Daten ein Zeitstempel
abgespeichert. Da in einer Big-Table keine Daten gelöscht werden, erfolgt der Zugriff auf
gültige Daten immer immer mittels des Tripels Zeilenindex, Spaltenindex und
Zeitstempel. Neben Googles Big-Table gibt es el DatenbankHBasepor Microsoft ycasandra
por Facebook. Einen guten Überblick über weitere spaltenorientierte Datenbanken gibt
wieder Edlich et al. (2011).
Graphen-Datenbankenwerden vor allem in Navigationsgeräten eingesetzt. Se
encuentran también en Geodatenbanken y en sozialen Netzwerken breite Anwendungen.
Grundlage dieser Datenbanken ist die Graphentheorie. Estos bancos de datos son una
buena idea, un grafico para durchsuchen. Sie erlauben auch eine schnelle rekursive Suche
ohne aufwendige Verbund-Operationen. Dabei können die gespeicherten Daten in der
Regel unstrukturiert sein. Bekannt sind vor allem die Open Source Datenbankenneo4jy
OrientDBsowieGraphDBder Firma Sones. Eine ausführliche Einführung in
graphenorientierte Datenbanken finden wir in Meier (2016).
Bis auf die Graphen-Datenbanken lassen sich alle hier vorgestellten Datenbanken
einem der drei CAP-Systeme zuordnen. Einen guten Überblick gibt Tab.9.2, in der die
Graphen-Datenbanken allerdings fehlen.
Todos los sistemas CP y PA modernos son relativamente complejos. Jede dieser
Datenbanken erfordert daher einen hohen Aufwand an Einarbeitung, um die Funktionsweise
vollständig zu verstehen. Dies würde den Rahmen dieses Buches bei weitem sprengen. Um
zumindest eine kleine Vorstellung der Problematik der Konsistenz in verteilten Datenbanken zu
bekommen, werden wir im nächsten Abschnitt das seit Jahren bewährte Protokoll des Zwei-
Phasen-Commit vorstellen.

9.1.6 Compromiso Zwei-Phasen

In hochverfügbaren verteilten Systemen ist es sehr schwer die zeitnahe Konsistenz zu


garantieren. Um die Probleme aufzuzeigen, stellen wir das in relacionalen Datenbanken
9.1 Bancos de datos Verteilte 317

schon seit vielen Jahren verwendete Protokoll des Zwei-Phasen-Commits vor. Esto
significa que la consistencia de un sistema también es más segura.
Das Protokoll des Zwei-Phasen-Commit relacionaler Datenbanken entspricht einem CA-
System y garantiert zeitnahe Konsistenz und hohe Verfügbarkeit. Es wird insbesondere in
betriebswirtschaftlichen Anwendungen eingesetzt, etwa beim Ein- und Verkauf, in der
Produktion oder in Buchungs- und Abrechnungssystemen.
Ein sehr anschauliches Beispiel liefern Banksysteme. Meist besteht eine größere Bank aus
einer Datenbankzentrale und mehrere Filialen oder Tochtergesellschaften mit jeweils eigenen
lokalen Datenbanken. Und schon liegt eine verteilte Datenbank vor: Die Daten sind zwischen
Zentrale und den Filialen aufgeteilt, siehe etwa Abb.9.2. Überweisungen von einer Zentrale zur
Filiale oder umgekehrt erfolgen dann datenbankübergreifend. Betrachten wir beispielsweise
eine Überweisung von der Filiale A zur Zentrale. Es sind in diesem Fall dos Datenbanken
involucrados, die der Filiale und die der Zentrale.
Wir unterteilen daher unsere Gesamtüberweisung in dos lokale Abschnitte, in die
Buchung in der Zentrale und die Buchung in der Filiale A. Wir benötigen zusätzlich
allerdings einen globalen Koordinator, der sicherstellt, dass auch wirklich beide lokalen
Abschnitte vollständig abgeschlossen werden. También hemos estado en Summe dos
transacciones locales y un coordinador global, den wir alstransacción globalbezeichnen.

Um die Konsistenz datenbankübergreifend sicherzustellen fordern wir, dass globale


Transaktionen erst dann als abgeschlossen gelten, wenn alle dazugehörigen lokalen
Transaktionsabschnitte erfolgreich beendet sind.
Es darf demnach nicht passieren, dass beim bargeldlosen Geldtransfer von einem
Geldinstitut zum anderen die Transaktion in der einen Datenbank erfolgreich
abgeschlossen und dieselbe Transaktion in der anderen Datenbank wegen eines Fehlers
zurückgesetzt wird. En este otoño se eliminará la consistencia del sistema financiero, ya
que un banco de datos no podrá haber sido registrado en otros lugares.

central bancaria

filial A filial b

Tejido. 9.2Verteilte Datenbank am Beispiel


318 9 Moderne Datenbankkonzepte

Tenemos un protocolo especial, el compromiso de dos fases y la garantía de


consistencia del banco de datos. En este protocolo dorado:

- Jede einzelne Datenbank arbeitet für sich im Transaktionsbetrieb, d. h. Sie besitzt ihre
eigenen Logdateien, ihre eigene Metadatenverwaltung und führt nach Beendigung einer
Transaktion ein „lokales“ Commit durch. Das Gleiche gilt entsprechend für Checkpoints y
otros Performancemaßnahmen wie etwa der Datenbankpufferung.
- Einer der beteiligten Rechner funge como coordinador. Dazu wird eine eigene
"globale" Transaktion gestartet. Esta transacción supervisa las transacciones locales y
expresa las acciones globales en una fecha de registro propia. Ist die
Gesamttransaktion erfolgreich, so schließt diese mit einem „globalen“ Commit ab.

El algoritmo desarrollado está incluido en la pestaña.9.3wiedergegeben. Mit diesem


Vorgehen kann die Konsistenz des Gesamtsystems immer sichergestellt werden, egal in
welcher der beteiligten Datenbanken ein Fehler auftreten sollte. Wird etwa lokal entschieden,
eine noch nicht abgeschlossene Transaktion abzubrechen, so wird diese lokal zurückgesetzt,
zusammen mit einer Meldung an den Koordinator. Esto proporciona una reversión y todos los
bancos de datos actualizados. Dort werden die entsprechenden Transaktionen jeweils lokal
zurückgesetzt. Esto es fácil para una reversión global.
Es sei angemerkt, dass este Zwei-Phasen-Commit zwar die auftretenden Probleme
meistert, aber extrem aufwendig ist. Unseren Erfahrungen nach ist bei verteilten
Datenbanken unter Verwendung des Zwei-Phasen-Commits in der Regel mit etwa einer
Verzehnfachung der Antwortzeiten gegenüber nichtverteilten Anwendungen zu rechnen!
En Einzelfällen liegen die Antwortzeiten sogar darüber. Estas son todas las acciones
locales y el coordinador también lo hará. Dieser muss diese Einzelereignisse quittieren,
bevor local weitergearbeitet werden kann. Dauert dieses gegenseitige Antworten sehr
lange, so müssen die jeweiligen Transaktionen überprüfen,

Pestaña. 9.3Algoritmo de confirmaciones de dos fases

Jede betroffene Datenbank startet eine lokale


Lokales Abarbeiten
Transaktion: Lokale Änderungen werden in der
una transacción
lokalen Logdatei protokolliert. (PrincipianteFase 1 )
Am Ende einer lokalen Transaktion erfolgt eine
Melden des Trans-
entsprechende Meldung (Comprometersebzw.Retroceder)
acciones
un coordinador del den (Ende derFase 1 ).
El coordinador reúne todas las reuniones locales. Liegen
Globales Trans nur erfolgreiche Rückmeldungen vor, so wird ein global
acción Comprometerse, ansonsten einRetroceder eingetragen (
Fase 2 ).
Das Ergebnis der globalen Transaktion wird an alle
lokalen Rechner geschickt. Jeder lokale Rechner
Endgültiges lokales
übernimmt das globale Ergebnis (Comprometerse
transacciones
oder Retroceder) als endgültiges. Erst jetzt ist die
Transaktion abgeschlossen (Ende derFase 2 ).
9.2 Bancos de datos orientados a objetos 319

ob die beteiligten Rechner überhaupt noch aktiv sind. Dies führt zu sehr komplexen
Protokollen. Die Netzlaufzeiten addieren sich zusätzlich hinzu.
Die Recovery ist erheblich aufwendiger as im Einzelbetrieb, insbesondere wen der
Rechner ausfällt, der als Koordinator fungiert. In diesem Fall muss anhand des globalen
Logs ermittelt werden, welche Transaktionen als abgeschlossen gelten. Mit Hilfe der
lokalen Logdateien werden dann die Änderungen in den einzelnen Datenbanken
gegebenenfalls zurückgesetzt oder übernommen. Dieser hohe Aufwand führt letztlich
zum gewünschten Ziel: ¡Es wird auf den letzten konsistenten Stand des Gesamtsystems
aufgesetzt!

9.2 Bancos de datos orientados a objetos

Unter objektorientierten Datenbanken verstehen wir Datenbankmodelle, denen


objektorientierte Konzepte zugrunde liegen. Mit den objektorientierten Programmiersprachen
entstanden in den 80er Jahren auch diese new Datenbanken. Sie sind seit den 90er Jahren im
praktischen Einsatz. Wir unterscheiden heute dos Arten objektorientierter Datenbanken: Zum
einen gibt es die Datenbanken, die aus objektorientierten Programmiersprachen entstanden,
und zum othereren die objektorientierten Erweiterungen relacionaler Datenbanken. Die
erstgenannten spielen heute eine untergeordnete Rolle. Los sistemas relacionales establecidos
en los bancos de datos se mantienen en el juego de Oracle.
Este Abschnitt establece Grundkenntnisse über objektorientierte Programmierung voraus.
Insbesondere sollten Begriffe wie Objekte, Klassen, Methoden, Datenkapselung und Vererbung
geläufig sein.

9.2.1 Definición objektorientierter Datenbanken

El Begrifforientado a objetosist in der Literatur nicht genau festgelegt. Entsprechend


schwer fällt es zu sagen, wann eine Datenbank objektorientiert ist y wann nicht. Wir
verwenden daher eine sehr allgemeine Definición.

IDefinición: Bancos de datos orientados a objetosEine Datenbank heißtorientado a objetos ,


wenn sie grundlegende objektorientierte Konzepte wie Objekte, Klassen, Methoden,
Kapselung und Vererbung enthält und verwendet.

Die in der Definición aufgezählten Begriffe sind der objektorientierten Programmierung


entnommen. Bei Objekten handelt es sich um einzelne Gegenstände, die gegebenenfalls sehr
komplex sein können. Beispielsweise wäre ein einzelnes Flugzeug ein Objekt, das aus Rumpf,
Tragflächen und Motoren bis zu Anzeigeinstrumenten und Schrauben zusammengesetzt ist.
Eine Klasse ist ein Objekttyp, gibt also den Aufbau von Objekten wieder.
320 9 Moderne Datenbankkonzepte

En un serem Beispiel wäre dies un Flugzeugtyp, etwa un Airbus A300. Objekte sind
folglich Elemente einer bestimmten Klasse. Eine Klasse enthalt sowohl Eigenschaften als
auch Methoden, die auf die Klassenobjekte angewendet werden. Beim Flugzeug kommen
unter anderem die MethodenInicioFlugzeug,UeberpruefeFlugzeugoderLandeFlugzeug en
Fragé.
Die Kapselung sorgt dafür, dass nicht wahllos die Daten eines Objekts manipulated werden
dürfen. Vielmehr muss in der Regel über die Methoden zugegriffen werden. Interessieren etwa
alle durchgeführten Wartungen, so ist die entsprechende Methode aufzurufen, etwa
AusgebenWartungsmeldungen. Dies garantiert, dass die internamente Struktur einer Klasse
jederzeit geändert werden kann. Es müssen nur jeweils die Methoden dieser neuen Struktur
angepasst werden, nicht aber die Programme, die auf diese Klassen zugreifen.
Die Vererbung ermöglicht die Spezialisierung von Klassen. Hemos sido etwa eine allgemeine
KlasseAeropuertoDefiniert, so können wir die Grundeigenschaften einschließlich deren
Methoden auch in die KlassenMotorflugzeugySegelflugzeugübernehmen, sie werden también
weitervererbt. Es müssen nur die zusätzlichen neuen Eigenschaften und Methoden hinzugefügt
werden.
Estas características propias de la orientación de objetos se incluyen también en los bancos
de datos. Schließlich besitzen Relationsale Datenbanken auch einige erhebliche Schwächen.
Esto se encuentra en la pestaña.9.4kurz zusammengefasst: In relatedalen Datenbanken fällt es
schwer, die nicht weiter zerlegbaren Einzelteile eines komplexen Bauteils zu ermitteln, seien es
die Anzahl der Tretlager des Herren- oder Damenrads aus der BeispieldatenbankBicicleta im
Anhang oder die Anzahl der Bordinstrumente beim Flugzeug. In objektorientierten
Datenbanken liefern entsprechende Methoden, rekursiv programmiert, zuverlässig die
gewünschten Ergebnisse.
Um hohe Normalformen und damit einfache Zugriffe und eine redundanzfreie
Datenhaltung zu erhalten, werden in relacionaalen Systemen komplex Strukturen
„flachgeklopft“. Deshalb werden komplex Objekte im Relationenentwurf meist völlig
umstrukturiert. Die dabei entstehenden Relationen hanben dann nur wenig mit den
zugrundeliegenden Originalstrukturen gemeinsam, müssen aber bei den einzelnen Zugriffen
bekannt sein. In der Regel bauen dann zahlreiche Joins die ursprüngliche Struktur wieder auf,
was schnell zu erheblichen Leistungseinbußen führen kann.
Ganz anders sieht dies bei objektorientierten Datenbanken aus. Auch komplexeste
Datenobjekte behalten in der Datenbank ihre Struktur bei. Entsprechende Zugriffe sind daher

Pestaña. 9.4Nachteile relacional Datenbanken

Noche Auswirkung
Komplexe Objekte werden „flachgeklopft“; ihr Aufbau
Flache estructura
ist aus dem Design nicht mehr direkt ersichtlich
Der Aufbau komplexer Objekte kann nur schwer
Keine Rekursion
nachvollzogen werden (Stücklistenproblem)
Häufige se une a las relaciones zusammengehörige que
Viejas relaciones
amplían el tiempo de vida
9.2 Bancos de datos orientados a objetos 321

meist schnell, auch werden erforderliche rekursive Zugriffe in objektorientierten


Systemen direkt unterstützt.
Betrachten wir beispielsweise die RelationenArtículoyestructura de teileel banco de datos
Bicicleta. Relación de matrizArtículoenthält alle Teile und die Relationestructura de teilegibt an,
welches komplexe Teil aus welchen Einzelteilen besteht. Ein Einzelteil kann aus weiteren
einfacheren Einzelteilen zusammengesetzt sein und so fort. Es liegt ein rekursives Problem zum
Bestimmen aller nicht weiter zusammengesetzten Einzelteile eines Fahrrads vor. Este es un
sistema relacional que no se implementa fácilmente.
In objektorientierten Systemen können wir dagegen die Struktur eines Objektes
Fahrraddirekt angeben (siehe Abb.9.3). Die Originalstruktur wird also unverändert
übernommen. Wir können uns mit entsprechenden Befehlen direkt entlang dieser
Strukturen bewegen und erhalten die gewünschten Informationen einfach und schnell.
Wir wollen aber nicht verschweigen, dass objektorientierte Datenbanken auch Nachteile
besitzen. Die komplexere Struktur erfordert eine aufwendigere Verwaltung. Vor allem steigt die
Komplexität der Zugriffsbefehle. Der Aufbau von Objekten aus Unterobjekten es jerárquico. Wir
müssen die gegebene Welt in dieses Schema einordnen. Auch einige Nachteile hierarchischer
Datenbanken bekommen wir hier zu spüren, viele Zugriffsbefehle und keine zugrundeliegende
umfassende mathematische Theorie.
Die Praxis der letzten 20 Jahre hat gezeigt, dass objektorientierte Datenbanken die
relacionalen nur in Nischenplätzen verdrängen konnten, und nur dort, wo komplex Objekte
zugrunde liegen und gefragt sind. Dies gilt vor allem im technisch wissenschaftlichen Bereich,
etwa in den Bereichen CAD (Computer Aided Design) und CIM (Computer Integrated
Manufacturing), in der Büroautomatisation und in Multimedia-Bereichen.
In praktisch allen anderen Fällen lohnt der Umstieg nicht: Zum einen wäre der
Umstellungsaufwand sehr hoch und zum anderen besitzen objektorientierte Datenbanken die

Fahrrad

Rahmen, satélite grupo Räder Lenker pedalear


descuidado Deore

Rahmen, Felgen bereifung Schlauch


Geschw.

Rohre Tretlager gabel

Tejido. 9.3Objeto Fahrrad


322 9 Moderne Datenbankkonzepte

oben angesprochenen Nachteile. Para reducir la reducción de costes y mejorar la


seguridad relacional en la orientación de objetos, se utiliza el lenguaje SQL3 (como
SQL99).1999) Die Relationsalen Datenbanken mit objektorientierten Strukturen erweitert.
Esta norma SQL es compatible con SQL2003 (como SQL03 2003) weiter ergänzt. Estos
bancos de datos también duran mucho tiempo.objetorelacionalbezeichnet.
Heute stechen vor allem Oracle, DB2 y PostgreSQL mit ihren objektrelationalen
Erweiterungen hervor. Rein objektorientierte Ansätze haben sich bisagragen kaum
durchgesetzt. Bekannt wurden hier vor allem O2 y ObjectStore. Beide Datenbanken
spielen aber heute kaum noch eine Rolle. Einen guten Überblick zu objektorientierten
Ansätzen und Datenbanken finden wir beispielsweise in Connolly und Begg (2010) y en
Elmasri y Navathe (2009).

9.2.2 Bancos de datos objetivos

Die Erweiterung relacionaler Datenbanken durch Hinzufügen objektorientierter Strukturen und


Methoden ist der objektorientierte Ansatz, der sich in den letzten durchgesetzt hat, und den wir
hier hier auch vorstellen wollen. Este Ansatz está ausgerichtet darauf, morir en Tab.9.4
aufgeführten Nachteile zu beseitigen oder zumindest zu verringern. Es ist dabei nicht das
vorrangige Ziel, möglichst viele objektorientierte Konstrukte zu übernehmen. Vielmehr bleibt
beispielsweise die Mehrfachvererbung ausgespart. Wir sprechen hier von objektrelationalen
Datenbanken.
Esta Ansatz der Erweiterung es deshalb von großem Interesse, da Migrationen von
uninem in ein other System sehr aufwendig sind. Los sistemas relacionales son bisagras,
por lo que se utilizarán estos mejores bancos de datos sukzessive und Schritt für Schritt
objektorientierte Methoden hinzufügen können.
Ein großer Vorteil relacionaler Datenbanken ist ihre Einfachheit. Estos se incluyen en
otros errores, ya que los atributos específicos no son atomizados en forma constante
(antes forma normal). Wir haben aber bereits in Kap.2gesehen, dass dies auch Nachteile
mit sich Bringt. Relación de matrizVerkaeuferProductotambién Tab.2.1ist immerhin in der
dersten Normalform und besitzt trotzdem eine sehr hohe Redundanz. Esta redundancia
puede ser necesaria, cuando la atomaridad se activa. Wir verweisen auf Tab.2.3. Genauso
ließe sich auch leicht eine redundanzfreie RelaciónFahrrad(siehe Abb.9.3) erstellen, in der
in einem AttributEinzelteileeinfach die einzelnen Teile aufgelistet werden.
Esta Ansatz führt zu den NF2-Relaciones (NF2=NFNF =norte en-F primero-norte normal-F
orm). Definiremos:

Idefinición: NF2-RelacionesUna relación está en elNF 2-forma normal , cae sie bis auf die
Atomarität alle Bedingungen an eine Relation erfüllt.

Zu Relationen verweisen wir auf Abschn.2.2. Wir haben dort auch die nicht atomare
RelaciónVerkaeuferProductoeingeführt, siehe Tab.2.3y9.5. Esta redundancia libre de Re-
9.2 Bancos de datos orientados a objetos 323

lación ist in der NF2-Forma normal. El atributoNombre del productoenthält dort eine
Aufzählung von Produkten. en NF2-Relationen ist es möglich, dass ein einzelnes Attribut nicht
nur eine von Elementen enthält, vielmehr sind auch komplex Objekte vorstellbar, warum also
nicht sogar eine Relation. Natürlich darf dann diese interne Relation wieder Objekte enthalten
usw. Schon befinden wir uns in komplexen rekursiven Strukturen.
Schon wird deutlich, dass wir mit NF2-Relationen komplex Objekte aufbauen können. Wer
müssen allerdings auch die Anwendungssprache zu einer vollständigen Zugriffssprache
ausbauen, so dass beispielsweise auch Vererbung und Datenkapselung unterstützt werden.

Genau in this Richtung zielten SQL3 y SQL2003. Heer sind Klassen, Objekte, Methoden,
Kapselung und Vererbung integriert. Unterstützt wird auch das Überladen von
Funktionen und parametrisierte Typen (Plantillas). Mittels des neuen OperadoresUnión
recursivaTambién se producirá el problema de escucha. Las relaciones de objetos son
enormes. El Sprachumfang todo en SQL3 es el mismo que el de SQL2.
El nuevo BefehlCrear tipoTipos de datos definidos. Estas son las características de la
orientación de objetos. Programación basada en clases de clases: se pueden utilizar
variables, constantes y funciones de miembros que incluyan constructores y destructores.
Die Datenkapselung geschieht mit den BezeichnernPúblico,Privadoy Protegido.

Um Funktionen internalhalb aines SQL-Befehls definieren zu können, benötigen wir


Kontrollstrukturen. Siga encontrando con SQL3 también If-, While- y For-Anweisungen.
Funciones adicionales a Create-Type-Befehls Dürfen the SQL-eigenen Sprachkonstrukte
oder eine Wirtssprache, etwa C++, verwenden. Die Funktionen Dürfen überladen and
auch rekursiv aufgerufen werden. elCrear-tipo-Befehl ermöglicht ferner eine
Klassenhierarchie, indem die hier definierten Datentypen von other Klassen abgeleitet
werden können. Mittels des erweitertenCrear mesa-Befehls können nun Relationen
erzeugt werden, die von einem Datentyp abgeleitet sind.
Noch vor der SQL-Normierung gab es mehrere Implementierungen zur Objekt-
Erweiterungen. Dies hat zur Folge, dass es bei den einzelnen Datenbankanbietern teils
erhebliche Abweichungen von der Norm gibt. Por lo tanto, implemente los propios juegos de
Oracle con su propio Sprache PL/SQL. Wegen der relativ großen Bedeutung von Oracle gehen
wer daher in den nächsten beiden Abschnitten ganz gezielt auf Oracle y dessen
objektrelationale Implementierung ein.

9.2.3 Erweiterungen de objetos en Oracle

Oracle führte mit der Version V8.0 objektrelationale Erweiterungen. Esto se incluye en la
versión V9.0, pero no se puede utilizar correctamente. Es sei no verschwiegen, dass
Oracle nicht alle neuen Ansätze der SQL-Norm aufgenommen hat. Insbesondere greift
Oracle auf seine bereits vorher integrierte Programmiersprache PL/SQL
324 9 Moderne Datenbankkonzepte

zurück. En estos umfangreiche Sprache wurden die neuen objektorientierten Erweiterungen


eingebettet.
En Oracle gibt es mehrere Möglichkeiten, bestehende oder neue Datenbanken mit
objektorientierten Strukturen zu versehen. Las acciones más efectivas son:

- Campo variable
- Objetos
- Sichten de objetos
- Eingebettete Relationen (inglés: tablas anidadas)

Campo variable en Oracle entsprechen einer Liste. Allerdings muss in Oracle die maximale
Anzahl der Listenelemente vorgegeben werden. Esta es la forma einfachste der Erweiterung
eines relacionaalen Attributs. Ein Attribut, das als variables Feld definiert wird, kann also eine
nach oben begrenzte Anzahl von Werten aufnehmen.
Objetos entsprechen den objektorientierten Ansätzen von Programmiersprachen. Objekte
können Eigenschaften (Variablen) und Methoden (Funktionen und Prozeduren) enthalten.
Objektelemente dürfen gekapselt, also für außenstehende Betrachter versteckt werden.
Attribute einer Relation dürfen als Objekte definiert werden.
Sichten de objetos Sind wichtig, um einen einen einfachen Übergang von relacionalen in
objektorientierte Strukturen zu ermöglichen. Damit lassen sich bestehende Relationen ganz
einfach in objektrelationale überführen. Wie der Name aber verrät, handelt es sich nur um eine
Sicht. Die Relation bleibt unverändert.
Si el atributo es una relación, puede definirla con un objeto. In diesem Fall
sprechen wir vonRelaciones eingebetteten . Un atributo y una relación también
pueden incluir un tipo de fecha relacional, un campo variable, un objeto
complejo o una relación completa.
Wir wollen im Folgenden diese vier Möglichkeiten an einfachen Beispielen vorstellen.
Comenzamos con el Create-Type-Befehl, pero aquí hay más variantes:

CREAR TIPO Nombre tipográfico AS


FVARRAY | MATRIZ VARIABLEgramo (Anzahl ) OF Datentyp CREAR [ O
REEMPLAZAR ] TIPO Typname COMO OBJETO ( Spalte Datentyp [ , ... ] ,

[FMIEMBROFnombre del usuario | Nombre de la funcióng g


[ , ... ] ] )
CREAR [O REEMPLAZAR] TIPO CUERPO Nombre tipográfico AS

FMIEMBROFPROCEDIMIENTO Prozedurname | FUNCIÓN Nombre de funcióngramo


( Nombre del parámetro Tipo de fecha [ , ... ] ) [ RETORNO Tipo de fecha ] AS
Bloque PL/SQL gramo [ , ... ]
FIN ;
CREAR TIPO Typname COMO TABLA DE Datentyp

Mit dem primero Create-Type-Befehl werden variable Felder definido. Wir beachten, dass
wir hier die maximale Anzahl der Listenelemente angeben müssen.
9.2 Bancos de datos orientados a objetos 325

El segundo Befehl es un nuevo objeto. Eventualmente habrá existencias a través de la


opciónO reemplazarersetzt. Ein Objekt enthält Attribute und wahlfrei zusätzlich
Methoden. Wir geben also, durch Kommata getrennt, die einzelnen Attribute mit ihren
Datentypen an. Als Datentyp sind alle Standarddatentypen, aber auch bereits definierte
Objekte erlaubt. Anschließend können as Methoden Memberfunktionen y -prozeduren
angegeben werden. Aquí no se incluyen las funciones y los procesos. La implementación
se realiza automáticamente en Create-Type-Body-Befehl. Aquí hay dos procedimientos y
funciones diferentes: funciones que son una función de función izquierda (Tipo de fecha
de devolución), Prozeduren nicht. El código de programa es muy pequeño en el bloque
PL/SQL.
Der letzte dieser Befehle ist sehr einfach, führt aber letztlich zu komplexen Strukturen, zu
eingebetteten Relationen. Wir wollen nun nacheinander diese Create-Type-Befehle mit Hilfe
einfacher Beispiele genauer kennen lernen.
Comenzamos con variables Feldern und erinnern uns an die nicht atomare Relation
VerkaeuferProductotambién Tab.2.3. Wir haben sie zusätzlich in Tab.9.5angegeben. Aquí
incluye el atributoNombre del productoeine Aufzählung der verkauften Produkte des
jeweiligen Verkäufers. Gehen wir davon aus, dass unsere Firma maximal 50 Produkte vertreibt,
so könnte die Definición de atributosNombre del productocomo sigue:

CREAR TIPO TProdukt COMO VARRAY (50) DE CHAR (30);

Wir erzeugen damit einen DatentypTProducto, der aus einem Field von maximal 50
Elementen vom DatentypCarbón(30)mejor. Este tipo de datos se puede utilizar en una relación
unsererVerkaeuferProductoverwenden:

CREAR MESA VerkaeuferProducto


( VerkNr CARACTERÍSTICA(4) PRIMARIO LLAVE ,
VerkNombre CARACTERÍSTICA(20) NO NULO ,
Por favor CARACTERÍSTICA(5) ,
dirección CARACTERÍSTICA(60) ,
Producto TProducto ,
umsatz NUMÉRICO (10, 2) );

Das Arbeiten mit dieser nicht atomaren Relation ist natürlich aufwendiger als mit
normalisierten Relationen. Schließlich müssen wir berücksichtigen, dass es nun Objekte gibt.

Pestaña. 9.5Nicht atomare Relation VerkaeuferProdukt

VerkNr VerkNombre Por favor VerkAdresse Nombre del producto umsatz


lavadora,
V1 Meier 80331 Múnich 17000
Rebaño, Kühlschrank
V2 Schneider 70173 Stuttgart Rebaño, Kühlschrank 7000
V3 Müller 50667 Colonia Staubsauger 1000
326 9 Moderne Datenbankkonzepte

Das Hinzufügen der ersten Zeile aus Tab.9.5geschieht beispielsweise mit folgendemInsertar
-Befehl:

INSERTAR EN LOS VALORES DE VerkaeuferProdukt (


'V1', 'Meier', '80331', 'Múnchen',
TProdukt ('Waschmaschine', 'Herd', 'Kühlschrank'), 17000);

Mit dem Insert-Befehl werden sechs Attribute eingefügt. Davon es un campo variable
funcional. Y esto también debe realizarse con un Cast-Operator bajo el control de los tipos de
datos. Dabei haben wir alle verkauften Produkte aufgelistet. Mit dos weiteren Insert-Befehlen
können wir die RelationVerkaeuferProductogemäß Tab.9.5lleno. Estas fechas también están
registradas, pero podemos hacerlo correctamente siguiendo las indicaciones de Select-Befehl:

SELECCIONE * DE VerkaeuferProdukt;

Es werden genau drei Zeilen ausgegeben, wobei das fünfte Attribut jeder Zeile eine
Aufzählung enthält. Kompliziert wird es, wenn wir nur auf Teile der Liste zugreifen wollen.
Sombrero beispielsweise VerkäuferSchneiderAuch Staubsauger verkauft, so möchten wir
dieses Produkt zusätzlich hinzufügen. Oder wir wollen einzelne Produkte aus der Liste löschen.
Oder wir stellen die Frage, welche Verkäufer Kühlschränke verkauft haben. Todos estos
Aufgaben han sido gemeinsam, dass wir sie nicht mit einem einzigen SQL-Befehl lösen können.
Wir können die Feldelemente auch nicht indizieren. Wir benötigen vielmehr die Sprache PL/SQL
y müssen die einzelnen Aufgaben programmieren. So weit wollen wir an dieser Stelle nicht
einsteigen, sondern uns stattdessen etwas ausführlicher direkt mit Objekten beschäftigen.

Objekte in Oracle erlauben es uns komplex Strukturen aufzubauen. Zusätzlich erhalten


wir damit neue Datentypen, die wir gezielt verwenden können. Dies verbessert die
Gesamtstruktur eines Systems merklich. Wir betrachten dazu unsere Beispieldatenbank
Bicicleta. En las tres relacionesKunde,LieferanteyPersonalgibt es jeweils die Atributo calle,
Por favoryOrt. Es macht natürlich Sinn, in allen drei Relationen die gleichen Datentypen zu
benutzen. Dies ist in unserem Fall leider nicht der Fall. Der Ort ist in dos Fällen als
Carbón(20)y en un otoño tambiénCarbón(25)definido. Um solche Unzulänglichkeiten
auszuschließen, definieren wir ein ObjektTAdresse:

CREAR O REEMPLAZAR TIPO TAdresse COMO OBJETO (


calle VARCHAR2 (30),
Por favor VARCHAR2 (5),
Ort VARCHAR2 (20),
FUNCIÓN MIEMBRO Anschrift RETURN VARCHAR2 );
/

Hemos tenido estos tres atributos en un objeto objeto. Wir haben ferner den Datentyp
Varchar2en seguidaCarbonizarsegewählt, da wir uns bereits vom SQL-Standard entfernt ha-
9.2 Bancos de datos orientados a objetos 327

ben y Oracle den DatentypVarchar2empfiehlt. Otra funciónAnschrift declarada, diese


adresse ausgibt. Die Create-Type-Befehle sollten immer mit einem Schrägstrich in
einer neuen Zeile abgeschlossen werden. Nur so ist in Oracle sichergestellt, dass
folgende Befehle korrekt ausgeführt werden.
Jetzt können wir unsere drei RelationenKunde,PersonalyLieferanteDefiniciones
einheitlich. Als Beispiel geben wir die RelationLieferantNeuun:

CREAR MESA LieferantNeu


( nº ENTERO CLAVE PRIMARIA ,
Nombre VARCHAR ( 30 ) NO NULO ,
dirección TAdresse,
Sperre CARBONIZARSE );

Der Zugriff auf Relationen, die Objekte enthalten, ist einfach und entspricht dem auch in
Programmiersprachen gewohnten Muster: Die Objektelemente werden zusammen mit dem
Objektnamen, getrennt durch einen Punkt, angegeben. Wollen wir beispielsweise den Namen
und den Wohnort aller Lieferanten ausgeben, so lautet jetzt derSeleccionar-Befehl:

SELECCIONAR Nombre, L.Adresse.Ort


DE LieferantNeu L;

Es ist zu beachten, dass en Oracle das Objektdirecciónzwingend qualifiziert werden muss,


und zwar mit einem Aliasnamen, hierl! Wir sehen, dass die Relation noch leer ist. Wir sollten
also zunächst die Daten aus der RelationLieferantecargado. Dies geschieht wie folgt:

INSERTAR EN LieferantNeu
SELECCIONAR Nr, Nombre, TAdresse( Strasse, PLZ, Substr(Ort, 1, 20) ), Sperre

DE Lieferante;

La nueva relaciónLieferantNeubesitzt nur vier Atributo. Die entsprechende Anzahl


müssen wir daher auch im Select-Befehl angeben. Wir fassen dabei die drei bisherigen
Atributocalle,Por favoryOrtMittels des Cast-Operators zum ObjektTAdressezusammen.
Wir müssen noch beachten, dass in der RelationLieferanteel atributoOrtaus 25 Zeichen
besteht. Wir kürzen daher este atributo noch mit Hilfe der Funktionsubstrato.
Existe en un banco de datos con una relaciónLieferante, so empfehlen wir das
Überführen in die neue RelationLieferantNeunicht. Auch mit Hilfe einer Objekt-Sicht
können wir die neuen objektrelationalen Möglichkeiten verwenden. Wir erhalten
beispielsweise eine entsprechende sichtSLieferanteMit:
328 9 Moderne Datenbankkonzepte

CREAR VISTA SLieferant (Nr, Nombre, Dirección, Sperre) COMO


SELECCIONAR Nr, Nombre, TAdresse ( Strasse, PLZ, Ort ), Sperre Lieferant ;
DE

Auf diese Art und Weise können wir neu definierte Objekte auch auf bestehende Relationen
anwenden. Relación analógicaLieferantNeukönnen wir jetzt auch hier Name und Wohnort
einfach ausgeben:

SELECCIONAR Nombre, L.Adresse.Ort


DE SLieferante L;

Leider haben diese Erweiterungen auch ihre Achillesferse. Eine Ausgabe der
RelationLieferantNeucon Hilfe von „Seleccionar *“ ist unbefriedigend, siehe Abb.9.4.
Statt der tatsächlichen Adresse wird nur jeweils der Datentyp angezeigt. Al hacer clic
en el tipo de fecha se verá el interior. Esto está en der Praxis verschmerzbar, da
grundsätzlich in der Programmierung empfohlen wird, auf den Wildcard-Operator
„*“ zu verzichten. La alternativa es un uso estándar:

SELECCIONAR Nr, Nombre, L.Adresse.Strasse, L.Adresse.PLZ,


L.Adresse.Ort, Sperre
DE LieferantNeu L ;

Deutlich eleganter wird es, wenn wir uns an unsere MemberfunktionAnschrift


erinnern. Deberemos implementar todas estas funciones primero. Wir stellen den
Code vor:

CREAR O REEMPLAZAR TIPO CUERPO TAdresse COMO


FUNCIÓN MIEMBRO Anschrift RETURN VARCHAR2 IS
ausgabe VARCHAR2(60);

Tejido. 9.4Ausgabe von Objekten


9.2 Bancos de datos orientados a objetos 329

Tejido. 9.5Ausgabe von Objetos y Funciones

COMENZAR

ausgabe := TRIM(Calle) || ’, ’ || RECORTAR(PLZ) || ' '


|| RECORTAR(Ort);
VOLVER ausgabe;
FIN;
FIN;
/

In this Implementierung wiederholen wir zunächst den Funktionskopf aus der


Deklaration im Create-Type-Befehl. Anschließend definieren wir die Variableausgabe.
Im eigentlichen Rumpf, der zwischen den BezeichnernComenzaryFinEingebettet ist,
trimmen wir die Attributecalle,Por favoryOrt, verschmelzen diese mittels des
Konkatenierungs-Operators „||“ und weisen diese der Variablenausgabezu. Esta
variable se activará según las funciones. Mit Hilfe esta función puede ser escrita:

SELECCIONAR Nr, Nombre, L.Adresse.Anschrift(), Sperre


DE LieferantNeu L ;

Wir erhalten damit die Anschrift in übersichtlicher Form in einer einzigen Spalte, siehe
Abb.9.5. Zur Vertiefung sei auf Kähler (2008) verwiesen. Wie sich Objekte zu ganzen
Relationen erweitern lassen, zeigen wir im nächsten Abschnitt.

9.2.4 Relaciones adicionales en Oracle

Wir haben im letzten Abschnitt kennen gelernt, dass einzelne Attribute aus einer Aufzählung
von Elementen bestehen können. Un elemento wiederum darf un objeto beliebiges
330 9 Moderne Datenbankkonzepte

sein. Somit können wir in einem einzigen Attribut eine Liste von Objekten definieren.
Allerdings müssen wir hier die maximale Anzahl der Listenelemente vorgeben. Esta
Einschränkung gilt nicht, wenn wir stattdessenRelaciones eingebettete(auf Englisch:
tablas anidadas) verwenden. Las relaciones individuales pueden ser una variación de las
condiciones variables. Schließlich besteht eine Relation aus Attributen, ist also eigentlich
als ein Feld von Objekten definiert. In Relationen ist die Anzahl der Objekte nur durch
datenbankinterne Strukturen und dem Speicherplatz beschränkt. En objektrelationalen
Datenbanken dürfen daher einzelne Attribute Relationen enthalten. Dies wollen wir an
einem Beispiel aufzeigen.
En el BeispieldatenbankBicicletawerden alle Aufträge in der RelationAuftragund die
Einzelpositionen in der RelationAuftragspostenverwaltet. Wir können jetzt die Einzelpositionen,
die im eigentlichen Sinne zur EntitätAuftragGehören, también en el interior de la relación.
Auftragmittels einer eingebetteten Relation abspeichern. Definieren wir dazu zunächst ein
entsprechendes Objekt:

CREAR O REEMPLAZAR EL TIPO TEinzelposten COMO OBJETO (


Artnr ENTERO,
Anzahl ENTERO,
Precio de venta NUMÉRICO(10,2) );

Para este objeto en una relación einbetten zu können, müssen wir es entsprechend
kennzeichnen:

CREAR TIPO ER_Einzelposten COMO TABLA DE TEinzelposten;

El tipo de fechaER_Einzelpostenist jetzt die Basis für eine eingebettete Relation.


Definiremos una nueva relaciónAuftragNeu:

CREAR MESA AuftragNeu


( AuftrNr ENTERO PRIMARIO LLAVE,
Dato FECHA,
Einzelposten ER_Einzelposten,
Kundnr ENTERO REFERENCIAS Kunde,
persona ENTERO REFERENCIAS Personal EN BORRAR ESTABLECER NULO
) ANIDADO MESA Einzelposten ALMACENAR COMO ER_Einzelposten_TABLE;

Mit der letzten Zeile der Definición wird der Datenbank mitgeteilt, wo diese eingebettete
Relation (mesa anidada) angelegt werden soll.
Der Zugriff auf this neue Relation ist dem von variablen Feldern sehr ähnlich. Wollen
wir etwa Auftrag 2 aus der Originalrelation in der neuen Relation abspeichern, so müssen
wir im Insert-Befehl fünf Attribute angeben. El atributoEinzelpostenist aber eine Relation,
die wiederum dos Positionen enthält. Wir müssen daher wieder Cast-Operatoren
einsetzen und schreiben:
9.2 Bancos de datos orientados a objetos 331

INSERTAR EN VALORES AuftragNeu (


2, FECHA '2013-01-06',
ER_Einzelposten (TEinzelposten (100002, 3, 1950),
TEinzelposten (200001, 1, 400) ),
3, 5);

Jedes einzufügende Element es un objeto por tipoTEinzelposten. Mittels eines Cast-


Operators wandeln wir die drei Einzeldaten in diesen Objekttyp um. La relación
eingebetteteER_Einzelpostenenthält in unserem Beispiel zwei dieser Objekte. Mit einem
weiteren Cast-Operator erstellen wir una relación de tipoER_Einzelposten, diese este
beiden Objekte enthält. Ganz wichtig ist, dass es hier keine Einschränkung bei der Anzahl
der Tupel gibt.
Somit unterscheidet sich auch die Speichertechnik zwischen eingebetteten Relationen und
variablen Feldern. Variable de escritura de Oracle Felder normalerweise in der Relation selbst,
wobei Speicher für die maximale Anzahl von Elementen reserviert wird. Eingebettete
Relationen werden junctiongen as eigene Relationen verwaltet. Die letzte Zeile der Definición
de relaciónAuftragNeugibt beispielsweise an, dass die eingebettete Relation unter dem Namen
ER_Einzelposten_TABLEabgelegt wird. Auch wenn Oracle die eingebettete Relation as
eigenständige Relation verwaltet, so ist ein direkter Zugriff auf this Relation nicht möglich.
Originalrelation und eingebettete Relation werden intern mittels Zeigern verbunden, der
Zugriff erfolgt ausschließlich über die RelationAuftragNeu.
Y damit wären wir auch schon beim Vorteil dieser new Möglichkeiten. No hemos definido
dos relaciones definidas, las mitades de los mensajes de correo electrónico no coinciden en
nada, pero son sólo una, las conexiones internas están incluidas. Mit vier weiterenInsertar-
Befehlen können wir daher den Inhalt der beiden RelationenAuftragyAuftragsposten también
Tab.10.5y10.6en una relación einer einzigenAuftragNeuvereinigen. Wir saven somit Verbund
Operationen (Uniones) y sind letztlich erheblich performanter. Gleichzeitig bleibt die
Originalstruktur erhalten. Ein Auftrag enthält schließlich alle Auftragsdaten und muss nicht
künstlich in dos teile (AuftragyAuftragsposten) zerlegt werden.
Die Nachteile sind leider auch nicht zu vernachlässigen. Erstens konnten wir die
Artikelnummern nicht as Fremdschlüssel auf die RelationArtículoDefinieren. Fremdschlüssel
insidehalb von Objekten sind grundsätzlich nicht möglich. Alternativamente, podemos usar
nuestras referencias con Hilfe der Ref-Bedingung setzen, pero aquí no hay ninguna
información actualizada sobre la documentación de Oracle. Und dos veces befriedigt die
Anzeige der Daten nicht. Der folgende Select-Befehl zeigt zwar alle Daten an, aber in einer
schwer lesbaren Weise:

SELECCIONAR * DESDE AuftragNeu ;


332 9 Moderne Datenbankkonzepte

Auch die Ausgabe aller Einzelpositionen zu Auftrag 2 liefert eine gewöhnungsbedürftige


Darstellung. Der folgende Befehl liefert eine eingebettete Relation als Ergebnis zurück.

SELECCIONAR Einzelposten
DE AuftragNeu
DÓNDE AuftrNr = 2 ;

Esta relación específica se incluye en la pestaña SQL-Plus.9.6ausgegeben. Es wird die


komplette Struktur der eingebetteten Relation, also eine Relation bestehend aus Objekten,
angezeigt.
En SQL Developer, usamos la primera vez que ingresamos, cuando se seleccionan los
objetos. Dies ist unbefriedigend, lässt sich aber mit Hilfe des OperadoresElauf einfache
Weise lösen. Operador de diéselElwandelt eine eingebettete Relación en una relación
“normal” um. Dies wollen wir ausnutzen und schreiben den folgendenSeleccionar- Befehl:

SELECCIONAR *
DE EL ( SELECCIONAR Einzelposten
DE AuftragNeu
DÓNDE NrAuftr = 2 ) ;

Heer wird der Select-Befehl mit Hilfe des The-Operators in eine Relation überführt und dann
ausgegeben. Das Ergebnis ist jetzt eine ganz normale Relation, siehe Tab.9.7.
Mit Hilfe dieses The-Operators greifen wir wie gewohnt auf Objektrelationen zu.
Wurden beispielsweise in Auftrag 2 noch zusätzlich 2 Tretlager à 30 Euro verkauft, so
lautet der dazugehörige Befehl zum Einfügen:

INSERTAR EN (SELECCIONE Einzelposten DE AuftragNeu


DONDE AuftrNr = 2 )
VALORES (500013, 2, 60);

Wollen wir zu Auftrag 2 nur alle Positionen anzeigen, die mehr als 100 Euro kosten, so
schreiben wir:

Pestaña. 9.6Direkte Ausgabe einer eingebetteten Relación

Einzelposten(Artnr, Anzahl, Gesamtpreis)


ET_Einzelposten(TEinzelposten(100002, 3, 1950),
TEinzelposten(200001, 1, 400))

Pestaña. 9.7Ausgabe einer eingebetteten Relation como Relation

Artnr Anzahl Precio de venta


100002 3 1950
200001 1 400
9.2 Bancos de datos orientados a objetos 333

SELECCIONAR *
DE EL ( SELECCIONAR Einzelposten
DE AuftragNeu
DÓNDE AuftrNr = 2 )
DÓNDE Premios Gesamtpreis > 100;

Dank des The-Operators stehen die AttributeArtnr,AnzahlyPrecio de ventazur Verfügung.


Wir müssen allerdings immer beachten, dass der The-Operator nur jeweils genau eine einzige
eingebettete Relation umwandeln kann. Wir können uns daher immer auf nur eine Zeile im
AttributEinzelpostenbeziehen!
Cuando todas las posiciones de los accesorios están hechas de lana, el máximo de 100
euros es máximo, por lo que debemos usar otros lugares. Wir führen dazu obigen SQL-Befehl
für jeden Auftrag aus und verknüpfen das Ergebnis dann mit der Auftragsnummer. Wir geben
also die Auftragsnummern zusammen mit einer eingebetteten Relation aus. Da wir allerdings
zuvor unsere eingebettete Relation in eine normale umgewandelt haben, benötigen wir jetzt
einen Cast-Operator, der aus aus einer Relation eine Einbettung erzeugt. Bisher wirkte ein Cast-
Operator nur auf einzelne Ausdrücke und nicht auf mehrere Zeilen. Para que las relaciones de
objetos sean beneficiosas, tendremos un Cast-Operator especializado. Er lautet:

CAST ( MULTISET ( Unterabfrage ) AS Objekttyp )

Este Cast-Operator busca un abfrage beliebige en una relación eingebettete vom


angegebenen Objekttyp um. Die Abfrage muss dabei zum Objekttyp kompatibel sein. Wir
kommen zu unserer ursprünglichen Aufgabenstellung zurück und geben alle Aufträge mit allen
Positionen mit más als 100 Euro Gesamtpreis aus.

SELECCIONE A.AuftrNr,
FUNDICIÓN (MULTISET ( SELECCIONAR *
DESDE EL ( SELECCIONAR Einzelposten
DE AuftragNeu
DÓNDE AuftrNr = A.AuftrNr)
DÓNDE Gesamtpreis > 100
) COMO ER_Einzelposten )
DE AuftragNeu A;

Im Inneren finden wir hier den vorher besprochenenSeleccionar-Befehl mit dem The-
Operator. No ha habido ningún cambio en 2 gracias al atributoA.AuftrNrersetzt. Este Select-
Befehl eliminará la mitad de los Cast-Multiset-Operadores en una relación eingebettete
umgewandelt, nachdem alle Auftragspositionen mit weniger als 100 Euro Umsatz entfernt
wurden. Esta relación eingebettete wird schließlich zusammen mit der Auftragsnummer
ausgegeben. Letztlich erhalten wir die RelaciónAuftragNeu, jedoch ohne das Datum, Kunden-
und Personalnummer und ohne die Positionen bajo 100 Euro Umsatz.
334 9 Moderne Datenbankkonzepte

Zur Vertiefung wollen wir noch ein weiteres Beispiel vorstellen. Relación de matriz
AuftragNeuist nach dem Erzeugen zunächst leer. Es bietet sich an, diese Relation mit allen
Daten aus den RelationenAuftragyAuftragspostenzu lleno. Dies können wir in two
Schritten erledigen. Zunächst laden wir alle Auftragsdaten in die RelationAuftragNeu.
Anschließend fügen wir mit einem Update-Befehl alle Auftragspositionen hindzu:

INSERTAR EN AuftragNeu (Auftrnr, Datum, Einzelposten,


Kundnr, Persnr)
SELECCIONAR AuftrNr, Datum, NULL, Kundnr, Persnr Auftrag;
DE

ACTUALIZACIÓN Auftragneu

SET Einzelposten = CAST ( MULTISET(


SELECCIONAR Teilenr, Anzahl, Gesamtpreis
DESDE Auftragsposten
DÓNDE AuftrNr = Auftragneu.AuftrNr )
AS ER_Einzelposten);

Heer wir zu jeder Auftragsnummer die Auftragspositionen ermittelt und das


Abfrageergebnis mit Hilfe des Cast-Multiset-Operators in eine eingebettete Relation
verwandelt. Als Übungsaufgabe sei empfohlen, diese Übernahme aller Einträge aus den
RelationenAuftragyAuftragspostenmit einem einzigen Insert-Befehl durchzuführen.
Estos temas zeigen anschaulich, dass sich mit den objektrelationalen Datenbanken die
Syntax deutlich erweitert. Dies geht einher mit erheblich komplexeren DML-Befehlen. Dabei
haben wir bisher nur an der Oberfläche gekratzt. Neben Memberfunktionen gibt es auch
statische Funktionen, ebenso Konstruktoren. Hinzu kommen Member- und statische
Prozeduren. Die Vererbung nimmt ebenfalls einen breiten Raum ein. Der Einstieg in
objektrelationale Strukturen ist insgesamt sehr spannend, aber auch steinig. Als Einstieg sei
Kähler (2008) empfohlen.

9.3 Fassammenfassung

Este Kapitel está equipado con dos piezas, un banco de datos vertical y un banco de datos
orientado a objetos. Wir haben gesehen, dass eine verteilte Datenhaltung den realen
Gegebenheiten wesentlich besser entspricht as eine zentrale Verwaltung. Auch die
Ausfallsicherheit kann durch die Verteilung erhöht werden. Allerdings ist der Aufwand zur
Verwaltung einer verteilten Datenbank enorme alto. Die von Date aufgestellten zwölf
Regeln sind eine erste gute Richtschnur, wie Verteilung aussehen sollte. Als
fundamentales Prinzip verteilter Datenbanken gilt dabei, dass der einzelne Benutzer nicht
bemerkt, ob eine zentrale oder verteilte Datenverwaltung vorliegt. Esto no es necesario
para el uso final, sino también para el programador.
In der Praxis sind wir noch mehr oder weniger weit von diesem Ideal entfernt. Das
Internet und damit die Cloud hanen in den letzten Jahren der Verteilung von Daten einen
9.4 Übungsaufgaben 335

großen Anschub gegeben. Dabei spielt das CAP-Theorem eine wichtige Rolle zur Beurteilung
der Art der Verteilung. Es ist eine Vereinfachung und gleichzeitig einer Präzisierung der Regeln
von Codd auf das Wesentliche. Letztlich muss sich der Anwender entscheiden, ob Konsistenz,
Verfügbarkeit oder Ausfalltoleranz für ihn besonders wichtig sind. Er muss sich für dos wei
dieser drei Möglichkeiten entscheiden.
Ist der Anwender bereit auf ein Maximum an Konsistenz zu verzichten, sollte er das
KonsistenzmodellBASEbeachten, das ihm zwar nicht sofort, aber letztendlich doch
Konsistenz garantiert. Ein kleiner Überblick über heutige verteilte Datenbanksysteme und
über den seit vielen Jahren eingesetzten Zwei-Phasen-Commit beendet diesen ersten Teil.
Zur Jahrtausendwende wurde objektorientierten Datenbanken eine große Zukunft
vorausgesagt. In der Praxis haben sie sich jedoch gegenüber Relationsalen Datenbanken nicht
durchsetzen können. Nur in wenigen Bereichen spielen sie heute eine Rolle, insbesondere in
technischen und Multimedia-Anwendungen. Nach einem kurzen Überblick über
objektorientierte Konzepte betrachteten wir objektrelationale Datenbanken am Beispiel von
Oracle. Objektrelationale Datenbanken sind von den relacionaalen abgeleitet, indem die
Atomarität aufgegeben wird. Hablaremos aquí de NF2-Formas normales.
Wir haben am Beispiel der Bike-Datenbank einige Möglichkeiten aufgezeigt. Wir haben
Objekte und variable Felder definido und in entsprechende Relationen eingearbeitet. Zuletzt
haben wir uns mit eingebetteten Relationen beschäftigt und darauf zugegriffen. Die
Komplexität dieser Zugriffsbefehle kam dabei deutlich zum Vorschein.

9.4 Übungsaufgaben

Fragen
1. ¿Wird unter Unabhängigkeit gegenüber Fragmentierung und gegenüber Replikation
verstanden?
2. Definieren Sie den BegriffVerteilte Datenbanken!
3. Wir haben globale Deadlocks in verteilten Datenbanken kennengelernt. ¿Können in
verteilten Datenbanken auch lokale Deadlocks auftreten?
4. ¿Ist unter Verwendung eines Zwei-Phasen-Commit-Protokolls die Regel 2 von Date
erfüllbar, obwohl für dieses Protokoll ein zentraler Koordinator benötigt wird?
5. Kennen Sie eine verteilte Datenbank aus der Praxis? Wenn ja, welche der zwölf
Regeln verletzt sie? Welche Nachteile werden deshalb in Kauf genommen? ¿Cómo
se utilizan estos teoremas de CAP en este banco de datos?
6. Cómo colgar el teorema CAP y el modelo de consistenciaBASE¿zusammen?
7. ¿Cuál es el problema de escucha recurrente de SQL3?
8. Cómo trabajar en SQL3 NF2-¿Relación definida?
9. Schreiben Sie un objetoPersona, das den Namen, die Adresse und das
Geburtsdatum einer Person enthält. Greifen Sie auf das ObjektTAdressezurück.
Schreiben Sie una relaciónPersonalNeu, el objetoPersonaverwendet.
336 9 Moderne Datenbankkonzepte

10. Schreiben Sie einen Select-Befehl, der aus der RelationAuftragNeualle Einzelpositionen
zu Auftrag 4 ausgibt, falls das AttributAnzahlmás grande que 1 ist.
11. ¿Quieres recibir un compromiso de dos fases?
12. ¿Fue macht einen Zwei-Phasen-Commit Ihrer Meinung nach tan extrem
zeitaufwendig?
13. Kopieren Sie mit einem einzigen Insert-Befehl alle Daten aus den Relationen
AuftragyAuftragspostenen la relaciónAuftragNeu.

Literatura

Bangel, D., & Weingärtner, K. (2011).Verificación de la realidad NoSQL. Espectro de


Java. Boeker, M. (2010).MongoDB – Sagja zu NoSQL. entwickler.press.
Cervecero, E. (2000).Hacia sistemas distribuidos robustos.http://www.cs.berkeley.edu/~brewer/
cs262b-2004/PODC-keynote.pdf. Grifos: 19.08.13.
Chang, F., Dean, J., Ghemawat, S., & Hsieh, WC y col. (2006).Bigtable: un almacenamiento distribuido
Sistema de datos estructuradosSimposio Proc USENIX sobre diseño e implementación de sistemas
operativos.
Connolly, T., & Begg, C. (2015).Sistemas de bases de datos(6. Aufl.). Pearson.
Fecha, CJ (1983).Una introducción a los sistemas de bases de datos(Bd. 2). Addison-Wesley.

Fecha, CJ (1990). ¿Qué es una base de datos distribuida? En C. J. Date, &Amp; A. Guardián (Ed.),Relacional
Escritos de bases de datos 1985-1989. Addison-Wesley.

Fecha, C. J., &Amp; Darwen, H. (1998).Fundación para bases de datos de objetos/relacionales. Addison-
Wesley. Deux, O. (1991). El sistema O2.Comunicación de la JCA,34(10), 34–48.
Edlich, S., Friedland, A., Hampe, J., Brauer, B., & Brückner, M. (2011).NoSQL – Integrado en el modelo
Welt nichtrelationaler WEB 2.0 Datenbanken. Hanser.
Elmasri, R., & Navathe, S. (2009).Grundlagen von Datenbanksystemen(3. Aufl.). Pearson.
Faeskorn-Woyke, H., Bertelsmeier, B., Riemer, P., & Bauer, E. (2007).Datenbanksysteme – Teoría
y Praxis con SQL2003, Oracle y MySQL. Pearson.
Gulutzan, P., & Pelzer, T. (2002).Ajuste del rendimiento de SQL. Addison-Wesley. Heuer,
A. (1997).Bancos de datos orientados a objetos(2. Aufl.). Addison-Wesley. Kemper, A., &
Eickler, A. (2015).Datenbanksysteme – Eine Einführung. Oldenburgo. Kähler, W.-M.
(2008).SQL con Oracle. Vieweg-Teubner. Khoshafian, S. (1993).Bases de datos orientadas
a objetos. John-Wiley. Loney, K. (2009).Oracle11g – La referencia universal. Hanser.

Marsch, J., & Fritze, J. (2002).Erfolgreiche Datenbankanwendung con SQL3. Saltador.


Meier, A. (2010).Bancos de datos relacionales y postrelacionales. Saltador. Meier, A., &
Kaufmann, M. (2016).SQL- & Bancos de datos NoSQL. Saltador. Redmond, E., & Wilson, JR
(2012).Sieben Wochen, sieben Datenbanken. O'Reilly. Schader, M. (1997).Bancos de datos
orientados a objetos. Saltador. SQL99 (1999).Lenguaje de base de datos SQL (SQL3). ISO
9075.
Literatura 337

SQL03 (2003).Lenguaje de base de datos SQL. ISO 9075.


SQL06 (2006).Lenguaje de base de datos SQL. ISO 9075.
SQL08 (2008).Lenguaje de base de datos SQL. ISO 9075.
SQL11 (2011).Lenguaje de base de datos SQL. ISO 9075.
Stonebraker, M., & Kemnitz, G. (1991). El sistema de gestión de bases de datos de próxima generación Postgres.
Comunicaciones de la ACM,34(10), 78–92.
Sunderraman, R. (2007).Programación Oracle10: introducción. Addison-Wesley. Türker, C.,
& Saake, G. (2005).Objektrelationale Datenbanken: Ein Lehrbuch. Dpunkt.
Anhang
10

El BeispieldatenbankBicicletawird in diesem Buch zu Übungszwecken durchgängig verwendet.


Diese Datenbank ist der Praxis entnommen: Der hier betrachtete Fahrradhändler kann seine
Aufgaben mit dieser Datenbank verwalten, auch wenn noch Wünsche ofen bleiben. Dafür ist
diese Datenbank mit nur zehn Relationen sehr übersichtlich und daher optima für den
Anfänger geeignet.
Es heißt, aprenderemos aus Fehlern, y así enthält die DatenbankBicicletaeinige
Designschwächen. Nicht jede Relation befindet sich in der 3. Normalform, auch inhaltlich ist die
DatenbankBicicletanicht immer immer optima aufgebaut. Im Buch wird gezielt auf this
Problemfälle aufmerksam gemacht. Davon unabhängig sei als Übung empfohlen, die noch
enthaltenen Designfehler zu identifizieren und zu beseitigen.
Este Anhang implica una gestión del banco de datosBicicleta. Las instrucciones de
instalación para este banco de datos son gratuitas para Oracle, MS SQL Server y
MySQL en Internet bajo la siguiente dirección de verificación:

http://bike.oth-regensburg.de

En esta página de Internet se encuentra disponible:

- Todo el programa PHP


- Alle Beispielprogramme zur Objektorientierung aus Kap.9
- Die Foliensätze zu allen Kapiteln im formato PDF
- Alle Lösungen zu den Übungsaufgaben aus Kap.1–9
- Hinweise zur Installation von Datenbanken und zur BeispieldatenbankBicicletamit weiteren
Hinweisen.
- Installationsskript zum Bierdepot aus Kap.1

Esta dirección de Internet también está en Zugriff en un banco de datos de Oracle, en el


banco de datosBicicletainstalado. Mit Hilfe von Select-Befehlen kann darauf jederzeit
zugegriffen werden.
340 10 Anhang

Ein Hinweis auf this Download-Bereich findet sich auch auf der Internetseite zu
this Buch beim Springer-Verlag:

http://www.springer.com/978-3-658-16128-6

El banco de datosBicicletaselbst besitzt dos wichtige Bereiche, die Verwaltung der


Artikel und das Auftragswesen. Darüber hinaus gibt es Lieferanten-, Kunden- und
Personal-Entitäten. Einen sehr guten Überblick gibt das Entity-Relationship-Diagramm der
Datenbank in Abb.10.1.
Betrachten wir zunächst die Verwaltung der Artikel: Wir erkennen eine EntitätArtículo. Este
enthält todos los artículos, comenzando por Einzelteilen bis zum komplett montierten Fahrrad.
Más encontramos una entidadcerveza dorada, aus der der momentane Lagerbestand
ersichtlich ist. Den Aufbau komplexer Artikel aus Einzelteilen erhalten wir schließlich mittels
einer Beziehungsentitätestructura de teile. Eine vereinfachte Lieferverwaltung ist mittels der
beiden RelationenLieferanteyLieferungGegeben.
Etwas komplexer ist das Auftragswesen aufgebaut: Zunächst liegt eine EntitätAuftragvor, in
der alle eingehenden Aufträge verwaltet werden. Sie besitzt Beziehungen zur Kunden- y
Personal-Entidad. Einzelheiten zu den einzelnen Aufträgen finden wir in der Entität
Auftragsposten. Heer sind alle Einzelpositionen zu den einzelnen Aufträgen aufgeführt. Este
sentimiento de beziehung es besitzt je eine Beziehung zu den EntitätenArtículoy Auftrag. Damit
können wir in dieser Entität speichern, welche Artikel zu welchem Auftrag gehören. Der
Händler baut gelegentlich Fahrräder individuell zusammen. Bei solchen

Lieferante cerveza dorada

1 C
lagert
mejor que nosotros
liefert metro
1 1 metro
metro 1
Lieferung Artículo estructura de teile

1 1 1 metro

metro

Reserva
metro

es wird verkauft
reserva metro

pelo 1 Auftragsposten
leer
metro

1 wird betreut metro

vergibto von C
Kunde Auftrag Personal
1 metro metro C

Tejido. 10.1El diagrama de entidad-relación del Bike-Datenbank


10 Anhang 341

Aufträgen reserviert er die entsprechenden Zwischenartikel und vermerkt dies in der


EntitätReserva.
Im Entity-Relationship-Diagramm erkennen wir eine schwache Entität und vier
Beziehungsentitäten. Jede Verbindungslinie entspricht genau einem Fremdschlüssel.
Verwendet wird diesem Buch vorgestellte Notation.
Ein besonderes Augenmerk sei auf die Beziehungsentitätestructura de teilegerichtet. Esta relación
de amistades es altalista de artículos , da sie angibt, wie Artikel aus einfacheren Komponenten
zusammengesetzt sind. Esta entidadestructura de teilebesitzt dos Fremdschlüssel auf die Relation
Artículo.
Das Entidad-Relación-Diagrama aus Abb.10.1enthält zehn Entitäten, davon vier
Beziehungsentitäten. Estas entidades sind die Basis unserer relacionalen Datenbank und
werden eins zu eins in Relationen umgesetzt. Die vier Beziehungsentitäten lösenmetrozu n
Beziehungen auf, die in relacionalen Datenbanken immer als eigenständige Relationen
realisiert werden. Jede der zehn Relationen besitzt einen Primärschlüssel. Jede der zwölf
Verbindungslinien repräsentiert einen Fremdschlüssel. Dieser Fremdschlüssel befindet sich
immer in der Relation, dem diemetroBeziehung zugeordnet ist. Bei der einzigen Czu 1
Beziehung zwischen den Relationencerveza doradayArtículoenthält die schwache Entität
cerveza doradaden Fremdschlüssel. El modelo de entidad-relación (ERM) también está dirigido
a las relaciones con un banco de datos relacional. Wir stellen im Folgenden diese Relationen
zusammen mit Beispieldaten vor. Null-Werte werden durch den EintragNULO gekennzeichnet.

- Lieferante : Diese Relation beinhaltet als Attribute (Eigenschaften) den Firmennamen, den
Wohnort, die Postleitzahl, die Straße und die Hausnummer. Zusätzlich marca el atributo
Sperreen la pestaña.10.1, ob ein Sperrvermerk für diesen Lieferanten vorliegt, etwa wegen
Zahlungsverzögerungen in der Vergangenheit. In der Praxis werden häufig noch weitere
Daten zu Statistik- oder Informationszwecken aufgenommen.

Pestaña. 10.1Relación Lieferant der Beispieldatenbank

nº Nombre calle Por favor Ort Sperre


1 Firma Gerti Schmidtn. Dr.Gesslerstr.59 93051 Ratisbona 0
2 Rauch GmbH Burgallee 23 90403 Núremberg 0
3 Shimano GmbH Rosenstraße 122 51143 Colonia 0
4 Suntour LTD Calle Melton 65 NULO Londres 0
5 MSM GmbH St-Rotteneckstr.13 93047 Ratisbona 0

- Kunde : Esta relación entspricht vom Aufbau der RelationLieferante. DasSperre-


Atributo en Tab.10.2kennzeichnet hier, ob etwa mangels Liquidität an den Kunden
noch etwas verkauft werden darf.
342 10 Anhang

Pestaña. 10.2 Relación Kunde der Beispieldatenbank

nº Nombre calle Por favor Ort Sperre


1 Tienda Fahrrad Obere Regenstr. 4 93059 Ratisbona 0
2 Centro Zweirad Stal. Calle Kirschweg 20 44267 Dortmund 0
3 Maier Ingrid Universitätsstr. 33 93055 Ratisbona 1
4 Rafa - Seger KG Liebigstr. 10 10247 Berlina 0
5 Motociclista Ecke Lessingstr. 37 22087 Hamburgo 0
6 Fahrräder Hammerl Schindlerplatz 7 81739 Múnich 0

- Personal : Esta relación es única como las relacionesLieferanteyKundeaufgebaut.


Zusätzlich sind noch das Geburtsdatum, der Familienstand, der Vorgesetzte, das
Gehalt, eine persönliche Beurteilung und die Aufgabe in der Firma (Arbeiter,
Vertreter, . . . ) aufgeführt.

In der Praxis werden meist noch weitere Daten aufgenommen, etwa das Einstelldatum, die
Vorbildung und verbale Beurteilungen. Aus Platzgründen wurde die RelationPersonal en dos
teiltabellen (Tab.10.3y10.4) aufgeteilt. El PrimärschlüsselpersonaEstas joyas están decoradas y
decoradas con atributos.Vorgesetztybeurteilungmit wurdenVorgbzw.beurt abgekürzt.

Pestaña. 10.3Relación Personal der Beispieldatenbank (Parte 1)

persona Nombre calle Por favor Ort


1 María Forster Ebertstr. 28 93051 Ratisbona
2 Anna Kraus Kramstraße 5 93047 Ratisbona
3 Rango Úrsula Dreieichstr. 12 60594 Francfort
4 Heinz Rolle En el 5 90455 Núremberg
5 Johanna Koster Wachtelstr. 7 90427 Núremberg
6 Marianne Lambert Calle Fraunhofer. 3 92224 Landshut
7 Thomas Noster Mahlerstraße 10 93047 Ratisbona
8 Renate Wolters Lessingstr. 9 86159 Augsburgo
9 Ernst Pach Olgastr. 99 70180 Stuttgart

Pestaña. 10.4Relación personal (Parte 2)

persona GebDatum Pararse Vorg. Gehalt Burt. Aufgabe


1 05.07.79 verh NULO 4800.00 2 Gerente
2 09.07.75 1
condujo 2300.00 3 Vertreter
3 04.09.67 verh 6 2700.00 1 facharbeiterin
4 12.10.57 1
condujo 3300.00 3 secreto
5 07.02.84 Gesch 1 2100.00 5 Vertreter
6 22.05.74 verh NULO 4100.00 1 maestro
7 17.09.72 verh 6 2500.00 5 Arbeiter
8 14.07.79 1
condujo 3300.00 4 Sachbearbeiter
9 29.03.92 6
condujo 800.00 NULO Azubi
10 Anhang 343

- Auftrag: Esta relación (siehe Tab.10.5) ist gegenüber den Anforderungen in der Praxis
erheblich vereinfacht. Zu jedem Auftrag mit PrimärschlüsselAuftrNrexistieren nur folgende
Daten: Datum, Kundennummer und Mitarbeiternummer (persona).

Pestaña. 10.5Relación Auftrag der Beispieldatenbank

AuftrNr Dato Kundnr persona


1 04.01.2013 1 2
2 06.01.2013 3 5
3 07.01.2013 4 2
4 18.01.2013 6 5
5 03.02.2013 1 2

- Auftragsposten : Esta relación de referencia (ver Tab.10.6) enthält alle wichtigen


Auftragsdaten. Sie nimmt in der Datenbank eine zentrale Rolle ein, da sie mit den
RelationenAuftragyArtículoen Beziehung steht. Mit der RelationArtículobestehen sogar
dos Beziehungen, zum einen direkt und zum anderen über die Beziehungsrelation
Reserva. Im ersten Fall wird der in Auftrag gegebene Artikel gemerkt, im zweiten Fall
die zu reservierenden Einzelteile.

Pestaña. 10.6Relación Auftragsposten der Beispieldatenbank

PosNr AuftrNr Artnr Anzahl Precio de venta


101 1 200002 2 800,00
201 2 100002 3 1.950,00
202 2 200001 1 400,00
301 3 100001 1 700,00
302 3 500002 2 100,00
401 4 100001 1 700,00
402 4 500001 4 30,00
403 4 500008 1 94,00
501 5 500010 1 40,00
502 5 500013 1 30,00

- Artículo : En esta relación (ver Tab.10.7) wird jedes Teil durch eine Bezeichnung, einen
Netto- und Bruttopreis inclusive Steuer und gegebenenfalls durch eine Maßangabe
(Abmessung), die Maßeinheit (z. B.CALLEpara piezas o paraCMfür Zentimeter) descrito.
El atributotipospezifiziert, ob ein Endprodukt (mi), ein zusammengesetztes Teil (z) o un
Fremdartikel (F) vorliegt. Fremdartikel sind Artikel, die immer von Lieferanten geliefert
werden.
344 10 Anhang

Pestaña. 10.7 Relación Artikel der Beispieldatenbank

ANr Bezeichnung netto Steuer Precio Color Masa Einheit tipo


100001 Herren-City-Rad 588.24 111,76 700.00 azul 26 pulgadas CALLE mi
100002 Damen-City-Rad 546.22 103,78 650.00 putrefacción 26 pulgadas CALLE mi
200001 He-Rahmen descuidado 336.13 63,87 400.00 azul NULO CALLE z
200002 Da-Rahmen lacio 336.13 63,87 400.00 NULO
putrefacción CALLE z
300001 He-Rahmen geschweißt 310.92 59.08 370.00 NULO NULO CALLE z
300002 Da-Rahmen geschweißt 310.92 59.08 370.00 NULO NULO CALLE z
400001 rad 58,82 11.18 70.00 NULO 26 pulgadas CALLE z
500001 Rohr 25CrMo4 9mm 6.30 1.20 7.50 NULO 9 milímetros CM F
500002 satélite 42.02 7,98 50.00 NULO NULO CALLE F
500003 Grupo Deore LX 5,88 1.12 7.00 NULO LX CALLE F
500004 Grupo Deore XT 5.04 0,96 6.00 NULO xt CALLE F
500005 Grupo XC-LTD 6.72 1.28 8.00 NULO XC-Ltd CALLE F
500006 Felgensatz 33,61 6.39 40.00 NULO 26 pulgadas CALLE F
500007 Alojamiento Schwalbe 16.81 3.19 20.00 NULO 26 pulgadas CALLE F
500008 Lenker + Vorbau 78,99 15.01 94.00 NULO NULO CALLE F
500009 Sattelstütze 4.62 0,88 5.50 NULO NULO CALLE F
500010 pedales 33,61 6.39 40.00 NULO NULO CALLE F
500011 Rohr 34CrMo4 2.1 3.36 0,64 4.00 NULO 2,1mm CM F
500012 Rohr 34CrMo3 2.4 3.61 0,69 4.00 NULO 2,4mm CM F
500013 Tretlager 25.21 4.79 30.00 NULO NULO CALLE F
500014 Gabelsatz 10.08 1,92 12.00 NULO NULO CALLE F
500015 Schlauch 6.72 1.28 8.00 NULO 26 pulgadas CALLE F

- estructura de teile : Esta relación enthält zu allen Artikeln (Artnr) aus der RelaciónArtículo,
die aus einfacheren Teilen zusammengesetzt sind, die entsprechenden Einzelteile (
Einzelteilnr). El atributoAnzahlgibt die Anzahl der benötigten Einzelteile an, und das Attribut
Einheitbezieht sich auf die Maßeinheit des Einzelteils. Besteht ein Artikel aus mehreren
verschiedenen einfachen Teilen, so werden entsprechend viele Tupel in dieser Relation
eingetragen. Esta relaciónestructura de teile(aquí Tab.10.8) entspricht einer einfachen
Stückliste, die in der Praxis häufig vorkommt.
10 Anhang 345

Pestaña. 10.8 Relación Teilestruktur der Beispieldatenbank

Artnr Einzelteilnr Anzahl Einheit


100001 200001 1 CALLE

100001 500002 1 CALLE

100001 500003 1 CALLE

100001 400001 1 CALLE

100001 500008 1 CALLE

100001 500009 1 CALLE

100001 500010 1 CALLE

100002 200002 1 CALLE

100002 500002 1 CALLE

100002 500004 1 CALLE

100002 400001 1 CALLE

100002 500008 1 CALLE

100002 500009 1 CALLE

100002 500010 1 CALLE

200001 300001 1 CALLE

200002 300002 1 CALLE

300001 500001 180 CM


300001 500011 161 CM
300001 500012 20 CM
300001 500013 1 CALLE

300001 500014 1 CALLE

300002 500001 360 CM


300002 500011 106 CM
300002 500012 20 CM
300002 500013 1 CALLE

300002 500014 1 CALLE

400001 500007 2 CALLE

400001 500006 1 CALLE

400001 500015 2 CALLE

- cerveza dorada : Esta relación (ver Tab.10.9) enthält neben dem Artikel den Lagerort und
den Bestand. Weiter wird ein Mindestbestand, die Anzahl der reservierten sowie der bereits
bestellten Teile gespeichert. Nicht jedes in der RelationArtículoangegebene Teil muss in
dieser Relation enthalten sein. Teile, die weder auf Lager, noch reserviert oder bestellt sind,
brauchen hier nicht aufgeführt zu werden.
346 10 Anhang

Pestaña. 10.9 Relación Lager der Beispieldatenbank

Artnr Lagerort Mejor y Mente mejor Reservar Mejor


100001 001002 3 0 2 0
100002 001001 6 0 3 0
200001 NULO 0 0 0 0
200002 004004 2 0 0 0
300001 NULO 0 0 0 0
300002 002001 7 0 2 0
400001 005001 1 0 0 0
500001 003005 8050 6000 184 0
500002 002002 19 20 2 10
500003 001003 15 10 0 0
500004 004001 18 10 0 0
500005 003002 2 0 0 0
500006 003004 21 20 0 0
500007 002003 62 40 0 0
500008 003003 39 20 1 0
500009 002007 23 20 0 0
500010 001006 27 20 1 0
500011 001007 3250 3000 161 0
500012 004002 720 600 20 0
500013 005002 20 20 2 0
500014 005003 27 20 1 0
500015 002004 55 40 0 0

- Reserva : Esta relación (ver Tab.10.10) gibt darüber Auskunft, welche Artikel für
welchen Auftragsposten reserviert wurden. Esta relación de relaciones besitzt je einen
Fremdschlüssel auf die RelationenArtículoyAuftragsposten, die zusammen den
Primärschlüssel bilden. Ein weiteres Attribut speichert die Anzahl der einzelnen
reservierten Artikel.

Pestaña. 10.10Relación Reserva del Beispieldatenbank

posnr Artnr Anzahl


101 300002 2
201 100002 3
202 500001 180
202 500011 161
202 500012 20
202 500013 1
202 500014 1
301 100001 1
302 500002 2
401 100001 1
402 500001 4
403 500008 1
501 500010 1
502 500013 1
10 Anhang 347

- Lieferung: Esta relación (siehe Tab.10.11) gibt an, welche Artikel von welchem
Lieferanten in welcher Lieferzeit geliefert werden. Zusätzlich werden der
Nettoeinkaufspreis und die laufenden Bestellungen vermerkt.

Pestaña. 10.11Relación Lieferung der Beispieldatenbank

ANr Liefnr Lieferzeit Nettopreis Mejor


500001 5 1 6.50 0
500002 2 4 71,30 10
500002 1 5 73.10 0
500003 3 6 5.60 0
500003 4 5 6.00 0
500003 2 4 5.70 0
500004 3 2 5.20 0
500004 4 3 5.40 0
500005 4 5 6.70 0
500006 1 1 31.00 0
500007 1 2 16.50 0
500008 1 4 83.00 0
500009 1 2 4.10 0
500009 2 1 4.60 0
500010 1 3 35.20 0
500011 5 1 3.10 0
500012 5 1 3.40 0
500013 1 4 21.00 0
500014 1 5 9.20 0
500015 1 1 6.20 0
Índice

A B
abfragio,dieciséis B*-Baum,249
Abfrageergebnis,30 Modelo BASE,314
Abhangigkeit relación de base,30
mejor,71 Antes de la imagen,276

transitivo,67,68 Método de inicio de transacción,198,201


Ablaufintegrität,34 Bereichs-Partitionierung,252 entre
ÁCIDO,18,272 operadores,112

Administrador,10 Beziehung
Después de la imagen,276
1 zu c,83,88
función agregada,109,120
c zu c,83,89
operador Ähnlichkeits,113
m a 1,83,88
m zu c,84,88
todo operador,115
m zu n,84,86
ALTERAR LA BASE DE DATOS,177,178
relación beziehungs,86,87
ALTERAR LA MESA,150
operador binärer,44
Schlüssel alternativo,32
objeto binario grande,226
Y-operador,111
Método BindColumn,233
Cualquier operador,115
método BindParam,218,230
Apache,186,188 Registro
GOTA,226
de archivo,280

Afirmación,157
C
atomar,17,25,28
Teorema CAP,312
atomaridad,18,272
CASCADA, en Fremdschlüsseln,41,91,92
atributo,4
función de reparto,146
Auditoría,9,169
Operador de Cast-Multiset,333
Ausfallsicherheit,9 Operador de reparto,326,333
Ausfalltoleranz,313 sistema CA,313
Plan de Ausführung personaje objeto grande,
mysql,247 226 Check-Bedingung,147,
Oráculo,244 148 Control,281,283 CLOB,
Servidor SQL,245 226
Äußerer Verbund,126 Grupo,177
Operadores externos,115 función de fusión,131
Confirmación automática en MySQL, COMPROMETERSE,18,136

267 autotintado,162 método de compromiso,201


350 Sachverzeichnis

concurrencia,7,271,286 determinante,sesenta y cinco

problema de concurrencia, diferencia,122


300 CONECTAR,177 Diferencias de relaciones,46
función de conversión,146 lectura sucia,300
función de copia,230 escritura sucia,300
sistema CP,314 DESCONECTAR,177
CREAR ASERCIÓN,157 DISTINTO,110
CREAR BASE DE DATOS,177,178 División de Relaciones,48 DML-Befehl,11,30,
CREAR DOMINIO,159 99 Dokumentenbasierte Datenbank,15,315
CREAR ÍNDICE,248 Dritte forma normal,sesenta y cinco,68
CREAR ESQUEMA,172,175 Afirmación de caída,158
CREAR SECUENCIA,162
CREAR MESA,144,159 CREAR TABLA SOLTAR BASE DE DATOS,177,179
TEMPORAL,151 CREAR TIPO,323, SOLTAR DOMINIO,159
324 CREAR TIPO DE CUERPO,325, ÍNDICE DE CAÍDA,248
328 CREAR VISTA,153 ESQUEMA DE GOTA,172
SECUENCIA DE CAÍDA,162
FECHA ACTUAL,146 MESA PLEGABLE,150
Cursor,207 VISTA CAÍDA,153

D mi
Función DataLength,231 Eigenschaften una relación,27
banco de datos,1 relación de eingebettete,324,325,330
Definición,3 operador enthalten,112
base documental,315 entidad,36
jerárquico,14 Entitäts-Integritätsregel,36 modelo
Valor clave,315 entidad-relación,77,79 Equi-unirse,
tarjetas de red,14 48
orientado a objetos,13,319 ERM,79
objetorelacional,13,29,322 Erste Integritätsregel,36
relacional,12,29 primera forma normal,59
spaltenorientiert,315 EXCEPTO,103,122
vertical,308 Excepción,201
Administrador del Datenbank,10 método de ejecución,218,230
Datenbank-caché,275 operador existente,118
Datenbank-Puffer,275 Existe-Operador,118,158,261
sistema Datenbankverwaltungs,3 Bloqueo exclusivo,292
replicación de fechas,310
Dauerhaftigkeit,18,272 F
DBCC FCFS,291
Servidor SQL,245 función Fclose,230
SGBD,3 manipulación fehler,201
DDL-Befehl,11,30,143 Punto campo,4
muerto,208,221,294,296 método de búsqueda,199,205 tipo

punto muerto,298 de formulario de archivo,228

Deadlockerkennung,297 CORRIENTE DE ARCHIVOS,226

eliminación de punto muerto,296 función de descarga,223


Predeterminado-Vorgabe,227 función fopen,230
Eliminar-Befehl,133,139 CLAVE EXTERNA,148
Sachverzeichnis 351

función Fpassthru,233 INTERSECARSE,103,


fragmentación,310 122 interventor,112
Fremdschlüssel,38, partición de intervalos,253
81 De-Klausel,104 Función Is_Dir,228
Fünfte forma normal,69,73,74 operador es nulo,114
Abhängigkeit funcional,59 Aislamiento,18,272
voll,61
j
GRAMO
Unirse,48,123,258
Gebiet,158,164 Función natural,48,124
GetLength,231 Graduado,27 exterior,126
theta-,126
CONCEDER,163 JSON,311
Banco de datos Graphen,15,315,316
grupo por klausel,119
k
cardinalidad,27
Producto Kartesisches,47,104
h
catálogo,172
unión hash,260
Datenbank de valor clave,15,
partición hash,253
315 clase,319
Tener-Klausel,120
Konkatenierung
función de encabezado,233
PL/SQL,329
Banco de datos jerárquico,11,14
consistencia,17,18,23,271,272,286,312,317
Pista,263
Control del banco de datos,9 Control de voz,11
Hinweis im Select-Befehl,263
punto caliente,282
Relación Kopf einer,26 producto
HTML,186,188
kreuz,47,104,105,258
Html caracteres especiales,216

l
I objeto grande,226
IIS,186,188 Binario,226
etiqueta de imagen,232
Personaje,226
Índice,247 función de longitud,231
partición de indexación,254 esquema Operador similar,113
de información,173,247 consistencia de partición de listas,253
tinta,7,272,287 Inkonsistenz der Daten, LOB,226
288,294 Inno DB,303 Cerrar con llave,290

copia de seguridad de registros,280

En operador,112,261 Insertar- Logdatei,274


Befehl,134,139 integridad,7, Algoritmo LRU,282
23,34,143,169
Ablauf-,34 METRO

entidades-,36 estudio de gestión,102


físico,34 Materialisierte Sicht,254
referencial,40,147 Mehrbenutzerbetrieb,2
semántico,34,169 mehrfachhaltung,6
registro de integridad,36 Mehrfachzugriff,7
Internet Mejor Abhängigkeit,71
transacción,137 función de miembro,328
servidor de información de Internet,186,188 Menge,113,115
352 Sachverzeichnis

Fusionar Unirse,260 binär,44


metadatos,275 Unirse,258
MULTICONJUNTO,333 unär,45
Mutación,dieciséis,25 mysql, Optimización
100,137,144,179 banco de base de pago,240
trabajo MySQL,102 regelbasiert,240
estrategia optimista,289
norte optimizador,240
unión natural,48,124 Verbund Oráculo,100,137,144
natural,48,124 Unión de bucle Orden por Klausel,129
anidado,260 mesa anidada,324,330 Operador u,111
Netzwerkartige Datenbank,11,14 unión externa,48,126
NF2Relación,322 NF2-forma normal,
59 atributo Nichtschlüssel,62,68 PAG
Dividir,252
partición,250,252,310
NO HAY ACCIÓN, en Fremdschlüsseln,41,91,92 Sistema PA,314
lectura no repetible,300 forma normal,58 DOP,196,197,311
constructor,197
Boyce-Codd,sesenta y cinco DOP::FETCH_BOUND,233
dritte,sesenta y cinco,68 PDO::PARAM_LOB,233
primero,59 PDOExcepción,201
divertido,69,73,74 Declaración PDO,197,199
NF2,59,322 estrategia pesimista,289
vierte,69,71 Fantasma,300
dos veces,62 PHP,186,191
relación normalizada,27 transacción,137
sin SQL,12,15,307 NO integridad física,34
NULO,43 post-método,193
Notación de sintaxis,102 método de preparación,218,230
No operador,111 Primärschlüssel,31,32 CLAVE
NULO,37 PRIMARIA,147,148 proyección,
en Fremdschlüsseln,41 241,258 Proyección de una
operador nulo,114 relación,47 Público-Bezeichner,
165
oh
Objeto,319,324 q
Banco de datos orientado a objetos,11,13, Consulta,dieciséis

319 Objektrelationale Datenbank,13,29, método de consulta,199


322 Objeto-sicht,324,327 AL BORRAR,147,
148 R
CASCADA,41,91 SIN escaneo de rango,249

ACCIÓN,41,91 ESTABLECER bloqueo de rango,302

NULO,41,91 EN LA partición de rango,252 LEER


ACTUALIZACIÓN,147,148 COMPROMETIDO,300
CASCADA,41,92 SIN LEER SIN COMPROMISO,300
ACCIÓN,41,92 Recuperación,271,274
ESTABLECER NULO,41, Rehacer registro,279
92 Operador,44 Redundancia,6,17,23,59,64,69
Sachverzeichnis 353

REFERENCIAS,147,148 materializado,254
Referenz-Integritätsregel,40,91 Skalierung
partición de referencia,253 horizontal,312
Reglas de Date,309 Relación,26 vertical,312
,27 función de sueño,223
eingebettet,324,325,330 Algún operador,115
normalizado,27 Spaltenbedingung,147
temporalmente,30 Spaltenorientierte Datenbank,15,315
álgebra relacional,43,137,257 espermecanismo,290
banco de datos relacional,12,29 SQL,4,43,99
Modelo de relación,23 Unterabfrage,115
LECTURA REPETIBLE,300 desarrollador SQL,102
replicación,310 Servidor SQL,100,137,144
restricción,241,258 Restricción de CÓDIGO SQL,219
una relación,47 Recuperación, Inyección SQL,215
dieciséis ESTADOSQL,219
REVOCAR,163,165 Sintaxis SQL,101
RETROCEDER,18,136,318 Entidad Starke,80
método de reversión,201 estadística,241
relación de rumpf einer,26 en MySQL,247
en oráculo,243
S en servidor SQL,245

Satz,4 Procedimiento almacenado,264

función Scandir,228 Cadena,146


Esquema,172 Función Str_To_Date,146 lista
mysql,176 de artículos,341
Oráculo,174 subtipo,93,94
Servidor SQL,176 Superschlüssel,32
Schlüsselkandidat,32,63 supertipo,94
Sintaxis
partición de Schlüssel,254
Schnitt,122 Notación,102
Schnitt von Relationen,46
t
Entidad Schwache,80,93,94
mesa de comedor,148
Seleccione-Befehl,100,103,139
Referencias de tablas,104
Hauptteil,102
espacio de tabla,177
Seleccione-Klausel,104
relación temporal,30
selección,47
El operador,332
selectividad,242
unión theta,48,126 Operador
integridad semántica,34,169
de lanzamiento,225
secuencia,162
Función To_Date,146
serialización,221 transacción,9,dieciséis,136,171,208,272,286
SERIALIZABLE,300 global,311,317 Abhängigkeit
variable de sesión,208 transitivo,67,68 Desencadenar,35,
SET NULL, en Fremdschlüsseln,41,91,92 158,159,264 Bloqueo de prueba,
ESTABLECER TRANSACCIÓN,301 201,223 tupel,4
SetAttribute-Método,198
bloqueo compartido,292
seguridad,143 Ud.
Sí,8,30,152,158,168 operador umbenennungs,49
354 Sachverzeichnis

UML,79 Forma normal,69,71


operador unärer,45 Vista,30,152
Deshacer registro,279 Todas las funciones funcionales,61
UNIÓN,103,122
ÚNICO,147,148 W.
Unterabfrage,115 Wartegrafo,297
Actualización-Befehl,133,139 Donde-Klausel,111
CON OPCIÓN DE CHEQUE,156,158 CON
V
OPCIÓN DE SUBVENCIÓN,164,165
Valor,159
Campo de variables,324,
325 VARRAY,325 z
Verbund,258 Zeichenkette,146
äußerer,126 Zugriff
natural,48,124,241 de atomar,17
relaciones,48 Zugriffsberechtigung,34
Verbundabhängigkeit,74 Zugriffsrecht,164
Vereinigung,122 Zugriffsschutz,7
Vereinigung von Relationen,46 Zusicherung,157
Verfügbarkeit,313 Zuverlässigkeit,9
operador vergleich,112 Compromiso Zwei-Phasen,311,316,318
Verteilte Datenbank,308,309 Zweite Integritätsregel,40 forma normal
12 reglas,309 zweite,62

Das könnte Ihnen auch gefallen