Mertins / Neumann / Kühnel | SQL Server 2016 | E-Book | www.sack.de
E-Book

E-Book, Deutsch, 1296 Seiten

Reihe: Rheinwerk Computing

Mertins / Neumann / Kühnel SQL Server 2016

Das Handbuch für Entwickler
7. Auflage 2016
ISBN: 978-3-8362-4065-9
Verlag: Rheinwerk
Format: EPUB
Kopierschutz: 6 - ePub Watermark

Das Handbuch für Entwickler

E-Book, Deutsch, 1296 Seiten

Reihe: Rheinwerk Computing

ISBN: 978-3-8362-4065-9
Verlag: Rheinwerk
Format: EPUB
Kopierschutz: 6 - ePub Watermark



Sie sind Entwickler und setzen Microsofts SQL Server ein? Dann sind Sie mit unserem Buch genau richtig. Vom ersten Datenbankentwurf und den SQL-Grundlagen, der Migration von SQL Server 2014, 2012 oder 2008 bis hin zu den neuen Features und konkreten Programmierbeispielen beschreiben die Autoren alles Notwendige, um SQL Server 2016 als Programmierplattform und Datenmanagement-Server zu nutzen. Egal, ob es sich um klassische Programmierung mit Transact-SQL oder .NET-Programmierung, ADO.NET handelt. In der mittlerweile siebten Auflage wurde das Buch umfassend aktualisiert und alle Neuerungen von SQL Server 2016 berücksichtigt.

Aus dem Inhalt:

  • Installation und Migration
  • Datentypen in SQL Server 2016
  • Datenbankentwurf
  • Grundlagen T-SQL-Programmierung
  • Benutzerverwaltung und Schemata
  • Gespeicherte Prozeduren
  • Benutzerdefinierte Funktionen
  • Einsatz von Triggern
  • Event Notification
  • XML, Webservices, PowerShell
  • Datenbankzugriff mit ADO.NET und LINQ
  • ADO.NET Entity Framework


Dirk Mertins ist Microsoft Certified Solution Developer (MCSD) und Microsoft Certified Database Administrator (MCDBA). Er ist freiberuflicher Trainer für die Themen SQL-Server-Programmierung und -Administration.
Mertins / Neumann / Kühnel SQL Server 2016 jetzt bestellen!

Weitere Infos & Material




  Vorwort ... 35


TEIL I.  Grundlagen ... 37


  1.  Installation und Aktualisierung von SQL Server 2016 ... 39


       1.1 ... Überblick über die verfügbaren SQL-Server-2016-Versionen ... 39

       1.2 ... Installationsvoraussetzungen ... 40

       1.3 ... Installation von SQL Server 2016 ... 41

       1.4 ... Installation des Management Studios ... 49

       1.5 ... Installation der SQL-Server-Beispieldatenbank ... 51

       1.6 ... Aktualisierung auf SQL Server 2016 ... 55



  2.  Datenbankgrundlagen ... 61


       2.1 ... Server und Client ... 61

       2.2 ... Relationale Datenbanken ... 62

       2.3 ... Datenbankmanagementsystem ... 80

       2.4 ... Integritätsarten ... 83



  3.  Logischer Datenbankentwurf ... 85


       3.1 ... Grundlagen des Datenbankentwurfs ... 85

       3.2 ... Normalisierungsregeln (Normalformen) ... 86

       3.3 ... Normalisierung in der Praxis ... 93

       3.4 ... Denormalisierung ... 96

       3.5 ... Entity-Relationship-Diagramme ... 97



  4.  Die Oberfläche von SQL Server 2016 ... 101


       4.1 ... Das SQL Server Management Studio ... 101

       4.2 ... Das Bearbeiten von SQL-Anweisungen im Management Studio ... 118

       4.3 ... SQL-Server-Dokumentation und Hilfen zur Programmierung ... 130

       4.4 ... Überblick über die SQL-Server-Dienste ... 138

       4.5 ... Das Dienstprogramm »sqlcmd« ... 139

       4.6 ... SQL-Server-Integration in die Windows PowerShell ... 142



