Kapitel 13: Objektorientierte Datenbanken Flashcards
Was sind Nachteile relationaler Modelierung?
- Segmentierung: z.b. Kann ein Buch mehrere Verlage haben, welche mehrere Niederlassungen haben (niedrige Performance bei komplexen Suchanfragen)
- Künstliche Schlüsselattribute: z.b. haben Kante und Fläche keine sinnvollen Schlüssel bei Polyeder
- Fehlendes Verhalten: z.b. gegenstand um x% rotiert ausgeben lassen nicht möglich
- Externe Programmierschnittstelle:
Was ist der Impendance Match?
Problem ist, dass Programm und DB zwei unterschiedliche Vorstellungen haben wie die Wirklichkeit aussieht. Alles ist Tabelle vs Objekte.
Programmiersprache passt nicht zur Datenbank
Vorteile objektorientierter Datenmodellierung?
- Objektkapselung: Information hiding
- Wiederverwendbarkeit
- Operationen sind direkt in der Sprache des Objektmodells realisiert (kein Impedance Mismatch)
Wie sieht der Standard der objektorientierten DB Haltung aus - was sind die Motivationen?
- Objektmodell: Wie tickt die DB
- Object Definition Language (ODL): Schema
- Object Query Language (OQL): Wie SQL nur schöner
- C++ Anbindung
- Smalltalk Anbindung
- Java Anbindung
Motivation:
- Portabilitäts-Standards
- Kein interoperabilität-standard
Wie kann ODMG implementiert werden (Skizze)?
Wie könnte eine 1:1 Beziehung in ODMG aussehen?
class Professor {
attribute long PersNr;
relationship Raeume residiertIn; //Wie foreign Key. Stellt integrität sicher. So ist kein Zeiger ins nirgendwo möglich wie bei attribute
};
class Raeume {
attribute long RaumNr;
attribute short Groesse;
relationship Professor beherbergt;
}
Welche Ergänzung ist bei einer 1:n Beziehung notwendig?
//Inverse: System stellt sicher, dass DB konsistent ist und zeiger paarweise aufeinander zeigen
class Professoren {
attribute long PersNr;
…
relationship Räume residiertIn inverse Räume::beherbergt;
}; class Räume {
attribute long RaumNr; attribute short Größe;
…
relationship Professoren beherbergt inverse Professoren::residiertIn };
Beispiel einer n:m Beziehung?
//hört und hörer = sets prüft auch automatisch konsistenz
class Professoren {
attribute long PersNr;
…
relationship Räume residiertIn inverse Räume::beherbergt;
}; class Räume {
attribute long RaumNr; attribute short Größe;
…
relationship Professoren beherbergt inverse Professoren::residiertIn };
Wie könnte eine Ternäre Beziehung aussehen?
//Für ternäre Beziehunen muss ein objekt angelegt werden. Z.b. Prüfung. dies hält dann eine Menge von binären Beziehungen
class Prüfungen { attribute struct Datum
{ short Tag; short Monat; short Jahr} Prüfdatum; attribute float Note;
relationship Professoren Prüfer inverse
Professoren::hatGeprüft; relationship Studenten Prüfling inverse
Studenten::wurdeGeprüft; relationship Vorlesungen Inhalt inverse
Vorlesungen::wurdeAbgeprüft; };
Beispiel aus dem Universitäts-Schema: Beziehungen erklären
class Professoren {
attribute long PersNr;
attribute string Name;
attribute string Rang; //Attribute
relationship Räume residiertIn inverse Räume::beherbergt; relationship set(Vorlesungen) liest inverse Vorlesungen::gelesenVon relationship set(Prüfungen) hatGeprüft inverse Prüfungen::Prüfer; //Beziehungen
}; class Vorlesungen {
attribute long VorlNr;
attribute string Titel;
attribute short SWS;
relationship Professoren gelesenVon
inverse Professoren::liest;
relationship set(Studenten) Hörer inverse Studenten::hört;
relationship set(Vorlesungen) Nachfolger inverse Vorlesungen::Vorgänger; relationship set(Vorlesungen) Vorgänger inverse Vorlesungen::Nachfolger; relationship set(Prüfungen) wurdeAbgeprüft inverse Prüfungen::Inhalt;
}; class Studenten {
…
relationship set(Prüfungen) wurdeGeprüft inverse Prüfungen::Prüfling; };
Welche Eigenschaften hat ein Objekt im objektbasierten Modell?
-
Identität: Relational: Tupel kann ausschießlich über Werte identifiziert werden (z.B. Tupel löschen und wieder einfügen. Man kann dann nicht herausfinden, dass es mal gelöscht wrude)
Objektorientiert:
Haben zusätzlich zu jeder Spalte noch eine ObjektID - diese wird nach dem löschen neu (Jedes Tupel hat eigene ID). - Typ: Objekte haben eine Intentität + Typ + Attributwerte
- Wert / Zustand
Genaurer Beschreibung der Objekt-Identität:
- Gilt als wesentliches Charakteristikum objektorientierter Datenmodellierung
- Verweise werden über OIDs realisiert (OID ist pointer auf Objekt)
- Physische OID:
- Enthalten Speicherort des Objekts
- Entsprechen den Tupel IDs relationaler DBs
- Vorteil: Billiger Objektzugriff, da ich direkt von Objekt zu Objekt springen kann
- Nachteil: Wird Objekt verschoben, muss ich alle Zeiger anpassen.
- Logische OID:
- Unabhängig vom Speicherort des Objekts
- Objekte können verschoben werden
- Indirektion über “Mapping” Struktur
- Vorteil: Verschieben möglich
- Nachteil: Indirektion teuer, da ich schreiben muss
- Physische OID:
Was bedeuten die Typeigenschaften Extension und Schlüssel
class Studenten (extent AlleStudenten key MatrNr) { attribute long MatrNr;
//extent: Sicht die alle Objekte eines Datentyps liefert
//**key:** Schlüssel können eindeutig über OID identifiziert werden attribute string Name; attribute short Semester;
relationship set(Vorlesungen) hört inverse Vorlesungen::Hörer;
relationship set(Prüfungen) wurdeGeprüft inverse Prüfungen::Prüfling;
};
Erkläre die drei Klassen zur Modellierung des Verhaltens:
- Beobachter: (z.b. Volumenberechnung)
- oft auch Funktionen genannt
- Erfragen “Objektzustand”
- Keine Objektändernden Effekte
- Mutatoren (Verändert das Objekt - z.b. Rotate / permantent)
- Änderung des Zustands
- Objekttyp mit mindestens einem Mutator = mutierbar
- Objekttyp ohne Mutator = immutable
- Konstruktoren / Destruktoren
- Verwendet um neue Objekte zu erzeugen oder zu zerstören
- Destruktor eine Art von Mutator
Wie sieht die Klassendefinition in ODL aus?
- den Namen der Operation;
- die Anzahl und die Typen der Parameter; ! den Typ des Rückgabewerts der Operation;
- eine eventuell durch die Operationsausführung ausgelöste Ausnahmebehandlung (engl. exception handling).
class Professoren {
//exception handling
exception hatNochNichtGeprüft {};
exception schonHöchsteStufe {};
…
//observer float wieHartAlsPrüfer() raises (hatNochNichtGeprüft);
//mutator
void befördert() raises (schonHöchsteStufe);
};
Aufruf der Operation: meinLieblingsProf→befördert()