Relationen-Algebra und Persistenz Teil I Implementierungskonzepte und Anforderungen an Attributdatentypen LG Datenbanksysteme für neue Anwendungen
Inhalt FLOBs DBArrays Attributsdatentypen Folie 2
Bisher: Folie 3
Bisher: Ich kann bereits einfache Daten fester Größe verwalten. Folie 4
Bisher: Ich kann bereits einfache Daten fester Größe verwalten. Folie 5 Mein Datentyp verwaltet aber große Datenmengen.
Bisher: Ich kann bereits einfache Daten fester Größe verwalten. Folie 6 Mein Datentyp verwaltet aber große Datenmengen. Mein Datentyp hat eine veränderliche Größe!
Bisher: Ich kann bereits einfache Daten fester Größe verwalten. Mein Datentyp verwaltet aber große Datenmengen. Mein Datentyp hat eine veränderliche Größe! Beispiele: Bilder, Videos, Webseiten Folie 7
Bisher: Ich kann bereits einfache Daten fester Größe verwalten. Mein Datentyp verwaltet aber große Datenmengen. Mein Datentyp hat eine veränderliche Größe! Beispiele: Bilder, Videos, Webseiten Wie speichere ich solche Daten persistent und effizient? Folie 8
FLOB Bisher: Ich kann bereits einfache Daten fester Größe verwalten. Mein Datentyp verwaltet aber große Datenmengen. Mein Datentyp hat eine veränderliche Größe! Beispiele: Bilder, Videos, Webseiten Wie speichere ich solche Daten persistent und effizient? Folie 9
FLOB Bisher: Ich kann bereits einfache Daten fester Größe verwalten. Mein Datentyp verwaltet aber große Datenmengen. Mein Datentyp hat eine veränderliche Größe! Beispiele: Bilder, Videos, Webseiten Wie speichere ich solche Daten persistent und effizient? Folie 10 FLOB = Faked Large OBject
FLOB Folie 11
FLOB Folie 12 Datenstruktur zur Speicherung beliebiger Datenmengen
FLOB Folie 13 Datenstruktur zur Speicherung beliebiger Datenmengen Aber: Das Objekt muss insgesamt im Hauptspeicher darstellbar sein!
FLOB Folie 14 Datenstruktur zur Speicherung beliebiger Datenmengen Eingebauter Persistenzmechanismus
FLOB Folie 15 Datenstruktur zur Speicherung beliebiger Datenmengen Eingebauter Persistenzmechanismus Verwaltet unstrukturierte Speicherblöcke (wie malloc)
FLOB Folie 16 Datenstruktur zur Speicherung beliebiger Datenmengen Eingebauter Persistenzmechanismus Verwaltet unstrukturierte Speicherblöcke (wie malloc) Zugriff mittels spezieller Funktionen und eines offsets
FLOB Folie 17 Datenstruktur zur Speicherung beliebiger Datenmengen Eingebauter Persistenzmechanismus Verwaltet unstrukturierte Speicherblöcke (wie malloc) Zugriff mittels spezieller Funktionen und eines offsets
FLOB Datenstruktur zur Speicherung beliebiger Datenmengen Eingebauter Persistenzmechanismus Verwaltet unstrukturierte Speicherblöcke (wie malloc) Zugriff mittels spezieller Funktionen und eines offsets class FLOB { FLOB( size_t size ); size_t Size() const; void Put( size_t offset, size_t length, const void *source ); void Get( size_t offset, const char **target, const bool paged = false ) const; void Resize( size_t size ); void Clean(); void Destroy(); } Folie 18
FLOB Datenstruktur zur Speicherung beliebiger Datenmengen Achtung! Eingebauter Persistenzmechanismus FLOBs werden direkt en bloc auf die Platte geschrieben. Verwaltet Speicherblöcke (wie Flobs werden unstrukturierte an irgendeine Stelle in den Speicher eingelesen. malloc) Verwenden Sie keine Zeiger in FLOBs, sondern offsets! Zugriff mittels spezieller Funktionen und eines offsets class FLOB { FLOB( size_t size ); size_t Size() const; void Put( size_t offset, size_t length, const void *source ); void Get( size_t offset, const char **target, const bool paged = false ) const; void Resize( size_t size ); void Clean(); void Destroy(); } Folie 19
FLOB Problem gelöst! Folie 20
FLOB Problem gelöst? Folie 21
FLOB Problem gelöst? FLOBs sind mir zu unstrukturiert. Folie 22
FLOB Problem gelöst? FLOBs sind mir zu unstrukturiert. Ich bräuchte aber eher etwas, um strukturierte Daten persistent speichern zu können. Folie 23
FLOB Problem gelöst? FLOBs sind mir zu unstrukturiert. Ich bräuchte aber eher etwas, um strukturierte Daten persistent speichern zu können. Ich will variabel viele Einträge fester Größe verwalten. Folie 24
FLOB Problem gelöst? FLOBs sind mir zu unstrukturiert. Ich bräuchte aber eher etwas, um strukturierte Daten persistent speichern zu können. Ich will variabel viele Einträge fester Größe verwalten. Eigentlich hätte ich gerne ein dynamisches array. Folie 25
FLOB Problem gelöst? FLOBs sind mir zu unstrukturiert. Ich bräuchte aber eher etwas, um strukturierte Daten persistent speichern zu können. Ich will variabel viele Einträge fester Größe verwalten. Eigentlich hätte ich gerne ein dynamisches array.??? Folie 26
DBArray Problem gelöst? FLOBs sind mir zu unstrukturiert. Ich bräuchte aber eher etwas, um strukturierte Daten persistent speichern zu können. Ich will variabel viele Einträge fester Größe verwalten. Eigentlich hätte ich gerne ein dynamisches array. Folie 27
DBArray Container für kompakte Datentypen fester Länge. Folie 28
DBArray Container für kompakte Datentypen fester Länge. Elementtyp muss einfach sein: Keine echten Zeiger! Keine FLOBs oder DBArrays als Elemente! Folie 29
DBArray Container für kompakte Datentypen fester Länge. Elementtyp muss einfach sein: Keine echten Zeiger! Keine FLOBs oder DBArrays als Elemente! DBArray ist eine Template-Klasse, die von FLOB abgeleitet ist. Ein- und Auslagerung von Datenteilen muss daher (wie beim FLOB) nicht selbst programmiert werden! Folie 30
DBArray Container für kompakte Datentypen fester Länge. Elementtyp muss einfach sein: Keine echten Zeiger! Keine FLOBs oder DBArrays als Elemente! DBArray ist eine Template-Klasse, die von FLOB abgeleitet ist. Ein- und Auslagerung von Datenteilen muss daher (wie beim FLOB) nicht selbst programmiert werden! Wird ein DBArray sortiert abgespeichert, so ist eine effiziente externe binäre Suche möglich. Folie 31
DBArray template<class DBArrayElement> class DBArray : public FLOB { DBArray( int n ); int Size() const; void Resize( const int newsize ); void Clear(); void Put( int index, const DBArrayElement& elem ); void Append( const DBArrayElement& elem ); void Get( int index, DBArrayElement const*& elem ) const; void TrimToSize(); void Sort( int (*cmp)( const void *a, const void *b) ); bool Find( const void *key, int (*cmp)( const void *a, const void *b), int& result ) const void Destroy(); [...] } Folie 32
Bisher: Einfache Datentypen. Was ging damit? Folie 33
Bisher: Einfache Datentypen. Was ging damit? Erzeugen von Objekten Anwenden von Operatoren Speichern in Datenbank, Löschen aus Datenbank Umwandlung von/zu Nested List Folie 34
Bisher: Einfache Datentypen. Was ging damit? Erzeugen von Objekten Anwenden von Operatoren Speichern in Datenbank, Löschen aus Datenbank Umwandlung von/zu Nested List Was fehlt bislang? Folie 35
Bisher: Einfache Datentypen. Was ging damit? Erzeugen von Objekten Anwenden von Operatoren Speichern in Datenbank, Löschen aus Datenbank Umwandlung von/zu Nested List Was fehlt bislang? Verwendung als Attribut in Relationen Folie 36
Attributdatentypen Bisher: Einfache Datentypen. Was ging damit? Erzeugen von Objekten Anwenden von Operatoren Speichern in Datenbank, Löschen aus Datenbank Umwandlung von/zu Nested List Was fehlt bislang? Verwendung als Attribut in Relationen Folie 37
Attributdatentypen Können in Relationen als Attribute verwendet werden. Attributdatentyp: Oberklasse Attribute, Kind DATA. Erfordernisse: Folie 38
Attributdatentypen Können in Relationen als Attribute verwendet werden. Attributdatentyp: Oberklasse Attribute, Kind DATA. Erfordernisse: Sicherstellen einer Mindest-Funktionalität (Compare, IsDefined, SetDefined, Adjacent, Print,...) Folie 39
Attributdatentypen Können in Relationen als Attribute verwendet werden. Attributdatentyp: Oberklasse Attribute, Kind DATA. Erfordernisse: Sicherstellen einer Mindest-Funktionalität (Compare, IsDefined, SetDefined, Adjacent, Print,...) Support für den automatischen Persistenzmechanismus von Tupeln (C++ kennt keine Serialisierung!) (NumOfFLOBs, GetFLOB, SizeOf, Open, Save) Folie 40
Attributdatentypen Können in Relationen als Attribute verwendet werden. Attributdatentyp: Oberklasse Attribute, Kind DATA. Erfordernisse: Sicherstellen einer Mindest-Funktionalität (Compare, IsDefined, SetDefined, Adjacent, Print,...) Support für den automatischen Persistenzmechanismus von Tupeln (C++ kennt keine Serialisierung!) (NumOfFLOBs, GetFLOB, SizeOf, Open, Save) Verwenden keine dynamischen Objekte/Zeiger! Folie 41
Attributdatentypen Können in Relationen als Attribute verwendet werden. Attributdatentyp: Oberklasse Attribute, Kind DATA. Erfordernisse: Beispiel Sicherstellen einer Mindest-Funktionalität (Compare, IsDefined, SetDefined, Adjacent, Print,...) DerSupport Datentyp aus der Polygon Algebra stellt fürpolygon den automatischen Persistenzmechanismus einen dar, der vondatentyp Tupeln (C++ kennt keine Serialisierung!) als Attribut in Relationen verwendet werden kann und (NumOfFLOBs, GetFLOB, SizeOf, Open, Save) den Speicherverwaltungstyp DBArray verwendet: Verwenden keine dynamischen Objekte/Zeiger Folie 42
Attributdatentyp: Polygon class Polygon : public Attribute { public: Polygon() {} Polygon( const int n, const int *X = 0, const int *Y = 0 ); ~Polygon(); int NumOfFLOBs() const; FLOB *GetFLOB(const int i); int Compare(const Attribute*) const; [...] private: DBArray<Vertex> vertices; PolygonState state; }; Folie 43
Attributdatentyp: Polygon class Polygon : public Attribute { public: Polygon() {} Polygon( const int n, const int *X = 0, const int *Y = 0 ); ~Polygon(); int NumOfFLOBs() const; FLOB *GetFLOB(const int i); int Compare(const Attribute*) const; [...] private: Klasse Polygon DBArray<Vertex> vertices; wird von Klasse PolygonState state; Attribute abgeleitet }; Folie 44
Attributdatentyp: Polygon class Polygon : public Attribute { public: Polygon() {} Polygon( const int n, Wichtig: const int *X = 0, Bei Mehrfachvererbung darf keine Klasse mehrfach const int *Y = 0 ); von ~Polygon(); derselben Klasse (z.b. Attribute) erben. Sonst: Probleme bei der Typkonvertierung (cast). int NumOfFLOBs() const; FLOB *GetFLOB(const int i); int Compare(const Attribute*) const; [...] private: Klasse Polygon DBArray<Vertex> vertices; wird von Klasse PolygonState state; Attribute abgeleitet }; Folie 45
Attributdatentyp: Polygon class Polygon : public Attribute { public: Polygon() {} Polygon( const int n, const int *X = 0, const int *Y = 0 ); ~Polygon(); int NumOfFLOBs() const; FLOB *GetFLOB(const int i); int Compare(const Attribute*) const; [...] private: DBArray<Vertex> vertices; PolygonState state; }; Folie 46
Attributdatentyp: Polygon class Polygon : public Attribute { public: Polygon() {} Polygon( const int n, const int *X = 0, const int *Y = 0 ); ~Polygon(); int NumOfFLOBs() const; FLOB *GetFLOB(const int i); int Compare(const Attribute*) const; [...] Standard-Konstruktor private: DBArray<Vertex> vertices; Wird vom Persistenzmechanismus verwendet. PolygonState state; Darf das Objekt nicht verändern. }; Folie 47
Attributdatentyp: Polygon class Polygon : public Attribute { public: Polygon() {} Polygon( const int n, Wichtig: const int *X = 0, int *Y = 0 ); Vermeiden Sie die Nutzung desconst Standard-Konstruktors. ~Polygon(); Diese führt häufig wegen uninitialisierter Werte zu Fehlern. Initialisieren Sie Objekte mittels anderer Konstruktoren. int NumOfFLOBs() const; FLOB *GetFLOB(const int i); int Compare(const Attribute*) const; [...] Standard-Konstruktor private: DBArray<Vertex> vertices; Wird vom Persistenzmechanismus verwendet. PolygonState state; Darf das Objekt nicht verändern. }; Folie 48
Attributdatentyp: Polygon class Polygon : public Attribute { public: Polygon() {} Polygon( const int n, const int *X = 0, const int *Y = 0 ); ~Polygon(); int NumOfFLOBs() const; FLOB *GetFLOB(const int i); int Compare(const Attribute*) const; [...] private: DBArray<Vertex> vertices; PolygonState state; }; Folie 49
Attributdatentyp: Polygon class Polygon : public Attribute { public: Polygon() {} Polygon( const int n, const int *X = 0, const int *Y = 0 ); ~Polygon(); int NumOfFLOBs() const; FLOB *GetFLOB(const int i); int Compare(const Attribute*) const; [...] private: Einziges DBArray<Vertex> vertices; FLOB-Objekt PolygonState state; in Polygon }; Folie 50
Attributdatentyp: Polygon class Polygon : public Attribute { public: Polygon() {} Polygon( const int n, const int *X = 0, const int *Y = 0 ); ~Polygon(); int NumOfFLOBs() const; FLOB *GetFLOB(const int i); int Compare(const Attribute*) const; [...] private: DBArray<Vertex> vertices; PolygonState state; }; Folie 51
Attributdatentyp: Polygon Anzahl der FLOBs zurückgeben: int class Polygon : public Attribute Polygon::NumOfFLOBs() const { { public: return 1; Polygon() {} } Polygon( const int n, const int *X = 0, const int *Y = 0 ); ~Polygon(); int NumOfFLOBs() const; FLOB *GetFLOB(const int i); int Compare(const Attribute*) const; [...] private: DBArray<Vertex> vertices; PolygonState state; }; Folie 52
Attributdatentyp: Polygon class Polygon : public Attribute { public: Polygon() {} Polygon( const int n, const int *X = 0, const int *Y = 0 ); ~Polygon(); int NumOfFLOBs() const; FLOB *GetFLOB(const int i); int Compare(const Attribute*) const; [...] private: DBArray<Vertex> vertices; PolygonState state; }; Folie 53
Attributdatentyp: Polygon Den i-ten FLOB zurückgeben: FLOB *Polygon::GetFLOB(const int i) class Polygon : public Attribute { { assert( i >= 0 && public: i < NumOfFLOBs() ); Polygon() {} return &vertices; Polygon( const int n, const int *X = 0, } const int *Y = 0 ); ~Polygon(); int NumOfFLOBs() const; FLOB *GetFLOB(const int i); int Compare(const Attribute*) const; [...] private: DBArray<Vertex> vertices; PolygonState state; }; Folie 54
Attributdatentyp: Polygon class Polygon : public Attribute { public: Polygon() {} Polygon( const int n, const int *X = 0, const int *Y = 0 ); ~Polygon(); int NumOfFLOBs() const; FLOB *GetFLOB(const int i); int Compare(const Attribute*) const; [...] private: DBArray<Vertex> vertices; PolygonState state; }; Folie 55
Attributdatentyp: Polygon int Compare(const Attribute* rhs) const; Falls beide Objekte definiert: class Polygon : public Attribute *this < *rhs -1 { *this = *rhs 0 public: Polygon() {} *this > *rhs 1 Polygon( const int n, const int *X = 0, Sonst: const int *Y *this = 0 ); < *rhs undef x def -1: ~Polygon(); undef x undef 0: *this = *rhs defconst; x undef 1: *this > *rhs int NumOfFLOBs() FLOB *GetFLOB(const int i); int Compare(const Attribute*) const; [...] private: DBArray<Vertex> vertices; PolygonState state; }; Folie 56
Attributdatentyp: Polygon class Polygon : public Attribute { public: Polygon() {} Polygon( const int n, const int *X = 0, const int *Y = 0 ); ~Polygon(); int NumOfFLOBs() const; FLOB *GetFLOB(const int i); int Compare(const Attribute*) const; [...] private: DBArray<Vertex> vertices; PolygonState state; }; Folie 57
Attributdatentyp: Polygon Weitere zu überschreibende Funktionen: class Polygon : public Attribute { bool Adjacent(const Attribute*) const; Polygon *Clone() const; public: size_t Sizeof() const; Polygon() {} Polygon( const int n, const int *X = 0, Eigentlich const int *Y bereits = 0 );ererbte Funktionen: ~Polygon(); int NumOfFLOBs() const;bool IsDefined() const; FLOB *GetFLOB(const intvoid i);setdefined( bool defined int Compare(const Attribute*) const; [...] private: DBArray<Vertex> vertices; PolygonState state; ); }; Folie 58
Attributdatentyp: Polygon class Polygon : public Attribute { public: Polygon() {} Polygon( const int n, const int *X = 0, Wichtig: const int *Y = 0 ); Überschreibt man diese Funktionen nicht, z.b. weil man ~Polygon(); sich im Namen mit Groß- oder Kleinschreibung vertan hat, führt dies int NumOfFLOBs() const; mitunter zu Speicherfehlern! FLOB *GetFLOB(const int i); int Compare(const Attribute*) const; [...] private: DBArray<Vertex> vertices; PolygonState state; }; Folie 59
Noch Fragen?! Folie 60