TEIL II.  SQL-Programmierung ... 151


  5.  Grundlegende Abfragetechniken ... 153


       5.1 ... Einführung in SQL ... 153

       5.2 ... SQL-Grundlagen ... 154

       5.3 ... Grundlegende Operatoren ... 163

       5.4 ... Einfache Abfragen ... 167

       5.5 ... Auswahloperatoren ... 181

       5.6 ... Aggregatfunktionen ... 189

       5.7 ... Unterabfragen ... 192

       5.8 ... Zusammenfassung, Gruppierung und Beschränkung von Abfrageergebnissen ... 198

       5.9 ... Die Mengen-Operatoren »EXCEPT« und »INTERSECT« ... 209

       5.10 ... Ausgaben mit »PRINT« und »SELECT« ... 211



  6.  Grundlagen der SQLProgrammierung ... 213


       6.1 ... Das Stapeltrennzeichen »GO« ... 213

       6.2 ... (Lokale) Variablen ... 215

       6.3 ... Ablaufsteuerung ... 223

       6.4 ... Fallunterscheidungen ... 233

       6.5 ... Funktionen ... 241

       6.6 ... Dynamische SQL-Anweisungen ... 261

       6.7 ... Fehler in SQL Server und ihre Behandlung ... 263

       6.8 ... Fehlerbehandlung ... 266



  7.  Mehrtabellenabfragen ... 287


       7.1 ... Tabellen verknüpfen (»JOIN«-Anweisung) ... 287

       7.2 ... Abfragen unter Verwendung mehrerer Server ... 296



  8.  Erstellen und Ändern von Datenbanken ... 299


       8.1 ... Erstellen einer einfachen Datenbank ... 299

       8.2 ... Einfluss der »model«-Datenbank auf das Erstellen neuer Datenbanken ... 306

       8.3 ... Löschen von Datenbanken ... 308

       8.4 ... Erstellen einer Datenbank mit mehreren Dateien ... 308

       8.5 ... Nachträgliche Änderungen an Datenbankdateien ... 311

       8.6 ... Erstellen einer Datenbank mit mehreren Dateigruppen ... 313

       8.7 ... Datenbanken verkleinern ... 316

       8.8 ... Datenbankdateien verkleinern ... 318

       8.9 ... Gespeicherte Systemprozeduren (Stored Procedures) zur Datenbankverwaltung ... 319

       8.10 ... Datenbank-Momentaufnahmen ... 320

       8.11 ... Transparente Datenverschlüsselung ... 329



  9.  Erstellen von Tabellen ... 333


       9.1 ... Die grundlegende Syntax zur Tabellenerstellung ... 333

       9.2 ... Tabellen ändern ... 350

       9.3 ... Löschen von Tabellen ... 352

       9.4 ... Implementierung der Datenintegrität ... 353

       9.5 ... Anwendungsbeispiel zu Einschränkungen ... 360

       9.6 ... Nachträgliche Definition von Einschränkungen ... 362

       9.7 ... Verwaltung von Einschränkungen ... 363

       9.8 ... Temporäre Tabellen ... 365

       9.9 ... Partitionierung von Tabellen ... 367



10.  Speicherung von Daten in FileTables ... 377


       10.1 ... Voraussetzungen für die Verwendung von FileTables ... 377

       10.2 ... Erstellung einer FileTable ... 380

       10.3 ... Zugriff auf eine FileTable ... 382

       10.4 ... Sichten zur Abfrage vorhandener FileTables in einer Datenbank ... 384



11.  Verwendung der räumlichen und hierarchischen Datentypen ... 385


       11.1 ... Räumliche Datentypen ... 385

       11.2 ... Der hierarchische Datentyp ... 419



12.  Daten verwalten ... 429


       12.1 ... Grundlegende Befehle zur Datensatzmanipulation ... 429

       12.2 ... Verwendung des Zeilenkonstruktors ... 438

       12.3 ... Kombinierte Auswahl-/Einfügeanweisungen ... 439

       12.4 ... Die »MERGE«-Anweisung ... 441

       12.5 ... Massenkopierprogramme ... 448



13.  Benutzerverwaltung und Schemas ... 451


       13.1 ... Authentifizierung am Server ... 452

       13.2 ... Datenbankzugriff erteilen ... 456

       13.3 ... Zusammenfassung von Benutzern zu Rollen ... 458

       13.4 ... Rechtevergabe an Benutzer und Rollen ... 465

       13.5 ... Deaktivierung und Aktivierung von Logins und Datenbankbenutzern ... 471

       13.6 ... Vordefinierte Konten auf Server- und Datenbankebene ... 473

       13.7 ... Schema ... 476



