Αντικειµενοστρεφείς Βάσεις εδοµένων Πάνος Βασιλειάδης pvassil@cs.uoi.gr Νοέµβρης 2002 www.cs.uoi.gr/~pvassil/courses/db_advanced/ Περιεχόµενα Βασικές έννοιες αντικειµενοστρεφούς µοντέλου Ταυτότητα αντικειµένου Ενθυλάκωση Τύποι και Κλάσεις Collection Types Σύνθετα Αντικείµενα Κληρονοµικότητα Ορισµοί και παραδείγµατα Λειτουργίες & Περιορισµοί ODMG-93 Μοντέλο Αντικειµένων Object Definition Language Object Query Language Language Bindings 2
Αντικειµενοστρεφής Προγραµµατισµός Object Oriented Programming (OOP) «µοντελοποίηση του λογισµικού και κάποιες αρχές ανάπτυξης που διευκολύνουν την κατασκευή σύνθετων συστηµάτων από ξεχωριστά συστατικά» Object-Oriented (ΟΟ) = αντικειµενοστρεφής, οντολογικός, προσανατολισµένος στα αντικείµενα ΟΧΙ αντικειµενοστραφής 3 Αντικειµενοστρεφής Προγραµµατισµός Η βασική ιδέα πίσω από τον OOP: οι οντότητες προσδιορίζονται από τις λειτουργίες τους! Ερώτηση: Ποια η βασική ιδέα πίσω από το µοντέλο οντοτήτων-συσχετίσεων, το σχεσιακό µοντέλο, τον δοµηµένο προγραµµατισµό...?? Οντότητες OOP = αντικείµενα 4
Αντικείµενα Αντικείµενο είναι µια ξεχωριστή οντότητα, που προσπαθεί να µοντελοποιήσει και να προσεγγίσει όσον το δυνατό καλύτερα, το φυσικό κόσµο. Συγκριτικά, ότι και µια εγγραφή (πλειάδα) στο σχεσιακό µοντέλο 5 Αντικείµενα Αντικείµενο συµπεριφορά Η συµπεριφορά καθορίζεται από τη διαπροσωπεία (interface) του αντικειµένου, ήτοι, από ένα σύνολο λειτουργιών τις οποίες το αντικείµενο µπορεί να επιτελέσει Η συµπεριφορά καθορίζεται ακόµα, και από τις συγκεκριµένες τιµές που έχουν τα χαρακτηριστικά του αντικειµένου. Το διάνυσµα αυτών των τιµών είναι η τιµή του αντικειµένου 6
Αντικείµενα Τα χαρακτηριστικά των αντικειµένων ονοµάζονται instance variables (ελληνιστί, πεδία, χαρακτηριστικά, µεταβλητές,...). Η υλοποίηση µιας λειτουργίας της διαπροσωπείας ενός αντικειµένου ονοµάζεται µέθοδος (το αντίστοιχο των συναρτήσεων). Η κλήση µιας λειτουργίας ενός αντικειµένου, ονοµάζεται αποστολή µηνύµατος στο αντικείµενο 7 Ένα µοντέλο Β που σέβεται τον εαυτό του διαθέτει... Οντότητες (που περιγράφουν τη δοµή των δεδοµένων) Λειτουργίες (που περιγράφουν πώς µπορούµε να επεξεργαστούµε τα δεδοµένα) Περιορισµούς ακεραιότητας (που εγγυώνται την αξιοπιστία των δεδοµένων και την καλή ποιότητα της δικής µας σχεδίασης) Εµείς θα επικεντρώσουµε στη δοµή του ΟΟ µοντέλου για Β δε σηµαίνει όµως ότι τα υπόλοιπα είναι δευτερεύοντα... 8
Για προχωρηµένους... Ο όρος «µοντέλο» είναι ατυχής. Ο κανονικός όρος είναι «µεταµοντέλο» (π.χ., µε βάση το σχεσιακό µεταµοντέλο, φτιάχνουµε τα δικά µας µοντέλα = τα σχήµατα των Β που υλοποιούµε κάθε φορά) Μια data base (κανονικά, γράφεται database) χωρίς περιορισµούς ακεραιότητας = data dump (αχούρι, σκουπιδότοπος) χωρίς λειτουργίες = data graveyard (νεκροταφείο) 9 οµή των αντικειµένων Ταυτότητα αντικειµένου Ενθυλάκωση Τύποι και Κλάσεις Σύνθετοι Τύποι Ιεραρχίες Κλάσεων Κληρονοµικότητα Πολυµορφισµός Late Binding 10
OID Object Identity Ταυτότητα Αντικειµένου: προσδιορίζει ένα αντικείµενο µονοσήµαντα στην Β εν αλλάζει ποτέ συνυπάρχει µε το αντικείµενο για όλη τη διάρκεια ζωής του αντικειµένου (object s lifetime) Απονέµεται από το σύστηµα και είναι κρυµµένο από το χρήστη Πιο προφανής χρήση: υλοποίηση αναφορών (µοίρασµα και ενηµερώσεις αντικειµένων) 11 OID Object Identifier OID: OID12 Name: Πέτρος Age: 40 Children: {OID15} OID: OID13 Name: Μαρία Age: 41 Children: {OID15} Ο Πέτρος και η Μαρία έχουν το ίδιο παιδί OID: OID15 Name: Γιάννης Age: 15 Children: {} OID: OID105 Name: Γιάννης Age: 105 Children: {} 12
Ενθυλάκωση (Encapsulation) OOP διάκριση µεταξύ καθορισµού και υλοποίησης µιας εφαρµογής, ήτοι,... Interface vs. Implementation object = interface part + implementation part 13 Ενθυλάκωση (Encapsulation) object = interface part + implementation part Τµήµα ιαπροσωπείας = ο ορισµός των λειτουργιών που µπορεί να επιτελέσει το αντικείµενο (πρβλ., υπογραφή συναρτήσεων) Τµήµα Υλοποίησης = η αναπαράσταση του αντικειµένου (όπως π.χ., σε ένα struct στη C) + η υλοποίηση των λειτουργιών (π.χ., ο κώδικας µιας συνάρτησης), ήτοι, implementation part = (data part + procedural part) 14
Ενθυλάκωση (Encapsulation) Σχεσιακό µοντέλο: αν είχαµε τον πίνακα CAR_FACTORY[NAME,CAPACITY,ADDRESS], η εφαρµογή RAISE_CAPACITY(PERCENTAGE) θα ήταν ένα εξωτερικό πρόγραµµα ΟΟ: CAR_FACTORY[NAME,CAPACITY,ADDRESS, RAISE_CAPACITY(PERCENTAGE)] 15 Ενθυλάκωση (Encapsulation) Interface Part: RAISE_CAPACITY(PERCENTAGE) Data Part: NAME,CAPACITY,ADDRESS Implementation Part: RAISE_CAPACITY(PERCENTAGE){ return CAPACITY * (1+ PERCENTAGE); } 16
Ενθυλάκωση (Encapsulation) Καµιά λειτουργία πέραν αυτών που καθορίστηκαν στο τµήµα διαπροσωπείας δεν µπορεί να εκτελεστεί! Για το προηγούµενο παράδειγµα, το ΜΟΝΟ που µπορώ να κάνω είναι να αυξήσω την παραγωγή. ΕΝ ΜΠΟΡΩ να ορίσω τιµή στο όνοµα, ή να ρωτήσω ποια είναι η δ/ση του εργοστασίου 17 Ενθυλάκωση (Encapsulation) Ενσωµατώνει, εκτός από δεδοµένα, και λειτουργίες στα αντικείµενα Αποκρύπτει τον τρόπο υλοποίησης των µεθόδων, οπότε, απεξαρτά τη διαχείριση του αντικειµένου από τη δοµή του, Επιβάλει τη διαχείριση του κάθε αντικειµένου, αυστηρά και µόνο από τις δικές του µεθόδους*, µέσω των αντίστοιχων µηνυµάτων. * Πολλές φορές θα δείτε τον όρο «µέθοδος» να χαρακτηρίζει το interface part 18
Ενθυλάκωση (Encapsulation) Από το µάθηµα Γλωσσών Προγραµµατισµού: θυµάστε τη διαφορά µεταξύ Private, Public, Protected πεδίων ; 19 Από C++ class Square{ private: int height, width; public: Square(int, int); ~Square(); int area(void); }; Square::Square(int ht, int wd) { height = ht; width = wd; } Square::~Square() { } int Square::area(){ return height*width; } 20
Τύποι και Κλάσεις Τύποι Αντιστοιχούν σε αφηρηµένους τύπους δεδοµένων (abstract data types), ήτοι, Αποτελούνται από interface part και implementation part Έχουν τιµές (values) ως στιγµιότυπα ιαισθητικά, πρόκειται για «καλούπια» αντικειµένων (για την ακρίβεια: τιµών), π.χ., σαν structs επεκτεταµένα µε µεθόδους... 21 Τύποι και Κλάσεις Κλάσεις Οµαδοποιούν αντικείµενα µε ίδιες σηµασιολογικές ιδιότητες Χτίζονται πάνω σε τύπους Έχουν αντικείµενα ως στιγµιότυπα ιαισθητικά, πρόκειται για «συλλογές» αντικειµένων, π.χ., σαν σχεσιακοί πίνακες, των οποίων το σχήµα προκύπτει από ένα τύπο... 22
Τύποι και Κλάσεις Αντιστοιχούν σε αφηρηµένους τύπους δεδοµένων (abstract data types) Αποτελούνται από interface part και implementation part Οµαδοποιούν αντικείµενα µε ίδιες σηµασιολογικές ιδιότητες Χτίζονται πάνω σε τύπους Έχουν τιµές (values) ως στιγµιότυπα Έχουν αντικείµενα ως στιγµιότυπα 23 Τιµές και Αντικείµενα Απλές (string, integer, κ.λ.π.), ή Σύνθετες (αποτελούµενες από άλλες τιµές) Είναι αναλλοίωτες (κάθε µεταβολή επιφέρει την παραγωγή νέας τιµής). Η µεταβολή γίνεται µέσω τελεστών της γλώσσας προγραµµατισµού Χαρακτηρίζονται µονοσήµαντα από την ταυτότητα αντικειµένου Μια αλλαγή σε ένα αντικείµενο επιφέρει την αλλαγή της τιµής του, χωρίς τη δηµιουργία νέου αντικειµένου Η µεταβολή γίνεται µόνο µέσω µηνυµάτων που µας παρέχει το interface του αντικειµένου 24
Τύποι και Κλάσεις 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 25 Τύποι και Κλάσεις Οι τύποι µοντελοποιούν τη δοµική οµοιότητα κάποιων τιµών, ενώ οι κλάσεις µοντελοποιούν τη σηµασιολογική οµοιότητα αντικειµένων Στην πράξη (π.χ., στα συστήµατα ή στα στάνταρτ): η διάκριση αυτή είναι ορατή, αν και πρακτικά όχι µεγάλη! 26
Τύποι και Κλάσεις Τύποι και Κλάσεις στην Πληροφορική γενικότερα: Τεχνητή Νοηµοσύνη: η διάκρισή τους είναι σηµαντική (π.χ., οντολογίες) Γλώσσες Προγραµµατισµού: δεν έχουν µεγάλη διαφορά, συνήθως δεν τα διακρίνουµε 27 Collection Types Σύνολα (Sets) αντικειµένων Πολυσύνολα (Bags) αντικειµένων = σύνολα µε διπλοεγγραφές Λίστες (Lists) αντικειµένων = διατεταγµένα πολυσύνολα Πίνακες (Arrays) αντικειµένων = λίστες πεπερασµένου µεγέθους Πλειάδες (Tuples) αντικειµένων = παράθεση αντικειµένων, µε συγκεκριµένο τρόπο 28
Collection Types Οι σύνθετοι τύποι είναι ορθογώνιοι: οποιοσδήποτε από αυτούς µπορεί να εφαρµοστεί σε ένα αντικείµενο, µια τιµή, ή ένα σύνθετο τύπο. tuple[set{string},set{integer},bag{string}] Μάλλον καλύτερη µετάφραση: «τύποι συλλογών» 29 Σύνθετα Αντικείµενα οµές αντικειµένων µε σχέση Part-Of Η ύπαρξη ενός αντικειµένου εξαρτάται από την ύπαρξη ενός άλλου Υλοποιούνται είτε µε φώλιασµα των αντικειµένων, είτε µε αναφορές 30
Σύνθετα Αντικείµενα OID: OID10 Name: Μαµά Καγκουρό Age: 4 Children: { [OID: OID15 Name: Μωρό Κ. Age: 0.5 Children: {}] } OID: OID12 Name: Πέτρος Age: 40 Children: {OID15} OID: OID15 Name: Γιάννης Age: 15 Children: {} 31 Σύνθετα Αντικείµενα OID: OID12 Name: Πέτρος Age: 40 Father: NULL Children: {OID15} Children Father H ίδια αναφορά έχει και την ευθεία και την ανάστροφη φορά (inverse) OID: OID15 Name: Γιάννης Age: 15 Father: OID12 Children: {} 32
Ιεραρχίες Τύπων και Κλάσεων Κληρονοµικότητα (Inheritance): Κατασκευάζουµε ένα δέντρο (ιεραρχία) κλάσεων. Κάθε κλάση που είναι κόµβος του δέντρου «κληρονοµεί», από την πατρική της κλάση όλα τα δοµικά και λειτουργικά χαρακτηριστικά της -τις instance variables και τις µεθόδους, δηλαδή. Στα χαρακτηριστικά αυτά, κάθε κλάση νοµιµοποιείται να προσθέσει τα δικά της χαρακτηριστικά και λειτουργίες. Οι ιεραρχίες αφορούν και τύπους και κλάσεις 33 Ιεραρχίες Τύπων και Κλάσεων Vehicle -Name -Weight - Color + GetName() + GetWeight + GetColor() FourWheels - MaxVelocity +GetMaxVelocity() Bike - NumSpeeds +GetNumSpeeds() Van - MaxCargo +GetMaxCargo() Car - NumDoors +GetNumDoors() 34
Ιεραρχίες Τύπων και Κλάσεων Η ιεραρχία των κλάσεων πρέπει να σέβεται την ιεραρχία των τύπων Πολλαπλή κληρονοµικότητα (Multiple Inheritance): µια κλάση έχει περισσότερους από έναν προγόνους Αφηρηµένη κλάση (abstract class): απαγορεύεται να έχει στιγµιότυπα 35 Υπερφόρτωση και πολυµορφισµός Υπερφόρτωση (overloading): Το φαινόµενο όπου δύο µηνύµατα, σε διαφορετικές κλάσεις, συµφωνούν στο interface τους Υπέρβαση (overriding): Το φαινόµενο όπου κάποιο µήνυµα υλοποιείται µε διαφορετική µέθοδο στην κορυφή της ιεραρχίας, απ ότι σε κάποιο χαµηλότερο επίπεδο 36
Υπερφόρτωση και πολυµορφισµός Vehicle -Name -Weight - Color + GetName() + GetWeight + GetColor() FourWheels - MaxVelocity +GetMaxVelocity() Bike - NumSpeeds +GetNumSpeeds() Van - MaxCargo +GetMaxCargo() +GetWeight() Car - NumDoors +GetNumDoors() 37 Υπερφόρτωση και πολυµορφισµός Late Binding: Για να υποστηριχθεί η υπέρβαση, τα ονόµατα των λειτουργιών "επιλύονται" (resolved) - µεταφράζονται σε διευθύνσεις- στο χρόνο εκτέλεσης Πολυµορφισµός (polymorphism): Το φαινόµενο όπου διαφορετικά αντικείµενα (ή κλάσεις) αντιδρούν µε διαφορετικό τρόπο στο ίδιο µήνυµα 38
Τυπικός ορισµός αντικειµένου Αντικείµενο = [OID, τιµή, κατάσταση, κλάση] OID = µοναδικός προσδιοριστής Τιµή = διάνυσµα τιµών των instance variables + τιµές επιστροφής των µεθόδων (public) Κατάσταση = διάνυσµα τιµών των instance variables βάσει του τύπου στον οποίο δοµείται το αντικείµενο (private) Κλάση = η κλάση στην οποία ανήκει το αντικείµενο 39 Τυπικός ορισµός κλάσης όνοµα κλάσης, τύπος της τιµής των στιγµιοτύπων, τύπος της κατάστασης των στιγµιοτύπων, {µηνύµατα στιγµιοτύπων}, {µέθοδοι στιγµιοτύπων}, τιµή της κλάσης, κατάσταση της κλάσης, {µηνύµατα της κλάσης}, {µέθοδοι της κλάσης} τύπος της τιµής της κλάσης, τύπος της κατάστασης της κλάσης Η κλάση είναι µια συλλογή στιγµιοτύπων αλλά είναι κι η ίδια ένα αντικείµενο οπότε ανήκει κι αυτή σε µια µετα-κλάση 40
Από το σύστηµα 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) 41 Από το σύστηµα 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) 42
Από το σύστηµα 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 43 Από το σύστηµα GemStone (που ακολουθεί το παράδειγµα της Smalltalk) Object subclass: 'Department' instvarnames: #('dptid' 'dptname' 'SubDpts' 'BelongsTo' 'manager') classvars: #() constraints: #[ #[#dptid, Integer], #[#dptname, String], #[#manager, String]]. method: Department dptname ^dptname % 44
Λειτουργίες στα δεδοµένα Λειτουργίες για την ταυτότητα αντικειµένου Ταύτιση (OID = OID) Ρηχή Ισότητα (τιµή1 = τιµή2, σε επίπεδο αντικειµένων) Βαθειά Ισότητα Ασθενής (τιµή1 = τιµή2, σε επίπεδο τιµών) Ισχυρή (ασθενής + ισοµορφικοί γράφοι) 45 Λειτουργίες -Identity 46
Λειτουργίες - Shallow Equality Rectangular1: I1 Rectangular2: I2 LowerLeft Corner UpperRight Corner LowerLeft Corner UpperRight Corner X Y X Y 2 3 Ρηχή ισότητα αντικειµένων Rectangular1 = Rectangular2 5 7 47 Λειτουργίες Deep Equality Array1: I1 Array2: I4 I2 X Y I3 X Y I5 X Y I6 X Y 3 2 4 6 3 2 4 6 Array3: I7 I8 X Y 3 2 I9 X 3 Y 2 I10 X Y 4 6 ARRAY1 not deep-equal ARRAY3 (στην ισχυρή εκδοχή ισοµορφικών γράφων) ARRAY1 deep-equal ARRAY3 (στην ασθενή εκδοχή) ARRAY1 deep-equal ARRAY2 (και στις δύο εκδοχές) 48
Λειτουργίες στα δεδοµένα Λειτουργίες για bags, sets, lists Ένωση Τοµή ιαφορά DupEliminate Γενική Επιλογή (General Selection) Φώλιασµα (Nest) Από-Φώλιασµα (UnNest) Άνοιγµα (Flatten) 49 Περιορισµοί Ακεραιότητας Περιορισµοί Ακεραιότητας Κλειδιού (Key constraints) Υπαρξιακός Περιορισµός Ακεραιότητας (Existential constraint) Περιορισµοί Ακεραιότητας Μη Κενού Χαρακτηριστικού (NOT NULL contraints) Περιορισµός Συνέπειας Αντίστροφου είκτη (Inverse Link Consistency Constraint) Περιορισµός ιαχωρισιµότητας (Disjointness constraint) Περιορισµός Επικάλυψης (Covering constraint) 50
ODMG - 93 Το Object Database Management Group (ODMG) είναι µια επιτροπή που, στις αρχές της δεκαετίας του 1990, πρότεινε ένα κοινό interface (ODMG-93) στους διάφορους κατασκευαστές αντικειµενοστρεφών συστηµάτων βάσεων δεδοµένων Σήµερα: version 3.0 του στάνταρτ 51 Βασικά κοµµάτια του ODMG - 93 Μοντέλο Αντικειµένων (Object Model) Γλώσσα Ορισµού Αντικειµένων (Object Definition Language - ODL) Object Query Language - OQL C++ Language Binding Smalltalk Language Binding 52
Μοντέλο Αντικειµένων Η βασική οντότητα είναι το αντικείµενο (object) Τα αντικείµενα κατηγοριοποιούνται σε τύπους (types) Η συµπεριφορά των αντικειµένων χαρακτηρίζεται από τις λειτουργίες του Η κατάσταση (state) των αντικειµένων χαρακτηρίζεται από τις τιµές των ιδιοτήτων (properties) = attributes & relationships Εδώ: κατάσταση = τιµή 53 Μοντέλο Αντικειµένων Για κάθε λειτουργία, ο προγραµµατιστής πρέπει να καθορίσει την υπογραφή της. Κάθε λειτουργία είναι συνδεδεµένη µε µόνο ένα τύπο µπορεί να έχει ορίσµατα, να επιστρέφει µία τιµή, να έχει παρενέργειες και να καλεί µια εξαίρεση 54
Πώς δουλεύει... ηλώσεις σε ODL ή σε PL ODL Κώδικας της εφαρµογής σε PL Preprocessor για τις δηλώσεις PL Compiler metadata ODBMS runtime Application Binary Linker Database Data access Running Application 55 Γλώσσα Ορισµού Αντικειµένων (Object Definition Language, ODL) Υποστηρίζει όλες τις σηµασιολογικές δοµές του ODMG µοντέλου αντικειµένων Είναι µια γλώσσα προσδιορισµού interface signatures Είναι ανεξάρτητη από προγραµµατιστικές γλώσσες Είναι συµβατή µε την Interface Definition Language του OMG Είναι επεκτάσιµη Καθορίζει τα χαρακτηριστικά των τύπων και τις υπογραφές των µεθόδων Το ODMG-93 δεν καθορίζει κάποια συγκεκριµένη OML. Περιγράφει, δύο interfaces για τη σύνδεση των C++ και Smalltalk Είναι ανεξάρτητη από την οποιαδήποτε γλώσσα προγραµµατισµού 56
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<Person> children inverse Person::parents {order by birth_date } relationship List<Person> parents inverse Person::children; void birth (in String name); Boolean marriage (in String person_name) raises (no_such_person); Unsigned Short ancestors (out Set<Person> all_ancestors) raises (no_such_person); void move (in String new_address); }; 57 Object Definition Language, ODL interface Employee: Person ( extent employees key(name, id) ) { attribute Short id; attribute Unsigned Short annual_salary; }; interface City ( extent cities key city_code) ) { attribute Unsigned Short city_code; attribute String name; attribute Set<Person> population; }; 58
Object Query Language - OQL εν είναι από µόνη της υπολογιστικά πλήρης Παρέχει δηλωτικό τρόπο προγραµµατισµού Βασίζεται στο µοντέλο αντικειµένων του ODMG Έχει αφηρηµένο συντακτικό (abstract syntax) Έχει εύκολα καθορίσιµα semantics Έχει συντακτικό SQL-like Παρέχει την ευκολία της άµεσης διαχείρισης για collections αντικειµένων εν παρέχει τελεστές για update αλλά βασίζεται στις µεθόδους των αντικειµένων, που έχουν καθοριστεί γι' αυτό το σκοπό Βελτιστοποιείται εύκολα 59 Object Query Language - OQL Person µε τα χαρακτηριστικά name, birthdate, salary και τη µέθοδο age. Extent: Persons Employee ISA Person και τον εξειδικεύει µε την αναφορά subordinates και τη µέθοδο seniority. Extent: Employees Department, µε το χαρακτηριστικό name και την αναφορά employees, η οποία τυχαίνει να είναι και αντίστροφη (στον τύπο Employee υπάρχει η αντίστροφη αναφορά department 60
Object Query Language - OQL select distinct struct(name: x.name, hps: (select y from x.subordinates as y where y.age > 30)) from Employees x Αποτέλεσµα: set<struct(name:string,hps:bag<employee>)> Μπορούµε να ονοµάζουµε τα χαρακτηριστικά του αποτελέσµατος της ερώτησης Στο from clause µπορούµε να πούµε from Employees x, ή from Employees as x, ή ακόµα καιfrom x in Employees. Μπορούµε να έχουµε φώλιασµα ερωτήσεων και µεταβλητών. Μπορούµε να χρησιµοποιούµε εκφράσεις µονοπατιών µέσα σε µια ερώτηση Μπορούµε να χρησιµοποιούµε µεθόδους οπουδήποτε µέσα σε µια ερώτηση 61 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 Αποτέλεσµα:set<struct(attr1:Department,avg_salary:int)> Το clause group by χωρίζει τους υπαλλήλους σε οµάδες (partitions). Κάθε οµάδα χαρακτηρίζεται από το γεγονός ότι όλοι οι υπάλληλοι δουλεύουν στο ίδιο τµήµα και ονοµάζεται partition (που είναι δεσµευµένη λέξη στην OQL). Το clause having περιορίζει τα τµήµατα σ αυτά που έχουν αριθµό υπαλλήλων πάνω από 5. Η συντόµευση * διατηρείται και στην OQL (όπως και στην SQL) Το order by λειτουργεί όπως και στην SQL 62
C++ Language Binding Είναι µια βιβλιοθήκη κλάσεων και µια επέκταση στη γραµµατική της C++ Η βιβλιοθήκη παρέχει κλάσεις για να υλοποιηθεί το µοντέλο αντικειµένων του ODMG-93 Η επέκταση του συντακτικού της γλώσσας έχει να κάνει µε την υποστήριξη σχέσεων µεταξύ των κλάσεων Υπάρχει και µια απεικόνιση της OQL για C++. Τα queries µπορούν να δηλωθούν µέσα σε ένα πρόγραµµα µέσω µιας συναρτήσεως για queries, η οποία παίρνει strings για ορίσµατα 63 C++ Language Binding Για να δηλωθούν τα διαρκή (persistent) δεδοµένα στη C++ binding, µια κλάση πρέπει να είναι υποκλάση της κλάσης Persistent_Object. Μια κλάση µπορεί να έχει και διαρκή (persistent) και µεταβατικά (transient) αντικείµενα. Ref<Professor> profp; 64
C++ Language Binding class City : public Persistent_Object { public: int city_code; String name; Ref<Set<Ref<Perosn>>> population; City(int, const char*); //Extension static Ref<Set<Ref<City>>> cities; }; 65 C++ Language Binding //Classes implementation in C++ #include "schema.hxx" const char * const City::extent_name = "cities" ; City::City(int code, const char* cname) : city_code(code), name(cname) { cities->insert_element(this); } 66
C++ ODL Declarations ODL Preprocessor Generated C++ Header [and source] files User C++ Source [and Header] files with OML C++ Compiler ODBMS Runtime Object Code ODBMS Metadata Linker Database Executable Application ODBMS Runtime 67 Smalltalk Binding Αντίστοιχο µε το C++ Binding ODL Declarations ODL Compiler Εγγυάται την αντιστοιχία µεταξύ transient και persistent δεδοµένων Meta Objects Object Instances Database Language Binding Class Objects Object Instances Image 68
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 69