Βάσεις Δεδομένων II Περίληψη: Αντικειμενοστρεφείς Βάσεις Δεδομένων Πάνος Βασιλειάδης Νοέμβρης
2 Περιεχόμενα Βασικές έννοιες αντικειμενοστρεφούς μοντέλου Ταυτότητα αντικειμένου Ενθυλάκωση Τύποι και Κλάσεις Collection Types – Σύνθετα Αντικείμενα Κληρονομικότητα Ορισμοί και παραδείγματα Λειτουργίες & Περιορισμοί ODMG-93
3 Αντικειμενοστρεφής Προγραμματισμός – Object Oriented Programming (OOP) «μοντελοποίηση του λογισμικού και κάποιες αρχές ανάπτυξης που διευκολύνουν την κατασκευή σύνθετων συστημάτων από ξεχωριστά συστατικά» Η βασική ιδέα πίσω από τον OOP: οι οντότητες προσδιορίζονται από τις λειτουργίες τους!
4 Αντικείμενα Αντικείμενο είναι μια ξεχωριστή οντότητα, που προσπαθεί να μοντελοποιήσει και να προσεγγίσει όσον το δυνατό καλύτερα, το φυσικό κόσμο. Συγκριτικά, ότι και μια εγγραφή (πλειάδα) στο σχεσιακό μοντέλο
5 Αντικείμενα Αντικείμενο συμπεριφορά Η συμπεριφορά καθορίζεται από τη διαπροσωπεία (interface) του αντικειμένου, ήτοι, από ένα σύνολο λειτουργιών τις οποίες το αντικείμενο μπορεί να επιτελέσει Η συμπεριφορά καθορίζεται ακόμα, και από τις συγκεκριμένες τιμές που έχουν τα χαρακτηριστικά του αντικειμένου. Το διάνυσμα αυτών των τιμών είναι η τιμή του αντικειμένου
6 Αντικείμενα Τα χαρακτηριστικά των αντικειμένων ονομάζονται instance variables (ελληνιστί, πεδία, χαρακτηριστικά, μεταβλητές,...). Η υλοποίηση μιας λειτουργίας της διαπροσωπείας ενός αντικειμένου ονομάζεται μέθοδος (το αντίστοιχο των συναρτήσεων). Η κλήση μιας λειτουργίας ενός αντικειμένου, ονομάζεται αποστολή μηνύματος στο αντικείμενο
7 OID – Object Identity Ταυτότητα Αντικειμένου: προσδιορίζει ένα αντικείμενο μονοσήμαντα στην ΒΔ Δεν αλλάζει ποτέ – συνυπάρχει με το αντικείμενο για όλη τη διάρκεια ζωής του αντικειμένου (object’s lifetime) Απονέμεται από το σύστημα και είναι κρυμμένο από το χρήστη Πιο προφανής χρήση: υλοποίηση αναφορών (μοίρασμα και ενημερώσεις αντικειμένων)
8 Ενθυλάκωση (Encapsulation) object = interface part + implementation part Τμήμα Διαπροσωπείας = ο ορισμός των λειτουργιών που μπορεί να επιτελέσει το αντικείμενο (πρβλ., υπογραφή συναρτήσεων) Τμήμα Υλοποίησης = η αναπαράσταση του αντικειμένου (όπως π.χ., σε ένα struct στη C) + η υλοποίηση των λειτουργιών (π.χ., ο κώδικας μιας συνάρτησης), ήτοι, implementation part = (data part + procedural part)
9 Ενθυλάκωση (Encapsulation) Ενσωματώνει, εκτός από δεδομένα, και λειτουργίες στα αντικείμενα Αποκρύπτει τον τρόπο υλοποίησης των μεθόδων, οπότε, απεξαρτά τη διαχείριση του αντικειμένου από τη δομή του, Επιβάλει τη διαχείριση του κάθε αντικειμένου, αυστηρά και μόνο από τις δικές του μεθόδους*, μέσω των αντίστοιχων μηνυμάτων. * Πολλές φορές θα δείτε τον όρο «μέθοδος» να χαρακτηρίζει το interface part …
10 Τύποι και Κλάσεις Αντιστοιχούν σε αφηρημένους τύπους δεδομένων (abstract data types) Ομαδοποιούν αντικείμενα με ίδιες σημασιολογικές ιδιότητες Αποτελούνται από interface part και implementation part Χτίζονται πάνω σε τύπους Έχουν τιμές (values) ως στιγμιότυπα Έχουν αντικείμενα ως στιγμιότυπα
11 Τύποι και Κλάσεις add class Monument type tuple(name: string, address: Address, description: string, closing_days: list(string), admission_fee: integer) add method increase_fee(amount: integer) in class Monument
12 Collection Types Σύνολα (Sets) αντικειμένων Πολυσύνολα (Bags) αντικειμένων = σύνολα με διπλοεγγραφές Λίστες (Lists) αντικειμένων = διατεταγμένα πολυσύνολα Πίνακες (Arrays) αντικειμένων = λίστες πεπερασμένου μεγέθους Πλειάδες (Tuples) αντικειμένων = παράθεση αντικειμένων, με συγκεκριμένο τρόπο
13 Σύνθετα Αντικείμενα OID: OID12 Name: Πέτρος Age: 40 Children: {OID15} OID: OID15 Name: Γιάννης Age: 15 Children: {} OID: OID10 Name: Μαμά Καγκουρό Age: 4 Children: { [OID: OID15 Name: Μωρό Κ. Age: 0.5 Children: {}] }
14 Ιεραρχίες Τύπων και Κλάσεων Κληρονομικότητα (Inheritance): Κατασκευάζουμε ένα δέντρο (ιεραρχία) κλάσεων. Κάθε κλάση που είναι κόμβος του δέντρου «κληρονομεί», από την πατρική της κλάση όλα τα δομικά και λειτουργικά χαρακτηριστικά της -τις instance variables και τις μεθόδους, δηλαδή. Στα χαρακτηριστικά αυτά, κάθε κλάση νομιμοποιείται να προσθέσει τα δικά της χαρακτηριστικά και λειτουργίες. Οι ιεραρχίες αφορούν και τύπους και κλάσεις
15 Ιεραρχίες Τύπων και Κλάσεων Vehicle - Name - Weight - Color + GetName() + GetWeight + GetColor() FourWheels - MaxVelocity +GetMaxVelocity() Bike - NumSpeeds +GetNumSpeeds() Van - MaxCargo +GetMaxCargo() Car - NumDoors +GetNumDoors()
16 Υπερφόρτωση και πολυμορφισμός Vehicle - Name - Weight - Color + GetName() + GetWeight + GetColor() FourWheels - MaxVelocity +GetMaxVelocity() Bike - NumSpeeds +GetNumSpeeds() Van - MaxCargo +GetMaxCargo() +GetWeight() Car - NumDoors +GetNumDoors()
17 Τυπικός ορισμός αντικειμένου Αντικείμενο = [OID, τιμή, κατάσταση, κλάση] OID = μοναδικός προσδιοριστής Τιμή = διάνυσμα τιμών των instance variables + τιμές επιστροφής των μεθόδων (public) Κατάσταση = διάνυσμα τιμών των instance variables βάσει του τύπου στον οποίο δομείται το αντικείμενο (private) Κλάση = η κλάση στην οποία ανήκει το αντικείμενο
18 Τυπικός ορισμός κλάσης όνομα κλάσης, τύπος της τιμής των στιγμιοτύπων, τύπος της κατάστασης των στιγμιοτύπων, {μηνύματα στιγμιοτύπων}, {μέθοδοι στιγμιοτύπων}, τιμή της κλάσης, κατάσταση της κλάσης, {μηνύματα της κλάσης}, {μέθοδοι της κλάσης} τύπος της τιμής της κλάσης, τύπος της κατάστασης της κλάσης Η κλάση είναι μια συλλογή στιγμιοτύπων αλλά είναι κι η ίδια ένα αντικείμενο οπότε ανήκει κι αυτή σε μια μετα-κλάση
19 Από το σύστημα O 2 add class City with extension type tuple(name: string, map: Bitmap, hotels: set(Hotel)) add class Monument type tuple(name: string, address: Address, description: string, closing_days: list(string), admission_fee: integer)
20 Από το σύστημα O 2 add class Address type tuple(street: string, city: City) add class Hotel type tuple(name: string, address: Address, facilities: list(string), stars: integer, rate: float)
21 Από το σύστημα O 2 add name Eiffel_tower: Monument, ή ισοδύναμα Eiffel_tower = new(Monument) add method increase_fee(amount: integer) in class Monument is private add class Historical_hotel inherits Monument, Hotel add method print_height(amount: float) in object Eiffel_tower
22 ODMG - 93 Το Object Database Management Group (ODMG) είναι μια επιτροπή που, στις αρχές της δεκαετίας του 1990, πρότεινε ένα κοινό interface (ODMG ‑ 93) στους διάφορους κατασκευαστές αντικειμενοστρεφών συστημάτων βάσεων δεδομένων Σήμερα: version 3.0 του στάνταρτ
23 Βασικά κομμάτια του ODMG - 93 Μοντέλο Αντικειμένων (Object Model) Γλώσσα Ορισμού Αντικειμένων (Object Definition Language - ODL) Object Query Language - OQL C++ Language Binding Smalltalk Language Binding
24 Object Definition Language, ODL interface Person ( extent people ) { attribute String name; attribute Struct Address { Unsigned Short number, String Street, String city_name} address; relationship Person spouse inverse Person::spouse; relationship Set children inverse Person::parents {order by birth_date } relationship List parents inverse Person::children; void birth (in String name); Boolean marriage (in String person_name) raises (no_such_person); Unsigned Short ancestors (out Set all_ancestors) raises (no_such_person); void move (in String new_address); };
25 Object Query Language - OQL select department, avg_salary: avg(select e.salary from partition x) from Employees e group by department: e.department having count(select * from partition x) > 5 order by department.name Το clause group by χωρίζει τους υπαλλήλους σε ομάδες (partitions). Κάθε ομάδα χαρακτηρίζεται από το γεγονός ότι όλοι οι υπάλληλοι δουλεύουν στο ίδιο τμήμα και ονομάζεται partition (που είναι δεσμευμένη λέξη στην OQL). Το clause having περιορίζει τα τμήματα σ’ αυτά που έχουν αριθμό υπαλλήλων πάνω από 5. Η συντόμευση * διατηρείται και στην OQL (όπως και στην SQL) Το order by λειτουργεί όπως και στην SQL Αποτέλεσμα: set
26 C++ Language Binding class City : public Persistent_Object { public: int city_code; String name; Ref >> population; City(int, const char*); //Extension static Ref >> cities; };
27 Smalltalk Binding Object subclass: #City instanceVariableNames: 'cityCode name population' classVariableNames: 'Cities' poolDictionaries: '' "attributes" cityCode "return the cityCode" ^cityCode cityCode: aCityCode "set the cityCode" ^cityCode := aCityCode