14.  Eigenständige Datenbanken ... 483


       14.1 ... Das Konzept der eigenständigen Datenbanken ... 483

       14.2 ... Konfiguration des Servers zur Verwendung eigenständiger Datenbanken ... 483

       14.3 ... Erstellung einer eigenständigen Datenbank ... 484

       14.4 ... Identifizierung eigenständiger Datenbanken ... 485

       14.5 ... Besonderheiten der Benutzerverwaltung eigenständiger Datenbanken ... 486

       14.6 ... Verbindungsaufbau zu einer eigenständigen Datenbank ... 487

       14.7 ... Konvertierung einer Datenbank in eine eigenständige Datenbank ... 489

       14.8 ... Migration einer eigenständigen Datenbank auf einen anderen Server ... 492



15.  Sichten ... 495


       15.1 ... Einsatz von Sichten ... 496

       15.2 ... Verwalten von Sichten ... 498

       15.3 ... Datenmanipulationsanweisungen auf eine Sicht ... 500

       15.4 ... Systemsichten von SQL Server ... 506



16.  Programmierung von gespeicherten Prozeduren ... 509


       16.1 ... Überblick über die Verwendung von gespeicherten Prozeduren in SQL Server ... 509

       16.2 ... Erstellung und Aufruf von gespeicherten Prozeduren ... 513

       16.3 ... Tabellenübergabe an eine gespeicherte Prozedur ... 530

       16.4 ... Optionen von gespeicherten Prozeduren ... 532



17.  Programmierung von benutzerdefinierten Funktionen ... 539


       17.1 ... Überblick über benutzerdefinierte Funktionen ... 539

       17.2 ... Skalare Funktionen (Skalarwertfunktionen) ... 540

       17.3 ... Inlinefunktionen (Tabellenwertfunktionen) ... 544

       17.4 ... Tabellenwertfunktion mit mehreren Anweisungen ... 547

       17.5 ... Ändern und Löschen von benutzerdefinierten Funktionen ... 549

       17.6 ... Verwendung des Datentyps »table« als lokale Variable ... 550



18.  Programmierung und Einsatz von Triggern ... 555


       18.1 ... DML-Trigger ... 555

       18.2 ... DDL-Trigger ... 576



19.  Nachverfolgung von Datenänderungen ... 583


       19.1 ... Die Möglichkeiten zur Nachverfolgung von Datenänderungen: Change Data Capture und die Änderungsnachverfolgung ... 583

       19.2 ... Change Data Capture ... 584

       19.3 ... Änderungsnachverfolgung ... 598



20.  Temporal tables ... 603


       20.1 ... Die Funktionsweise von temporal tables ... 603

       20.2 ... Erstellung von temporal tables ... 604

       20.3 ... Verwaltung der Einträge in der temporal und history table ... 608

       20.4 ... Abfragen von temporal tables ... 611

       20.5 ... Löschen von temporal tables ... 615



21.  Dynamische Datenmaskierung ... 617


       21.1 ... Funktionen zur Maskierung von Spalteninhalten ... 617

       21.2 ... Beispiel zur Erstellung einer Tabelle mit dynamischer Datenmaskierung ... 618

       21.3 ... Zugriff auf dynamisch maskierte Spalteninhalte ... 620



22.  Verschlüsselung von Spalten mit Always Encrypted ... 621


       22.1 ... Voraussetzungen einer Client-Applikation für die Verwendung von Always Encrypted ... 622

       22.2 ... Beispiel für die Konfiguration von Always Encrypted ... 622

       22.3 ... Schlüsselmanagement ... 632



23.  Zeilenbasierte Sicherheit ... 633


       23.1 ... Das Prinzip der zeilenbasierten Sicherheit ... 633

       23.2 ... Beispiel für die Implementierung der zeilenbasierten Sicherheit ... 634



24.  Ereignisbenachrichtigungen (Event Notifications) ... 641


       24.1 ... Konfiguration einer Datenbank zur Nutzung des Service Brokers ... 642

       24.2 ... Konfiguration des Zieldienstes ... 643

       24.3 ... Erstellen einer Ereignisbenachrichtigung ... 645

       24.4 ... Auslösen und Empfangen einer Ereignisbenachrichtigung ... 646

       24.5 ... Service-Broker-Aktivierung ... 647

       24.6 ... Löschen der erstellten Objekte ... 651



