VORLESUNG EI U NIVERSIT ÄT B ERN I NFORMATIK T YP UL AUSGABE HS 08 B LATT 4 (1/4) Lösungsvorschlag Serie 4 – Datenbanken 1. Dateien Als Datei (engl. File) bezeichnet man eine nach bestimmten Gesichtspunkten zusammengestellte Menge von Daten. Eine Datei besteht aus einer Folge von Datensätzen (engl. Records). Jeder Datensatz wiederum besteht aus Feldern (engl. Fields). I.d.R. wird man Dateien auf Dauerspeichern wie Harddisks oder Bändern ablegen. Bei direkten Dateien (engl. random access files) kann direkt auf ein Record an einer bestimmten physischen Adresse innerhalb des Files (engl. seek position) zugegriffen werden. Diese Adresse lässt sich mittels eines Algorithmus aus dem gegebenen Primärschlüssel des Records bestimmen. In einer Datei sind alle Records hintereinander angeordnet. Damit die Bestimmung der physischen Adresse des i-ten Records einfacher wird, können alle Records genau gleich aufgebaut sein. Dadurch werden alle Records physisch gleich lang. Um zu einem bestimmten Datensatz an der i-ten Position zu gelangen, muss der Record innerhalb des Files ab der physischen Adresse (i − 1) · RECORD LEN GT H eingelesen werden. Datei WOHNUNGEN Wie in Abbildung 1 ersichtlich ist, sind in der Datei WOHNUNGEN alle Records bestehend aus den Feldern (Wohnungs-ID, PLZ, Ort, Strasse, Nummer, Anzahl Zimmer) hintereinander abgelegt. Eine bestimmte Sortier-Reihenfolge ist nicht zwingend, da immer indirekt über Indizes zugegriffen werden kann. physische Adresse [Bytes] 0 83 Datei 1234 2768 3012 3303 Bern Jegenstorf Erpelweg Hauptstrasse 3 45 4 5 8a 2.5 .. . 173'841 1788 3005 Bern Sennweg Abbildung 1: Datei WOHNUNGEN (Aufgabe 1) Indizes auf die Datei WOHNUNGEN Würde man nur auf dem File basieren und z.B. alle Wohnungen in Bern suchen wollen, so müsste man sequentiell jeden Record des Files auslesen und auf den Ort hin überprüfen (mit Zeitkomplexität T(n)=O(n)). Oder würde man z.B. nach einer bestimmten Anzahl Zimmer suchen, so müsste man alle Records der Datei auf diesen Wert hin überprüfen. Das gleiche gilt analog auch für alle anderen Felder der Datei. Um effizient auf alle Records mit einem bestimmten Feld-Wert zugreifen zu können, kann vorgängig pro Feld je ein Index erstellt werden. Da der Index nach dem Feldinhalt sortiert ist, lassen sich Einträge mit einem bestimmten Feldwert sehr effizient im Index finden (z.B. mittels Binary Search, T(n)=O(log n)). Mit den Index-Einträgen hat man dann zugleich auch die Adressen der zugehörigen Records. Der Zugriff auf einen oder mehrere Records mit einem bestimmten Feldinhalt wird also immer indirekt via den Index ablaufen. VORLESUNG EI U NIVERSIT ÄT B ERN I NFORMATIK T YP UL B LATT 4 (2/4) AUSGABE HS 08 Abbildung 2 zeigt 3 der 6 nötigen Indizes, um effizient über jedes der 6 Felder auf die Records zugreifen zu können. Index für Wohnungs_ID Bsp: „Der Record mit der Wohnungs-ID 2768 befindet sich an der 2. Stelle in der Datei.“ 2120 .. . 2768 2 2.5 .. 2120 . 2 Jegenstorf 4 1 . .. 1633 Zürich 2120 .. . . .. 1 .. . 1 Bern Bern . .. 9785 . .. . .. . .. . .. 1788 Index für Anzahl Zimmer Index für Ort 7 .. . 8 .. . Abbildung 2: Indizes auf die Datei WOHNUNGEN (Aufgabe 1) 2. (a) In einer relationalen Datenbank entspricht jede Zeile in einer Tabelle (Tupel) einem Datensatz (Record ). (b) Einem Attribut (Spalte einer Tabelle) sagt man auch Feld (Field ). (c) Ein Attribut ist ein Primärschlüssel, wenn es einen Datensatz in einer Tabelle eindeutig identifiziert. (d) Ein Attribut ist ein Fremdschlüssel, wenn es auf ein primäres Attribut (Primärschlüssel) einer anderen Tabelle verweist. (e) Mit SQL kann man in einem Attribut des Datentyps varchar(20) Zeichenketten (Strings) mit maximal 20 Zeichen speichern. Im Gegensatz zu char(20), welches unabhängig von der Länge der Zeichenkette immer 20 Zeichen speichert, wird in einem Attribut des Typs varchar(20) nur soviel Speicherplatz wie nötig verwendet. Die gewonnene Speichereffizienz erkauft man sich aber mit einem höheren Verarbeitungsaufwand (sog. Trade-Off“ zwischen Speicherplatz ” und Laufzeit). (f) Wird das Keywort DISTINCT verwendet werden Datensätze nur einmal ausgegeben, auch wenn sie mehrfach im Resultat vorkommen. 3. Variante 1 der Bücherausleih-DB nutzt viele Vorteile von (relationalen) Datenbanken gegenüber einfachen Dateisystemen nicht: Stammdaten: In Variante 1 ist es nicht möglich, eine Liste aller Bücher (Inventar) oder eine Liste aller Ausleiher zu führen. Solche Daten, die eine lange Gültigkeit haben und immer wieder verwendet werden, bezeichnet man als Stammdaten. In Variante 2 ist es sehr einfach, alle Bücher zu verwalten (Bücher-Stammdaten) und davon unabhängig alle Ausleiher zu verwalten (Ausleiher-Stammdaten). Redundanzverminderung: In Variante 1 müssen für jede Ausleihe Name und Vorname des Ausleihers gespeichert werden, auch wenn letzterer schon andere Bücher ausgeliehen hat. Bei Variante 2 hingegen reicht es, Name und Vorname VORLESUNG EI U NIVERSIT ÄT B ERN I NFORMATIK T YP UL B LATT 4 (3/4) AUSGABE HS 08 des Ausleihers nur einmal zu speichern. Die Ausleihe ist dann nur eine Relation zwischen dem Ausleiher und dem Buch. Datenkonsistenz: Bei Variante 1 sind Dateninkonsistenzen möglich, die bei Variante 2 von vornherein ausscheiden. So kann z. B. für zwei Ausleihen derselben Person der Name einmal falsch geschrieben werden. Flexibilität: Müssen z. B. die Daten eines Ausleihers angepasst werden (Markus Müller heisst neu: Markus Müller-Kunz), so reicht es bei Variante 2, den Namen in der Tabelle AUSLEIHER einmal anzupassen. Bei Variante 1 muss der Name für jede Ausleihe von Markus Müller angepasst werden. Als einzigen Vorteil bietet die Tabelle in Variante 1 eine für Betrachter übersichtlichere Darstellung aller Ausleihen, da alle Daten je auf einer Zeile zusammengefasst stehen. Relationale DBMS bieten allerdings ein Hilfsmittel an, mit welchem die auf verschiedene Tabellen verteilten Daten ebenfalls in dieser zusammengezogenen Form betrachtet werden können. Mithilfe der sogenannten Ansichten (engl. views) werden die jeweils zusammengehörenden Datensätze in einer einzigen virtuellen Tabelle verbunden dargestellt, obwohl die Daten in mehreren physischen Tabellen gespeichert vorliegen. 4. Es sollen sicher die Daten der vorhandenen Fotos und der Kunden gespeichert werden können. Weiter will man die Beziehung Bestellungen erfassen. Weitere Daten könnten z.B. die Fotographen oder die Fakturierung betreffen. Ein erster (einfacher) Entwurf könnte deshalb wie folgt aussehen: FOTO: Foto_ID, Speicherort, Beschreibung, Aufnahmedatum, Fotograph (Person_ID) KUNDE: Kunden_ID, Firmenname, Adresse, PLZ, Ort, Kontaktperson (Person_ID) BESTELLUNG: Bestell_ID, Kunden_ID, Foto_ID, Bestelldatum, Bestellstatus PERSONEN: Person_ID, Name, Vorname, Strasse, PLZ, Adresse, Funktion RECHNUNG: Rechnungs_ID, Bestell_ID, Preis, Fälligkeit, Rabatt 5. (a) Query: SELECT * FROM Veranstaltungen Resultat: Veranstaltung P2 LA1 CG P1 EI RA Titel Programmierung 2 Lineare Algebra 1 Computergrafik Programmierung 1 Einführung in die Informatik Rechnerarchitektur ECTS 3 6 3 3 3 3 Institut IAM MI IAM IAM IAM IAM (b) Query: SELECT Name, Vorname, Hauptfach FROM STUDIERENDE Resultat: Name Zumbühl Egger Wyss Lanz Vorname Luca Annette Stefan Sonja Hauptfach Inf Math Inf Inf VORLESUNG EI U NIVERSIT ÄT B ERN I NFORMATIK T YP UL B LATT 4 (4/4) AUSGABE HS 08 (c) Query: SELECT Titel FROM VERANSTALTUNGEN WHERE ECTS>3 Resultat: Titel Lineare Algebra 1 (d) Query: SELECT Name, Vorname FROM STUDIERENDE WHERE Matrikelnummer IN (SELECT Matrikelnummer FROM NOTEN WHERE Note>=4) Resultat: Name Vorname Egger Annette oder Query: SELECT Name, Vorname FROM STUDIERENDE, NOTEN WHERE STUDIERENDE.Matrikelnummer=NOTEN.Matrikelnummer AND Note>=4 Resultat: Name Vorname Egger Annette Egger Annette (e) Query: SELECT Veranstaltung FROM DURCHFÜHRUNGEN WHERE Jahr=2001 AND DozentIn=’Bieri’ Resultat: Veranstaltung EI CG (f) Query: SELECT Vorname, Name, Titel, Note FROM STUDIERENDE, VERANSTALTUNGEN, NOTEN, DURCHFÜHRUNGEN WHERE STUDIERENDE.Matrikelnummer=NOTEN.Matrikelnummer AND NOTEN.Nummer=DURCHFÜHRUNGEN.Nummer AND DURCHFÜHRUNGEN.Veranstaltung=VERANSTALTUNGEN.Veranstaltung Resultat: Vorname Annette Annette Sonja Name Egger Egger Lanz Titel Programmierung 1 Einführung in die Informatik Einführung in die Informatik Note 4.5 4 3