Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Objektrelationale Datenbanken (am Beispiel Oracle)

Ähnliche Präsentationen


Präsentation zum Thema: "Objektrelationale Datenbanken (am Beispiel Oracle)"—  Präsentation transkript:

1 Objektrelationale Datenbanken (am Beispiel Oracle)

2 © Prof. T. Kudraß, HTWK Leipzig Objektorientierte Konzepte Objekt Objekt – Einheit von Struktur und Verhalten – Struktur: Attribute / Verhalten: Methoden – Zustand eines Objekts: Attributwerte – Methoden: Lesen und Ändern des Zustands – Kommunikation mit anderen Objekten über Methoden – persistent vs. transient – Identität unabhängig von Zustand – Gehört zu einem Objekttyp

3 © Prof. T. Kudraß, HTWK Leipzig Objekttyp Einführendes Beispiel –Ist ein benutzerdefinierter zusammengesetzter Datentyp –Kapselt eine Datenstruktur zusammen mit den benötigten Methoden zur Manipulation Attribut Methode order_nocust_infoline_itemsamount Hold CheckStatus Cancel Ship Bestellung

4 © Prof. T. Kudraß, HTWK Leipzig Objektorientierte Konzepte Methoden Methode – Funktion, die auf einem Objekt aufgerufen wird – Implementiert beliebigen Code – Bestandteile: Signatur (Deklaration): Name und Parameter Rumpf: Implementierung der Funktionalität Konstruktur & Destruktor – Besondere Methoden zum Erzeugen und Vernichten von Objekten Arten vom Methoden – lesende – ändern – statische (Klassenmethoden)

5 © Prof. T. Kudraß, HTWK Leipzig Struktur eines Objekttyps Methodenrümpfe Public Interface Private Implementation Attributdeklarationen Methodenspezifikationen Spezifikation Rumpf

6 © Prof. T. Kudraß, HTWK Leipzig Objektorientierte Konzepte Kapselung Kapselung – Zustand nur über öffentliche (public) Methoden abfragbar – Nicht öffentliche Methoden und Attribute nur objektintern zugänglich Strikte Kapselung – Zugang nur über get- und set-Methoden (für ein bestimmtes Attribut) – automatische Generierung der Zugriffsmethoden

7 © Prof. T. Kudraß, HTWK Leipzig Objektorientierte Konzepte Objektidentität OID – Identifizierendes künstliches Merkmal eines Objekts – Systemdefinierter Identifikator (Surrogat) – vor Anwender verborgen – Ohne Semantik! (anders als Primärschlüssel) – Unveränderlich während Lebenszeit des Objekts – Referenztypen und Methoden zur Arbeit mit OIDs durch System angeboten Typen von Gleichheit – identisch (OIDs gleich) – flach-gleich (alle Attribute gleich) – Tiefgleich (Gleichheit gilt auch für alle referenzierten Objekte) Kopieren: flach vs. tief

8 © Prof. T. Kudraß, HTWK Leipzig Objektorientierte Konzepte Klasse Definition – Menge von Objekten mit gleichen Attributen (Merkmalen) und Methoden (Verhalten) Zwei Sichtweisen – Intension: Beschreibung von Attributen und Methoden = Typ einer Klasse (bzw. Objekttyp) – Extension: Menge der aktuell existierenden Objekte (Instanzen) dieser Klasse Programmiersprachen: – Z.B. Java / C++: Klassenbegriff rein intensional – In Datenbanken: Extensionen persistent gespeichert

9 © Prof. T. Kudraß, HTWK Leipzig Objektorientierte Konzepte Spezialisierung Ziel: möglichst redundanzfreie Speicherung von Eigenschaften Klassen in Sub-/Superklassenbeziehungen (ISA-Beziehung) Intensional: Subklasse erbt Attribute und Methoden der Superklasse (Typvererbung) Extensional: Untermengenbeziehung zwischen Extensionen von Sub- und Superklasse

10 © Prof. T. Kudraß, HTWK Leipzig Objektorientierte Konzepte Spezialisierung (Forts.) Substituierbarkeit: Objekt überall dort einsetzbar wo auch Superklasse erlaubt ist Mehrfachspezialisierung: – mehrere Superklassen – Erfordert Konfliktauflösung beim Erben gleichnamiger Attribute oder Methoden Polymorphismus (Überladen) / spätes Binden (late binding) – Bei Aufruf einer Methode wird die Implementierung ausgewählt in Abhängigkeit vom aufgerufenen Objekttyp