25.  Erstellung und Einsatz eines Cursors ... 653


       25.1 ... Funktionsweise eines Cursors ... 653

       25.2 ... Erstellung eines Cursors ... 655

       25.3 ... Öffnen eines Cursors ... 657

       25.4 ... Das Abrufen von Datensätzen aus einem Cursor ... 658

       25.5 ... Schließen und Löschen eines Cursors ... 666

       25.6 ... Schleifenprogrammierung zum automatischen Durchlaufen eines Cursors ... 667

       25.7 ... Daten in der Cursorauswahl aktualisieren und löschen ... 672



26.  Sequenzen ... 675


       26.1 ... Erstellung einer Sequenz mit Standardeinstellungen ... 675

       26.2 ... Informationen zu den vorhandenen Sequenzen in einer Datenbank ... 676

       26.3 ... Abrufen von Sequenzwerten ... 676

       26.4 ... Die Verwendung der Parameter »AS«, »START«, »INCREMENT«, »MINVALUE«, »MAXVALUE«, »CYCLE« und »CACHE« ... 678



27.  Indizes ... 685


       27.1 ... Der nicht gruppierte Index auf einem Heap ... 686

       27.2 ... Der gruppierte Index ... 689

       27.3 ... Der nicht gruppierte Index auf einem gruppierten Index ... 693

       27.4 ... Der Columnstore-Index ... 696

       27.5 ... Erstellung von Indizes ... 696

       27.6 ... Verwaltung von Indizes ... 700

       27.7 ... Statistiken ... 704

       27.8 ... Planung des Einsatzes von Indizes ... 709

       27.9 ... Weitere Optimierungsmöglichkeiten mithilfe von Indizes ... 718



28.  Columnstore-Indizes ... 727


       28.1 ... Das Grundprinzip von Columnstore-Indizes ... 727

       28.2 ... Erstellung eines nicht gruppierten Columnstore-Index ... 729

       28.3 ... Erstellung eines gruppierten Columnstore-Index ... 734

       28.4 ... Abfragen von Informationen über vorhandene Columnstore-Indizes ... 737



29.  Transaktionen ... 739


       29.1 ... Einführung in Transaktionen ... 739

       29.2 ... ACID ... 741

       29.3 ... Interne Transaktionsverarbeitung ... 744

       29.4 ... Verhalten bei Systemfehlern ... 745

       29.5 ... Programmierung expliziter Transaktionen ... 747

       29.6 ... Implizite Transaktionen ... 750

       29.7 ... Sperren ... 752

       29.8 ... Isolationsstufen auf Verbindungsebene ... 755

       29.9 ... Sperrhinweise auf Tabellenebene ... 764

       29.10 ... Informationen zu Sperren ... 766

       29.11 ... Deadlocks ... 766



30.  Speicheroptimierte Tabellen ... 771


       30.1 ... Grundlagen der speicheroptimierten Tabellen ... 771

       30.2 ... Beständigkeit speicheroptimierter Tabellen ... 772

       30.3 ... Konfiguration einer Datenbank zur Verwendung speicheroptimierter Tabellen ... 773

       30.4 ... Erstellung speicheroptimierter Tabellen ... 777

       30.5 ... Vergleich des Verhaltens beider Arten von speicheroptimierten Tabellen ... 779



31.  Indizierung speicheroptimierter Tabellen ... 781


       31.1 ... Unterschiede zwischen der Indizierung speicheroptimierter und dateibasierter Tabellen ... 781

       31.2 ... Indexarten für die Verwendung mit speicheroptimierten Tabellen ... 782

       31.3 ... Überlegungen zur Verwendung nicht gruppierter Indizes oder nicht gruppierter Hash-Indizes ... 787

       31.4 ... Abfragen zu Indizes speicheroptimierter Tabellen ... 787



32.  Systemintern kompilierte gespeicherte Prozeduren ... 789


       32.1 ... Überblick über systemintern kompilierte gespeicherte Prozeduren und deren Verwendung ... 789

       32.2 ... Erstellung systemintern kompilierter gespeicherter Prozeduren ... 790

       32.3 ... Ändern einer systemintern kompilierten gespeicherten Prozedur ... 794

       32.4 ... Informationen zum Speicherort und den geladenen DLL-Dateien ... 795



TEIL III.  .NET-Programmierung ... 797


33.  SQL Server als Laufzeitumgebung für .NET ... 799


       33.1 ... Die Programmiermodelle im Vergleich ... 799

       33.2 ... Die CLR-Integration im Detail ... 803

       33.3 ... Der Hosting-Layer ... 807

       33.4 ... Verwaltung von Assemblies ... 809

       33.5 ... Sicherheitsstufen ... 811



