Universität Mannheim Lehrstuhl für Praktische Informatik III Thomas Neumann D7 27, Raum 415 68131 Mannheim Telefon: (0621) 181-2214 Email: [email protected] Datenbanksysteme II 3. Übungsblatt, Wintersemester 2003/2004 Lösungsvorschläge 1. Formulieren Sie mit Hilfe des Java-Bindings: Bestimmen Sie alle Vorlesungen, die der Student Schopenhauer hört. import org.odmg.∗; import java.util. Iterator ; public class FindSchopenhauer { private static Object executeOql(Implementation impl,Database db,String query) throws QueryException { OQLQuery q=impl.newOQLQuery(); q.create(query); return q.execute(db); } private static void restore(String server ) { try { // Get implementation org.odmg.Implementation impl=de.tneumann.sod2.SOD2. getImplementation(); // Open the DB Database db=impl.newDatabase(); db.open(”sod://sa:@”+server+”/uni”,Database.OPEN READ ONLY); // Create a transaction Transaction trans=impl.newTransaction(); trans .begin(); // Stundenten DSet studenten=(DSet)executeOql(impl,db,”studenten”); for ( Iterator iter =studenten.iterator() ; iter .hasNext();) { 1 Student s=(Student)iter.next(); if (! s .name().equals(”Schopenhauer”)) continue; System.out.print(”Schopenhauer hrt:”); for ( Iterator iter2 =s.hoert(). iterator () ; iter2 .hasNext();) System.out.print(” ”+((Vorlesung)iter2.next()). titel ()) ; System.out.println() ; } // Close DB trans .abort(); db.close () ; } catch (Exception e) { e.printStackTrace(); } } public static final void main(String[] args) { String server ; if ( args.length==1) server=args [0]; else server=”localhost”; restore (server ) ; } } 2. Welchen Unterschied macht es, ob Point als class oder als struct definiert wird? (die Syntax für struct ist struct Point long x; long y; ;). Welche Variante ist sinnvoller? • class: eigene Objektidentität/eigenes Objekt, Polygon enthält nur den Verweis • struct: keine Objektidentität, wird in Polygon eingebettet • nur struct ist sinnvoller, der Point ein Literal ist, d.h. nur über die Werte definiert ist 3. Erzeugen Sie für beide Varianten von Point eine Datenbank. Welche Unterschiede ergeben sich in Datenbankgröße und Laufzeit? Wie ist das zu erklären? Variante class struct Größe [KB] Laufzeit [s] 25136 29 8384 8 • Datenbank ist bei class größer, da eigene Objekte und zusätzlich Referenzen in Polygon • Laufzeit ist entsprechend höher, grob proportional zur Datenbankgröße 4. Bestimmen Sie für beide Varianten den Punkt mit dem größten Abstand vom Nullpunkt. Welche Unterschiede ergeben sich bei der Laufzeit? Wie ist das zu erklären? import org.odmg.∗; import java.util. Iterator ; 2 public class FindPoints { private static Object executeOql(Implementation impl,Database db,String query) throws QueryException { OQLQuery q=impl.newOQLQuery(); q.create(query); return q.execute(db); } private static void restore(String server ) { try { // Get implementation org.odmg.Implementation impl=de.tneumann.sod2.SOD2. getImplementation(); // Open the DB Database db=impl.newDatabase(); db.open(”sod://sa:@”+server+”/points”,Database.OPEN READ ONLY ); // Create a transaction Transaction trans=impl.newTransaction(); trans .begin(); // Stundenten DSet studenten=(DSet)executeOql(impl,db,”polygons”); int maxx=0,maxy=0,maxd=0; for ( Iterator iter =studenten.iterator() ; iter .hasNext();) { Polygon r=(Polygon)iter.next(); for ( Iterator iter2 =r.points() . iterator () ; iter2 .hasNext();) { Point p=(Point)iter2.next(); int d=p.x()∗p.x()+p.y()∗p.y(); if (d>maxd) { maxd=d; maxx=p.x(); maxy=p.y(); } } } System.out.println(”Punkt mit dem maximalen Abstand: (”+maxx+”,” +maxy+”)”); // Close DB trans .abort(); db.close () ; 3 } catch (Exception e) { e.printStackTrace(); } } public static final void main(String[] args) { String server ; if ( args.length==1) server=args [0]; else server=”localhost”; restore (server ) ; } } Variante class struct Laufzeit [s] 62 2 • Laufzeit ist bei class viel größer, da jeder Zugriff aif Point einen Seitenfehler auslößt (bei struct embedded) • Laufzeit für struct ist besser als beim Aufbauen der Datenbank, da nur gelesen wird (kein Schreiben, kein Log) 5. Der Schema wird sowohl objektorientiert als als relational umgesetzt (bi-direktional, referentielle Integrität durch constraints abgesichert). Wie können jetzt Daten eingefügt werden? Skizzieren Sie sowohl den OO-Teil (z.B. in Java) als auch den SQL Teil. Java: A a=new A(); B b=new B(); b.a(a); SQL: alter table insert into insert into alter table ... -- constraints ausschalten table A(...) table B(...) ... -- constraints einschalten 4