11 © Prof. T. Kudraß, HTWK Leipzig Objektorientierung in Datenbanken Objektorientierte Datenbanksysteme – 1985 – 1995 – SQL-ähnliche Anfragesprache (OQL; Object Query Language) – Vertreter: O2, POET, ObjectStore, Versant, Objectivity, Ontos, Gemstone Relationale DBMS behielten Überlegenheit – Anfrageoptimierung – Transaktionsverwaltung – Zugriffskontrolle – SQL:1999: Standard mit vielen objektorientierten Erweiterungen Objektrelationale Mapping-Tools – Brückenschlag zwischen OO Programmiersprachen und RDBMS – Vertreter: EJB, JDO, OJB, Hibernate

12 © Prof. T. Kudraß, HTWK Leipzig Objektrelationale Konzepte im SQL-Standard Typkonstruktoren – geschachtelte Anwendung: beliebig komplexe Datentypen Benutzerdefinierte Datentypen – Distinct-Typen: Kopien eines Basisdatentyps unter eigenem Namen – Strukturierte Typen: Attribute und Methoden, Subtyp-Beziehung möglich Benutzerdefinierte Casts (Typumwandlungen) Benutzerdefinierte Ordnungen Typisierte Tabellen – Basieren auf strukturiertem Typ – Tabellenhierarchien (Subtabelle steht in Untermengenbeziehung zur Supertabelle) Typisierte Sichten – Basieren auf strukturiertem Typ (liefern typisierte Tabelle) – Sichtenhierarchien

13 © Prof. T. Kudraß, HTWK Leipzig Objektrelationale Konzepte in Oracle (Überblick) Definition von Objekttypen (CREATE TYPE) Objekttypen und Referenzen (REF) Methoden Collections (VARRAY & Nested Table) Typvererbung (UNDER) Polymorphismus (Overriding, Overloading) Funktionen und Prädikate für Objekte (REF, DEREF, TREAT, IS OF)

14 © Prof. T. Kudraß, HTWK Leipzig Spezifikation eines Objekttyps CREATE TYPE type_name AS OBJECT [(attribute1 datatype, attribute2 datatype,...] [MEMBER procedure1 | function1 spec, procedure2 | function2 spec,...)] CREATE TYPE type_name AS OBJECT [(attribute1 datatype, attribute2 datatype,...] [MEMBER procedure1 | function1 spec, procedure2 | function2 spec,...)] Syntax

15 © Prof. T. Kudraß, HTWK Leipzig Rumpf eines Objekttyps Syntax CREATE TYPE BODY type_name AS [MEMBER procedure1 | function1 body, procedure2 | function2 body,...] CREATE TYPE BODY type_name AS [MEMBER procedure1 | function1 body, procedure2 | function2 body,...]

16 © Prof. T. Kudraß, HTWK Leipzig Spezifikation eines Objekttyps (Beispiel) SQL> CREATE TYPE name_typ AS OBJECT( 2 f_name VARCHAR2(25), 3 l_name VARCHAR22(25), 4 initials varchar2(7), 5 MEMBER FUNCTION full_name return varchar2 6 PRAGMA RESTRICT_REFERENCES( full_name, 7 WNDS, WNPS, RNPS )); 1 2 Pragma: Zur Verhinderung von Seiteneffekten: WNDSWrite No Database State WNPS Write No Package State RNPS Read No Package State

17 © Prof. T. Kudraß, HTWK Leipzig Rumpf eines Objekttyps (Beispiel) SQL> CREATE TYPE BODY name_typ AS 2 MEMBER FUNCTION full_name RETURN VARCHAR2 3 IS 4 BEGIN 5 RETURN (l_name || ' ' || f_name ); 6 END full_name; 7 END; 1

18 © Prof. T. Kudraß, HTWK Leipzig Spezifikation eines komplexen Objekt-Typs SQL> CREATE TYPE BODY emp_typ AS 2 MEMBER FUNCTION get_name RETURN VARCHAR2 3 IS 4 BEGIN 5 RETURN (name.l_name ||' '|| name.f_name ); 6 END; 7 MEMBER PROCEDURE set_l_name (v_name VARCHAR2) 8 IS 9 BEGIN 10 name.l_name := v_name; 11 END; 12 END;