34.  .NET-Programmierung ... 813


       34.1 ... CLR-Unterstützung aktivieren ... 813

       34.2 ... CLR-Prozeduren und Funktionen ... 815

       34.3 ... Gespeicherte Prozeduren ... 820

       34.4 ... Benutzerdefinierte Funktionen ... 828

       34.5 ... Serverseitiger Datenzugriff mit ADO.NET ... 836

       34.6 ... Pipes ... 838

       34.7 ... Impersonalisierung ... 845

       34.8 ... Benutzerdefinierte Typen ... 850

       34.9 ... Benutzerdefinierte Aggregate ... 866

       34.10 ... Benutzerdefinierte Trigger ... 873

       34.11 ... Administration und Monitoring von CLR-Objekten ... 880



35.  T-SQL: erweiterte Themen ... 885


       35.1 ... Kompatibilität festlegen ... 885

       35.2 ... Änderungen der Kompatibilität ab SQL Server 2008 ... 886

       35.3 ... Änderungen bei nicht ANSI-konformen Abfragen ... 887

       35.4 ... »CROSS APPLY« und »OUTER APPLY« ... 888

       35.5 ... Kreuztabellen mit »PIVOT« erstellen ... 890

       35.6 ... Common Table Expressions ... 897

       35.7 ... Fehlerbehandlung ... 905

       35.8 ... Ranking- und Windowing-Funktionen ... 912

       35.9 ... Die »OUTPUT«-Klausel ... 919

       35.10 ... Die »TABLESAMPLE«-Klausel ... 921

       35.11 ... »EXCEPT«- und »INTERSECT«-Statement ... 923

       35.12 ... Tabellenwertparameter ... 925



36.  Einsatz von XML und JSON in der Datenbank ... 931


       36.1 ... Warum XML? ... 932

       36.2 ... HTML und XML ... 932

       36.3 ... XML-Fähigkeiten von SQL Server ... 936

       36.4 ... Der XML-Datentyp ... 937

       36.5 ... Auf gespeicherte XML-Daten zugreifen ... 943

       36.6 ... Darstellung von Abfrageergebnissen im XML-Format ... 954

       36.7 ... XML-Schema ermitteln ... 970

       36.8 ... XML-Daten in einem relationalen Modell speichern ... 972

       36.9 ... Bereitstellung von Daten im JSON-Format ... 975



37.  Datenbankzugriff mit ADO.NET ... 989


       37.1 ... Einleitung ... 989

       37.2 ... Die Datenprovider ... 992

       37.3 ... Die Verbindung zu einer Datenbank herstellen ... 993

       37.4 ... Die Datenbankabfrage ... 1015

       37.5 ... Das »SqlDataReader«-Objekt ... 1021

       37.6 ... Parametrisierte Abfragen ... 1029

       37.7 ... Der »SqlDataAdapter« ... 1043

       37.8 ... Daten im lokalen Speicher -- das »DataSet« ... 1056

       37.9 ... Mit mehreren Tabellen arbeiten ... 1081

       37.10 ... Aktualisieren der Datenbank ... 1089



38.  LINQ ... 1119


       38.1 ... Was ist LINQ? ... 1119

       38.2 ... LINQ to Objects ... 1125

       38.3 ... Die Abfrageoperatoren ... 1129



39.  Einführung in das ADO.NET Entity Framework ... 1155


       39.1 ... Kritische Betrachtung von ADO.NET ... 1156

       39.2 ... Ein erstes Entity Data Model (EDM) erstellen ... 1158

       39.3 ... Das Entity Data Model im Designer ... 1163

       39.4 ... Der Aufbau des Entity Data Models ... 1168

       39.5 ... Die Klassen des Entity Data Models (EDM) ... 1172

       39.6 ... Die Architektur des Entity Frameworks ... 1180



40.  Abfragen mit .NET 4 Framework-ObjectContext ... 1183


       40.1 ... Abfragen mit LINQ to Entities ... 1184

       40.2 ... Abfragen mit Entity SQL ... 1207

       40.3 ... Der EntityClient-Provider ... 1212

       40.4 ... Abfrage-Generator-Methoden (QueryBuilder-Methoden) ... 1215

       40.5 ... SQL-Direktabfragen ... 1216



