Lösungsvorschlag 3 - Universität Mannheim

Werbung
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
Herunterladen