19 © Prof. T. Kudraß, HTWK Leipzig Aufruf von Objektmethoden SQL>CREATE TABLE name_table OF name_typ; SQL>INSERT INTO name_table 2 VALUES('Marilyn','Monroe','MM'); SQL>SELECT nt.f_name,nt.name_typ.full_name() 2 FROM name_table nt;

20 © Prof. T. Kudraß, HTWK Leipzig Objekttypen und Referenzen REF (Reference) – logischer Pointer" zu einem Row-Objekt (Datensatz) – Eingebauter (built-in) Datentyp a row object – Genutzt für Assoziationen zwischen Objekten (zusammen mit REF-Collections) – keine Foreign Keys nötig! – Erlaubt einfache Naviation durch Objekte (Punkt-Notation zum Verfolgen der Pointer) – keine Joins nötig! – Prüfen oder Ändern des referenzierten Objekts möglich – Lesen einer Kopie eines referenzierten Objekts – Ändern des REF-Wertes (Verweis auf anderes Objekt oder Null-Setzen) – dangling reference feststellbar (SCOPE-Klausel kontrolliert nicht referentielle Integrität)

21 © Prof. T. Kudraß, HTWK Leipzig REF (Referenztypkonstruktor) Beispiele CREATE TYPE person AS OBJECT ( name VARCHAR2(30), managerREF person ); Zugriff auf ein Objekt X des Typs PERSON x.manager.name; Zugriff auf eine Referenz DECLARE OrderRef REF to purchase_order; SELECT REF(po) INTO OrderRef FROM purchase_order_table po WHERE po.id = ;

22 © Prof. T. Kudraß, HTWK Leipzig Scoped REF Bei Definition eines REF-Typs Beschränkung der referenzierten Tabelle möglich (scoped REF) Vorteile: – Effizienterer Zugriff – Weniger Speicherverbrauch Beispiel: CREATE TABLE people ( idNUMBER(4), name_objname_objtyp, address_ref REF address_objtyp SCOPE is address_objtab, phones_ntab phone_ntabtyp) NESTED TABLE phones_ntab STORE AS phone_store_ntab2;

23 © Prof. T. Kudraß, HTWK Leipzig Methoden Member-Methoden zum Zugriff auf Objektinstanzen SELF: Objektinstanz der aufgerufenen Methode (SELF kann weggelassen werden) Methoden zum Vergleich von Objekten – Basisdatentypen: Ordnung vordefiniert – Benutzerdefinierte Typen: Basis zum Vergleichen und Ordnen von Objekten muss definiert werden 2 spezielle Typen von Methoden: MAP und ORDER

24 © Prof. T. Kudraß, HTWK Leipzig MAP Methode Beispiel Abbildung (mapping) von Objekt-Instanzen auf Basisdatentypen, Ordnen durch Aufruf MAP-Methode obj_1 > obj_2 obj1_map() > obj2.map() CREATE TYPE Rectangle_typ AS OBJECT( lenNUMBER, widNUMBER, MAP MEMBER FUNCTION area RETURN NUMBER,... ); CREATE TYPE BODY Rectangle_typ AS MAP MEMBER FUNCTION area RETURN NUMBER IS BEGIN RETURN len * wid; END area;... END;

25 © Prof. T. Kudraß, HTWK Leipzig Konstruktor-Methode SQL> CREATE TYPE tv_type AS OBJECT ( 2 tv_category VARCHAR2(20), 3 screen_size NUMBER(4)); DECLARE v_new_tv tv_type := tv_type('WEB tv', 32); v_alt_tv tv_type; BEGIN v_alt_tv := tv_type('Big Screen', 72); END; Hat den gleichen Namen wie der Typ, genutzt für die Initialisierung

26 © Prof. T. Kudraß, HTWK Leipzig Verwendung des Konstruktors BEGIN INSERT INTO person_tab VALUES(emp_typ(4567,'Christian','Bauwens',...)); END; BEGIN UPDATE person_tab p SET p = emp_typ(5678,'Charlie','Brown',...) WHERE p.l_name = 'Bauwens'; END;