41.  Entitätsaktualisierung und Zustandsverwaltung ... 1219


       41.1 ... Aktualisieren von Entitäten ... 1219

       41.2 ... Der Lebenszyklus einer Entität im Objektkontext ... 1228

       41.3 ... Das »ObjectStateEntry«-Objekt ... 1236

       41.4 ... Die Klasse »EntityKey« ... 1241

       41.5 ... Komplexere Szenarien ... 1243



42.  Konflikte behandeln ... 1249


       42.1 ... Allgemeine Betrachtungen ... 1249

       42.2 ... Konkurrierende Zugriffe mit dem Entity Framework ... 1251



43.  Die DbContext-API ... 1259


       43.1 ... Datenabfragen mit »DbContext« ... 1259

       43.2 ... Ändern von Entitäten ... 1269

       43.3 ... Change Tracking (Änderungsnachverfolgung) ... 1274

       43.4 ... Kontextlose Entitäten ändern ... 1280



  Index ... 1287


2.2    Relationale Datenbanken


Das Modell einer relationalen Datenbank wurde erstmals 1970 von Dr. Edgar Frank Codd (1923–2003) in seinem Artikel »A Relational Model of Data for Large Shared Data Banks« veröffentlicht.

Hinweis

Eine Kopie dieses Artikels finden Sie z. B. unter der Internetadresse
http://www.seas.upenn.edu/~zives/03f/cis550/codd.pdf.

Mit diesem Artikel löste Codd eine der tiefstgreifenden Veränderungen in der Datenverarbeitung aus: den Übergang zu den relationalen Datenbanken.

Die ersten für Computer entwickelten Datenbanken unterschieden sich in ihrer Struktur grundlegend von der Struktur heutiger Datenbanksysteme. Eine der ersten Lösungen, Daten auf einem Computer zugänglich zu machen, beruhte auf der sequenziellen Speicherung der Daten in Textdateien. In der weiteren Entwicklung wurde der Ansatz verfolgt, die Daten in einer hierarchischen Struktur abzulegen. Abbildung 2.1 zeigt ein Beispiel für den Aufbau einer solchen Datenbank. Um einen Datensatz zu finden, musste eine Baumstruktur durchlaufen werden, an deren Ende der gesuchte Datensatz stand.

Abbildung 2.1    Prinzipieller Aufbau erster Datenbanklösungen

Codds Arbeit hingegen basiert auf einem wissenschaftlichen Ansatz, in dem er die Verwaltung von Daten durch mathematische Methoden der Mengenlehre beschreibt. Im Zusammenhang mit relationalen Datenbanken werden daher häufig die aus der Mengenlehre stammenden Fachbegriffe verwendet. Diese etwas »akademisch« klingenden Begriffe sind sicherlich ein Grund dafür, dass bei vielen Leuten immer noch eine hohe Hemmschwelle vor der Beschäftigung mit Datenbanken besteht. Einige dieser Fachbegriffe erwähnen und erklären wir weiter unten, da sie in anderen Publikationen verwendet werden. In diesem Buch verwenden wir – soweit es möglich ist – allgemein verständliche Bezeichnungen. Für manche Fachbegriffe gibt es jedoch kein Synonym, sodass diese dann im Buch Verwendung finden.

Was aber versteht man nun genau unter einer relationalen Datenbank?

Relationale Datenbanken arbeiten nach einem völlig anderen Prinzip als die oben beschriebenen Ansätze. Das wesentlichste Merkmal einer relationalen Datenbank besteht darin, dass die Daten in zueinander in Beziehung stehenden Tabellen (den sogenannten Relationen) abgelegt werden (siehe Abbildung 2.2). Auf welche Weise die Tabellen einer relationalen Datenbank zueinander in Beziehung gesetzt werden, behandeln wir in Abschnitt 2.2.3, »Schlüssel«.

Abbildung 2.2    Schematischer Aufbau einer relationalen Datenbank

Die Aufteilung von Daten in zueinander in Beziehung stehende Tabellen ermöglicht eine sehr strukturierte Speicherung von Daten, da in eine Tabelle immer nur Informationen über eine Art von Objekten abgelegt werden sollten, wobei es sich bei diesen Objekten sowohl um reale Dinge wie z. B. Personen oder Fahrzeuge als auch um abstrakte Dinge wie beispielsweise Verleihvorgänge handeln kann.

Diese Art der Speicherung erfüllt einen weiteren wesentlichen Zweck: die Vermeidung von Redundanz. Dieser Begriff bezeichnet im Kontext von Datenbanken die mehrfache Speicherung der gleichen Information. Redundanz bedeutet nicht nur den unnötigen Verbrauch von Speicherplatz, sondern kann bei ihrem Vorhandensein innerhalb einer Datenbank ernsthafte Probleme verursachen, wie das folgende Beispiel aus der Praxis deutlich machen soll.

In vielen Firmen werden die Daten der Mitarbeiter an mehreren Stellen erfasst. Die Buchhaltung verfügt über ein eigenes Programm zur Gehaltsabrechnung mit den Daten der Mitarbeiter, die Abteilungsleiter haben die Daten der Mitarbeiter ihrer Abteilung ebenfalls erfasst, und der Betriebsrat pflegt eine eigene Excel-Tabelle dieser Daten. Bereits bei dieser Speicherung von Daten an nur drei verschiedenen Stellen stellt man bei einer Überprüfung schnell fest, dass die Daten in den seltensten Fällen untereinander abgeglichen sind: Die neue Adresse eines Mitarbeiters wurde nach seinem Umzug nicht in allen drei Datenbeständen geändert, schon lange ausgeschiedene Mitarbeiter wurden nicht gelöscht und so weiter.

Übertragen auf eine Datenbank, entspräche dieses Beispiel der Tatsache, dass die Mitarbeiterinformationen dreimal innerhalb einer Datenbank abgespeichert worden wären, beispielsweise in verschiedenen Tabellen. Als Konsequenz daraus ergäbe sich die Tatsache, dass je nachdem, welche Tabelle zur Abfrage herangezogen wird, unterschiedliche Informationen zu einem Mitarbeiter zurückgeliefert würden, eben in Abhängigkeit davon, ob ein aktueller oder veralteter Datensatz als Quelle der Information diente. Mit anderen Worten: Die Korrektheit und Verlässlichkeit der Daten, die auch als Datenintegrität bezeichnet wird, wäre nicht mehr gewährleistet. Eine Datenbank, die nur zufällig korrekte Informationen ausgibt, ist aber praktisch wertlos.

Natürlich ist mit der Datenintegrität nicht die absolute Fehlerfreiheit von Daten gemeint: Zwar können Daten während der Eingabe von modernen Datenbanksystemen auf bestimmte Fehler hin überprüft werden, einen Schutz vor Schreibfehlern bei der Eingabe z. B. eines Vor- oder Nachnamens kann auch das beste Datenbanksystem nicht bieten.

Das Beispiel der dreifach erfassten Datensätze macht deutlich, welche Bedeutung die Vermeidung von Redundanz in Bezug auf die Datenintegrität hat: Wird Redundanz vermieden, also eine Information immer nur einmal an einer Stelle innerhalb der Datenbank gespeichert, entspricht diese Information immer dem letzten, aktuellsten Stand. Die Vermeidung von Redundanz sollte daher bei einem Datenbankentwurf – wie wir ihn in Kapitel 3, »Logischer Datenbankentwurf«, beschreiben – immer einen wichtigen Gesichtspunkt darstellen. Die Datenbanktheorie stellt Methoden und Hilfsmittel zur Verfügung, um dieses Ziel zu erreichen.

Nachdem wir den Zusammenhang zwischen dem Vorhandensein von Redundanz und der möglichen Auswirkung auf die Datenintegrität beschrieben haben, soll nun noch eine – in der praktischen Arbeit mit Datenbanken häufig gestellte – Frage beantwortet werden: Wann genau liegt Redundanz innerhalb einer Datenbank vor? Gerade bei der ersten Beschäftigung mit Datenbanken sorgt dieser Begriff immer wieder für Irritationen. Stellt schon die mehrfache Nennung eines Eintrags – des Wohnorts, der Steuerklasse und so weiter – bei den verschiedenen Datensätzen einer Tabelle schon Redundanz dar oder nicht? Die folgende Anmerkung soll diesen Aspekt erläutern:

Hinweis

Der Begriff Redundanz wird häufig falsch interpretiert. Ist z. B. in einer Tabelle, in der die Daten von Mitarbeitern erfasst werden, eine Spalte vorhanden, in der die Abteilung des Angestellten (Lager, Versand, Buchhaltung etc.) erfasst wird, so stellt das mehrfache Vorkommen dieser Begriffe in der Spalte keine Redundanz dar! Redundanz entstünde in diesem Fall erst dann, wenn an mehreren Stellen innerhalb der Datenbank die Information erfasst würde, dass ein bestimmter Angestellter seiner jeweiligen Abteilung zuzuordnen ist.