27 © Prof. T. Kudraß, HTWK Leipzig Varray Geordnete Menge von Datenelementen des gleichen Datentyps mit variabler Anzahl (v) Index eines Elements = Positions-Nr. im Array Beispiel: CREATE TYPE prices AS VARRAY(10) OF NUMBER(12,2) Verwendung eines Varray: – Spaltentyp einer Tabelle (damit keine 1NF mehr) – Attribut eines Objekttyps – Typ einer PL/SQL Variablen, Parameter oder Rückgabewert einer Funktion

28 © Prof. T. Kudraß, HTWK Leipzig Nested Table Ungeordnete Menge von Datenelementen des gleichen Typs Hat nur eine Spalte (Basistyp oder benutzerdefiniert) Kann auch als Multi-Column-Table betrachtet werden, wenn Elementtyp OBJECT TYPE ist. Beispiel CREATE TYPE lineitem_table AS TABLE OF CREATE TABLE purchase_order_table of purchase_order NESTED TABLE lineitems STORE AS lineitems_table; Verwendung einer Nested Table analog zu Varray (siehe dort)

29 © Prof. T. Kudraß, HTWK Leipzig Multilevel-Collection-Types Schachtelung von Collection Types in mehreren Ebenen Beliebig komplexe Typen möglich Mehrfach geschachtelte Collection Types: – Nested Table of Nested Table Type – Nested Table of Varray Type – Varray of Nested Table Type – Varray of Varray Type – Nested Table oder Varray of a User-Defined Type mit Attribut vom Typ Nested Table oder Varray Type

30 © Prof. T. Kudraß, HTWK Leipzig Multilevel-Collection-Types (Beispiel) Anwendung Astronomie (Galaxis) – mehrere Sterne – zu jedem Stern gehören mehrere Planeten – zu jedem Planeten gehören mehrere Monde (Satelliten) Collection Type als: Nested Table of Nested Tables

31 © Prof. T. Kudraß, HTWK Leipzig Spezifikation eines komplexen Objekt-Typs CREATE TYPE satellite_t AS OBJECT ( name VARCHAR2(20), diameter NUMBER); CREATE TYPE nt_sat_t AS TABLE OF satellite_t; CREATE TYPE planet_t AS OBJECT ( name VARCHAR2(20), mass NUMBER, satellites nt_sat_t); CREATE TYPE nt_pl_t AS TABLE OF planet_t;

32 © Prof. T. Kudraß, HTWK Leipzig Storage-Tables für Nested Tables CREATE TABLE stars ( name VARCHAR2(20), age NUMBER, planets nt_pl_t) NESTED TABLE planets STORE AS planets_tab (NESTED TABLE satellites STORE AS satellites_tab); Storage-Table (STORE-Klausel) – zum Speichern der Zeilen einer Nested Table – Bei Mehrfachschachtelung auf jeder Ebene Bezugnahme auf innere Tabelle möglich (SATELLITES) weil Attribut vorhanden (anderenfalls: COLUMN VALUE Klausel) Weitere physikalische Attribute (Speicherungsoptionen) möglich

33 © Prof. T. Kudraß, HTWK Leipzig Entschachteln von Collection Queries (Beispiel) SELECT e.empname, e.projects FROM employees e; EMPNAME PROJECTS 'Bob' PROJECTS_LIST_NT(14, 23, 144) 'Daphne ' PROJECTS_LIST_NT(14, 35) Beispiel: Zugriff auf Projekte (Nested Table) eines Angestellten Entschachteln von Collections bei Queries (Unnest): – Umwandeln in Zeilen (Rows) – TABLE Expression – erlaubt die Verwendung einer Collection in FROM- Klausel – Entspricht einem Join zwischen Nested Table und der Zeile, die diese enthält

34 © Prof. T. Kudraß, HTWK Leipzig Anfragen auf Collections SELECT e.empname, p.* FROM employees e; TABLE(e.projects) p; EMPNAME PROJECTS 'Bob' 14 'Bob' 23 'Bob' 144 'Daphne ' 14 'Daphne ' 35 Beispiel: Zugriff auf Projekte (Nested Table) eines Angestellten