Auch wenn die Vermeidung von Redundanz ein Hauptmerkmal des Entwurfs von relationalen Datenbanken darstellt, so ist das Auftreten von Redundanzen nicht immer zu vermeiden. Innerhalb einer Firma könnten z. B. zwei oder mehrere Datenbanken Verwendung finden, deren Datenbestand sich teilweise überschneidet.

In diesem Fall muss sichergestellt sein, dass Änderungen von Datensätzen in der einen Datenbank auch auf die anderen redundanten Datensätze anderer Datenbanken übertragen werden. Man bezeichnet diesen Sachverhalt als die Wahrung der Datenkonsistenz.

2.2.1    Struktureller Aufbau von Tabellen


Da Tabellen die elementaren Bestandteile von relationalen Datenbanken darstellen, sollen anhand von Abbildung 2.3 einige mit Tabellen in Zusammenhang stehende Begriffe erklärt werden.

Abbildung 2.3    Ausschnitt aus der Tabelle »Product«

Dargestellt ist der Auszug einer Tabelle aus der Beispieldatenbank AdventureWorks2016CTP3. Diese Beispieldatenbank bildet die Vorgänge innerhalb einer Firma ab, die sich mit der Herstellung von Fahrrädern beschäftigt. Die abgebildete Tabelle enthält Informationen über Produkte, die von dem Fahrradhersteller eingekauft und verkauft werden.

Wie Sie erkennen, besteht eine Tabelle innerhalb einer relationalen Datenbank aus einer zweidimensionalen Struktur von Spalten und Zeilen, wobei jede Zeile innerhalb einer Tabelle einen Datensatz darstellt. Der grundsätzliche strukturelle Aufbau von Tabellen innerhalb einer relationalen Datenbank kann – vereinfacht – durch die folgenden Punkte beschrieben werden:

  • Tabellenname
    Jede Tabelle muss über einen eindeutigen Namen verfügen, unter dem sie anzusprechen ist. Dieser Name wird im Datenbankkontext auch Bezeichner genannt.
  • Spaltenname
    Die Spalten einer Tabelle müssen ebenfalls über eine...


Mertins, Dirk
Dirk Mertins ist Microsoft Certified Solution Developer (MCSD) und Microsoft Certified Database Administrator (MCDBA). Er ist freiberuflicher Trainer für die Themen SQL-Server-Programmierung und -Administration.

Kühnel, Andreas
Andreas Kühnel wohnt in Aachen und beschäftigt sich seit über 25 Jahren mit der Programmierung. Er ist seit 1995 als Microsoft Certified Trainer (MCT) zertifiziert. Seine "große Liebe" galt anfangs Visual Basic. Seit der ersten Vorstellung von .NET konzentriert er sich hauptsächlich auf die Sprachen VB.NET und natürlich C#. Zu seinen Schwerpunkten in der .NET-Welt gehören Datenbanken, Windows-Anwendungen mit WPF, ASP.NET und die WCF (Windows Communication Foundation). Heute ist Andreas Kühnel als freiberuflicher IT-Trainer und Berater deutschlandweit tätig, führt aber auch Schulungen in seinem eigenen Seminarraum in Aachen durch.

Neumann, Jörg
Jörg Neumann ist Principal Consultant bei der Acando GmbH in Hamburg, Associate bei Thinktecture und Microsoft MVP. Er ist Spezialist für Client- und Datenbank-Technologien.



Ihre Fragen, Wünsche oder Anmerkungen
Vorname*
Nachname*
Ihre E-Mail-Adresse*
Kundennr.
Ihre Nachricht*
Lediglich mit * gekennzeichnete Felder sind Pflichtfelder.
Wenn Sie die im Kontaktformular eingegebenen Daten durch Klick auf den nachfolgenden Button übersenden, erklären Sie sich damit einverstanden, dass wir Ihr Angaben für die Beantwortung Ihrer Anfrage verwenden. Selbstverständlich werden Ihre Daten vertraulich behandelt und nicht an Dritte weitergegeben. Sie können der Verwendung Ihrer Daten jederzeit widersprechen. Das Datenhandling bei Sack Fachmedien erklären wir Ihnen in unserer Datenschutzerklärung.