35 © Prof. T. Kudraß, HTWK Leipzig Anfragen auf Collections (Forts.) SELECT * FROM employee e, TABLE(e.projects; PROJECTS Beispiel: Zugriff auf Projekte (Nested Table) eines Angestellten (Variante ohne Angestelltennamen)

36 © Prof. T. Kudraß, HTWK Leipzig DML-Befehle auf Collections INSERT INTO TABLE(SELECT e.projects FROM employees e WHERE e.eno = 100) VALUES (1, 'Project Neptune'); UPDATE TABLE(SELECT e.projects FROM employees e WHERE e.eno = 100) p SET VALUE(p) = project_typ(1, 'Project Pluto') WHERE p.pno = 1; DELETE FROM TABLE(SELECT e.projects FROM employee e WHERE e.eno = 100) p WHERE p.pno = 1;

37 © Prof. T. Kudraß, HTWK Leipzig Typvererbung (Type Inheritcance) Spezialisierung eines Subtyps: – Hinzufügen neuer Attribute (keine Veränderung geerbter Attribute) – Hinzufügen neuer Methoden, die im Supertyp nicht vorhanden sind – Ändern der Implementierung einer geerbten Methode Beispiel Object Type: Shape Methode: calculate_area() 2 Subtypen: Rectangle_Shape Circular_Shape unterschiedl. Implementierungen von calculate_area()

38 © Prof. T. Kudraß, HTWK Leipzig FINAL vs. NOT FINAL Typen und Methoden CREATE TYPE Person_typ AS OBJECT ( ssn NUMBER, name VARCHAR2(30), address VARCHAR2(100)) NOT FINAL; ALTER TYPE Person_typ FINAL; CREATE TYPE T AS OBJECT (..., MEMBER PROCEDURE Print(), FINAL MEMBER FUNCTION foo(x NUMBER)... ) NOT FINAL; NOT FINAL: erlaube Subtypen Änderung der FINAL-Eigenschaft über ALTER TYPE FINAL / NOT FINAL auch auf Methoden anwendbar

39 © Prof. T. Kudraß, HTWK Leipzig Definition von Typhierarchien CREATE TYPE Student_typ UNDER Person_typ ( deptid NUMBER, major VARCHAR2(30)) NOT FINAL; CREATE TYPE Employee_typ UNDER Person_typ ( empid NUMBER, mgr VARCHAR2(30)); CREATE TYPE PartTimeStudent_typ UNDER Student_typ ( numhours NUMBER); Subtypen mittels CREATE TYPE und UNDER-Klausel Beispiele:

40 © Prof. T. Kudraß, HTWK Leipzig NOT INSTANTIABLE Typen und Methoden CREATE TYPE Address_typ AS OBJECT(...) NOT INSTANTIABLE NOT FINAL; CREATE TYPE USAddress_typ UNDER Address_typ(...); CREATE TYPE IntlAddress_typ UNDER Address_typ(...); CREATE TYPE T AS OBJECT ( x NUMBER, NOT INSTANTIABLE MEMBER FUNCTION func1() RETURN NUMBER ) NOT INSTANTIABLE NOT FINAL; NOT INSTANTIABLE: Keine Instanzen dieses Typs möglich (auch keine Konstruktor-Methode) Auch anwendbar auf Methoden ohne Implementierung (Platzhalter) zugehöriger Typ darf dann auch noch instanziierbar sein Beispiele:

41 © Prof. T. Kudraß, HTWK Leipzig Überladen von Methoden (Overloading) CREATE TYPE MyType_typ AS OBJECT (..., MEMBER PROCEDURE foo(x NUMBER),...) NOT FINAL; CREATE TYPE MySubType_typ UNDER MyType_typ (..., MEMBER PROCEDURE foo(x DATE), STATIC FUNCTION bar(...)......); Wenn Vielzahl von Varianten der Ausführung einer Methode Mehrere Methoden mit gleichem Namen in einem Typ Unterscheidung anhand der Signatur Signatur: Methodenname, Anzahl, Typen und Reihenfolge der Parameter Beispiel: unterschiedliche draw() -Methoden (z.B. Hinzufügen eines Text- Labels erfordert zusätzlichen Parameter)

42 © Prof. T. Kudraß, HTWK Leipzig Überschreiben von Methoden (Overriding) CREATE TYPE MyType_typ AS OBJECT (..., MEMBER PROCEDURE Print(), FINAL MEMBER FUNCTION foo(x NUMBER)... ) NOT FINAL; CREATE TYPE MySubType_typ UNDER MyType_typ (..., OVERRIDING MEMBER PROCEDURE Print(),...); Redefinition einer geerbten Methode im Subtyp, um dessen Spezifik zu berücksichtigen Beispiel: Methode calculate_area() (spezielle Formel bei kreisförmigen Formen gegenüber Rechtecken) Überschreibende Methode wird ausgeführt bei Zugriff auf Instanz des Subtyps Beim Overriding bleibt Signatur erhalten (anders als bei Overloading!)

43 © Prof. T. Kudraß, HTWK Leipzig Substituierbarkeit (Substitutability) Typen sind substituierbar – Supertyp substituierbar durch einen seiner Subtypen – Subtyp-Instanz ist zugleich auch Instanz des Supertyps Beispiele: – Lesen von Personen (liefert auch Instanzen der Subtypen Student, Employee) – Einschränkungen beim Arbeiten in Typhierarchien (z.B. nur Personen, die keine Studenten sind.. Substituierbarkeit anwendbar bei: – Attributen – Spalten – Zeilen (Rows) bei Object Tables oder Views – REF zu einem Objekttyp – Collection-Typen Substituierbarkeit kann ausgeschaltet werden

44 © Prof. T. Kudraß, HTWK Leipzig Beispiel: Beschränkung der Substituierbarkeit Beschränkung der Subtypen, die in Spalte/Attribut erlaubt sind, möglich mittels IS OF type - Constraint Beispiel: Erzeuge eine Tabelle vom Typ Book_Type, wobei die Autoren der Bücher ausschließlich Studenten sein dürfen CREATE TABLE Student_books OF Book_typ COLUMN author IS OF (ONLY Student_typ);

45 © Prof. T. Kudraß, HTWK Leipzig Funktionen und Prädikate für den Umgang mit Objekten VALUE : In: Tabellen-Alias für Object Table oder Object View Out: Objektinstanzen, die in Object Table oder View als Rows enthalten sind Beispiele: SELECT VALUE(p) FROM person_table p WHERE p.name = "John Smith"; SELECT VALUE(p) FROM ONLY(Person_v) p; UPDATE TABLE (SELECT e.projects FROM employees e WHERE e.eno = 100) p SET VALUE(p) = project_typ(1, 'Project Pluto') WHERE p.pno = 1;

46 © Prof. T. Kudraß, HTWK Leipzig Funktionen und Prädikate für den Umgang mit Objekten (2) REF : In: Tabellen-Alias für Object Table oder Object View Out: Referenz zu einer Instanz Beispiel: SELECT REF(p) FROM Person_v p WHERE p.id = 0001 ; DEREF : liefert die Objekt-Instanz, auf die eine REF verweist Beispiel: SELECT DEREF(REF(p)) FROM Person_v p;

47 © Prof. T. Kudraß, HTWK Leipzig Funktionen und Prädikate für den Umgang mit Objekten (3) TREAT: – zur Typanpassung (meist: Subtyp statt Supertyp) – z.B. Behandlung einer Person als Student Zwei Anwendungen – Bei Zuweisungen an Variablen spezialisierter Typen (Supertyp-Wert Subtyp) – Zugriff auf Attribute oder Methoden eines Subtyps des des deklarierten Typs von Zeile oder Spalte Beispiel: SELECT name, TREAT(VALUE(p) AS Student_typ).major major FROM persons p; NAME MAJOR Bob null Joe HISTORY Tim PHYSICS

48 © Prof. T. Kudraß, HTWK Leipzig IS OF type: – Prädikat zum Test, ob Objekt-Instanz zum jeweiligen Subtyp gehört Beispiele: SELECT VALUE(p) FROM persons p WHERE VALUE(p) IS OF (Student_typ); VALUE(p) Student_typ('Joe', 3456, 12, 10000) PartTimeStudent_typ('Tim', 5678, 13, 1000, 20) SELECT b.title title, b.author author FROM books b WHERE b.author IS OF (ONLY Student_typ); TITLE AUTHOR Business Rules Student_typ('Joe', 3456, 12, 10000) Funktionen und Prädikate für den Umgang mit Objekten (4)


Herunterladen ppt "Objektrelationale Datenbanken (am Beispiel Oracle)"

Ähnliche Präsentationen


Google-Anzeigen