Τyped Πίνακες Α ΜΕΡΟΣ ΗΜΙΟΥΡΓΙΑ USER DEFINED DATATYPES ΣΤΗΝ IBM DB2 ιάφορα σχεσιακά Σ Β άρχισαν στα µέσα της δεκαετίας του '90 να παρέχουν αντικειµενοστρεφείς επεκτάσεις στη µηχανή τους. Ετσι στην SQL-3 υιοθετήθηκαν user defined datatypes,predicates,user functions... Tύπoι οριζόµενοι από το χρήστη UDTs, που διαιρούνται σε διάφορες κατηγορίες. Στην DB2 χωρίζονται σε δυο κατηγορίες : User-defined distinct types - ιακριτοί τύποι (απλοί) - Distinct Types User-defined structured types - οµηµένοι τύποι γραµµών http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.ud b.doc/ad/rjvjdata.htm 1. Απλοί (distinct types) σηµασιολογία δεδοµένων CREATE DISTINCT TYPE b_name_type AS VARCHAR(20) WITH COMPARISONS; CREATE DISTINCT TYPE p_name_type AS VARCHAR(20) WITH COMPARISONS; CREATE DISTINCT TYPE headcount_type AS INTEGER WITH COMPARISONS; Χρήση user defined distinct datatype: CREATE TABLE Business (name b_name_type, headcount headcount_type); --varchar(20) --int CREATE TABLE Person (name p_name_type,--varchar(20), age int); select b.*, p.* from Person p, Business b where p.name = b.name ; εν θα δουλέψει γιατί είναι διαφορετικοί τύποι παρόλο που και οι δυο είναι varchar(20), απαιτείται casting. Aν θέλουµε όµως να συγκρίνονται µε τιµές varchar(20) π.χ. where p.name= 'me' χρησιµοποιείται το WITH COMPARISONS (αλλιώς without comparisons). 1. Να δηµιουργηθούν (µε εντολές db2) οι κάτωθι απλοί τύποι : Τύπος ιπλώµατος, Βαθµός Συνοδού και Αριθµός Κυκλοφορίας TYPOS_DIPLOMATOS_TYPE VARCHAR(30) (π.χ. Επαγγελµατικό, επιβατικό, ) VATHMOS_SΥNODOU_TYPE VARCHAR(20) (π.χ. Ελεγκτής, Εισπράκτορας, ) ARITHMOS_KUKLOFORIAS_TYPE VARCHAR(8) (π.χ ΥΕΤ55018,..) 2. οµηµένοι τύποι (structured types) CREATE TYPE Person_t AS ( name VARCHAR(30), age int, address Αddress_t ) INSTANTIABLE --default/µπορώ να έχω αντικείµενα REF USING INT --για την ταυτότητά του χρησιµοποιεί ακέραιο Οι τύποι αυτοί έχουν µια δοµή και τα στοιχεία τους (αντίθετα από τους απλούς τύπους) µπορεί να µην είναι µόνο built-in DB2 τύποι (π.χ. το χαρακτηριστικό address Αddress_t). 1
Τyped Πίνακες Α ΜΕΡΟΣ Ένα στιγµιότυπο ενός δοµηµένου τύπου µπορεί να αποθηκευτεί στην βάση µε δυο τρόπους: A. Σαν µια γραµµή σε έναν πίνακα, στην οποία κάθε στήλη/πεδίο του πίνακα αντιστοιχεί σε ένα χαρακτηριστικό του τύπου π.χ. Ο δοµηµένος τύπος αναφέρεται σε ολόκληρη την πλειάδα της σχέσης Ο πίνακας Person έχει τις στήλες name, age, address που αντλούν το όνοµά τους και τον τύπο τους από τα χαρακτηριστικά του δοµηµένου τύπου Person_t. Aυτοί οι πίνακες είναι γνωστοί σαν typed πίνακες. B. Σαν µια τιµή σε µια στήλη π.χ. CREATE TABLE Person OF Person_t CREATE TABLE Properties ( ParcelNum int, Address Address_t); Ο δοµηµένος τύπος αναφέρεται σε ένα πεδίο της σχέσης Ο πίνακας Properties έχει µια στήλη ParcelNum τύπου int αλλά και την στήλη Address, που είναι δοµηµένου τύπου Address_t (και πρέπει να έχει ήδη οριστεί κπκ.). Οι δοµηµένοι τύποι µπορούν να ορισθούν INSTANTIABLE (προεπιλογή) ή ΝΟΝ INSTANTIABLE. Με τους instantiable τύπους µπορούν να δηµιουργηθούν αντικείµενα αντιθέτως µε τους non instantiable, οι οποίοι χρησιµεύουν σαν µοντέλα στην ιεραρχία τύπου. π.χ. αν οριστεί Person_t µε το ΝΟΝ INSTANTIABLE, τότε δεν µπορείτε να αποθηκευτεί ένα Person στη βάση δεδοµένων. Αντ 'αυτού, µπορούν να αποθηκευτούν µόνο περιπτώσεις Employee_t ή άλλων υποτύπων του που έχουν ορίσει. Ενας δοµηµένος τύπος µπορεί να έχει υποκατηγορίες που χρησιµοποιούν όλα τα χαρακτηριστικά του και µπορούν να περιέχουν και πρόσθετα. Ο αρχικός τύπος είναι ο Υπερτύπος (supertype) π.χ. ο δοµηµένος τύπος Person_t µπορεί να περιέχει σαν χαρακτηριστικά όνοµα, ηλικία, και διεύθυνση κπκ. Ένας υπότυπος του Person_t (under Person_t) µπορεί να είναι ο Employee_t που έχει όλα τα γνωρίσµατα όνοµα, ηλικία, διεύθυνση και επιπλέον, έχει και τα δικά του χαρακτηριστικά SerialNum, Μισθός και BusinessUnit κπκ. CREATE TYPE Address_t AS ( --ΥΠΕΡΤΥΠΟΣ street VARCHAR(30), number CHAR(15), city VARCHAR(30), state VARCHAR(10) ) REF USING INT CREATE TYPE Germany_addr_t UNDER Address_t AS ( --ΥΠΟΤΥΠΟΣ family_name VARCHAR(30) ) CREATE TYPE US_addr_t UNDER Address_t AS (--ΥΠΟΤΥΠΟΣ zip CHAR(10) ) 2
Τyped Πίνακες Α ΜΕΡΟΣ REF USING τύπος: Μπορεί να καθοριστεί µόνο για τον ΥΠΕΡΤΥΠΟ (την ρίζα) µια δοµηµένης ιεραρχίας τύπου. Καθορίζει τον built-in τύπο δεδοµένων που χρησιµοποιείται για την εκπροσώπηση του δοµηµένου τύπου ( OID ***) αλλά για και όλες τις υποκατηγορίες του (δεν ξανα-ορίζεται στην υποτύπο) CREATE TYPE BusinessUnit_t AS ( Name b_name_type, Headcount INT ) REF USING INT -- ΟΙD ακέραιος Oι υπερτύποι µιας ιεραρχίας µε REF USING.. για να αναφερόµαστε στα αντικείµενά τους. DROP TYPE Person_t; --κατάργηση, πριν ορίστηκε µε REF USING INT CREATE TYPE Person_t AS ( --ΥΠΕΡΤΥΠΟΣ Name p_name_type, --απλός τύπος Age INT, Address Address_t ) --δοµηµένος τύπος --REF USING VARCHAR(16) FOR BIT DATA (*) Aν δεν οριστεί REF USING.. για τον ΥΠΕΡΤΥΠΟ µιας δοµηµένης ιεραρχίας τότε η προεπιλογή είναι REF USING VARCHAR(16) FOR BIT DATA (*) CREATE TYPE Employee_t UNDER Person_t AS (--ΥΠΟΤΥΠΟΣ του Person_t SerialNum INT, Salary INT, Dept REF (BusinessUnit_t) ) --κπκ -- αναφέρεται σε αντικείµενο τύπου BusinessUnit_t REF (BusinessUnit_t): για επιτευχθεί συσχέτιση µεταξύ Υπαλλήλου και Τµήµατος - ξένο κλειδί. Με την χρήση τύπου αναφοράς (reference type) ορίζεται ο συσχετισµός µεταξύ δύο πινάκων. Μία τιµή ενός τύπου αναφοράς µπορεί να αποθηκευθεί σε έναν πίνακα και να χρησιµοποιηθεί ως άµεση αναφορά σε µία συγκεκριµένη γραµµή ενός άλλου πίνακα. Έτσι µία γραµµή ενός πίνακα µπορεί να µοιρασθεί σε πολλούς πίνακες απλοποιώντας τη διατύπωση ερωτηµάτων που περιέχουν πράξεις σύνδεσης. 2. Να κατασκευαστούν οι κάτωθι επτά αφηρηµένοι τύποι : Yπάλληλος, Oδηγός,Συνοδηγός, Πλήρωµα, Πόλη, Λεωφορείο & ροµολόγιο YPALLILOS_T--ΥΠΕΡΤΥΠΟΣ όνοµα VARCHAR(20), επώνυµο VARCHAR(30), φύλο CHAR(1), ηλικία INT, διεύθυνση_κατοικίας VARCHAR(40), ηµεροµηνία_πρόσληψης DATE ODIGOS_T --υποτύπος υπαλλήλου τύπος_διπλώµατος TYPOS_DIPLOMATOS_TYPE, αριθµός_δροµολογίων INT SΥNODOS_T --υποτύπος υπαλλήλου Bαθµός Συνοδού VATHMOS_SΥNODOU_TYPE PLIROMA_T oδηγός ODIGOS_T, συνοδηγός SINODIGOS_T POLI_T όνοµα VARCHAR(30), χώρα VARCHAR(30) LEOFOREIO_T αριθµός_κυκλοφορίας ARITHMOS_KUKLOFORIAS_TYPE, έδρα POLI_T, ηµεροµηνία_κατασκευής DATE, πλήρωµα PLIROMA_T, αριθµός_χιλιοµέτρων INT DROMOLOGIO_T αφετηρία POLI_T, προορισµός POLI_T, ηµέρα VARCHAR(10), ώρα TIME, Λεωφορείο LEOFOREIO_T, τιµή_του_εισιτηρίου INT Σηµείωση: Όταν στα χαρακτηριστικά ενός τύπου υπάρχει άλλος δοµηµένος τύπος περάστε τον µε αναφορά (όπως το Dept στο Employee_t) π.χ. στο Pliroma_t να περαστεί µε αναφορά ο οδηγός. (***)INSERT INTO BusinessUnit (Oid, Name, Headcount) VALUES(BusinessUnit_t( GENERATE_UNIQUE() ), 'Toy' 15); (*)http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/ad/rjvjdata.htm 3
Τyped Πίνακες Β ΜΕΡΟΣ ΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΩΝ User defined structured datatypes and typed πίνακες Τyped Tables: είναι οι πίνακες που ορίζονται µε έναν user-defined structured type. Μπορεί έτσι να δηµιουργειθεί µια ιεραρχική δοµή µε καθορισµένη σχέση µεταξύ των πινάκων. Η ιεραρχία αποτελείται από έναν ΜΟΝΑ ΙΚΟ πίνακα ρίζα, supertables, και subtables. Κάθε χαρακτηριστικό του user-defined structured τύπου είναι µια στήλη του πίνακα. CREATE TYPE BusinessUnit_t AS (Name b_name_type,headcount int ) REF USING INT CREATE TABLE BusinessUnit OF BusinessUnit_t (REF IS Oid USER GENERATED); -- Oid: Οbject IDentity Κάθε typed table έχει µια στήλη object identifier (ΟΙD) column σαν πρώτη στήλη, επειδή στα αντικείµενα των typed tables γίνεται αναφορά από άλλα αντικείµενα. Ο τύπος του ΟΙD καθορίζεται στο δοµηµένο ΥΠΕΡτύπο µε το REF (π.χ. ref using int) δεν ξανακαθορίζεται στον υποτύπο Στον ΥΠΕΡπίνακα καθορίζεται ο τρόπος που δηµιουργείται το OID ( ref is oid user generated) δεν ξανακαθορίζεται στον υποτύπο Οι τιµές του ΟID που µπορεί να δώσει ο χρήστης δεν αλλάζουν (για να δηµιουργήσει η DB2 τιµές για OID, χρησιµοποιούνται οι συναρτήσεις SEQUENCE or the GENERATE_UNIQUE() ***) INSERT INTO BusinessUnit (Oid, Name, Headcount) VALUES (BusinessUnit_t(1), 'Toy', 15); --Το OID είναι ακέραιος --SELECT * FROM BusinessUnit; CREATE TABLE Person OF Person_t --ΥΠΕΡΤΥΠΟΣ (REF IS Oid USER GENERATED);--το OID VARCHAR(16) εξ'ορισµού INSERT INTO Person (Oid, Name, Age, Address) - address UDTs VALUES (Person_t ('t'), 'Tasos', 20,Address_t( ).. street('bakelyavenue').. number('555').. city('san Jose').. state('ca') ); CREATE TABLE Employee OF Employee_t UNDER Person --ΥΠΟΤΥΠΟΣ INHERIT SELECT PRIVILEGES --η υποτάξη κληρονοµεί την υπερτάξη (SerialNum WITH OPTIONS NOT NULL, --δεν µπορεί να πάρει κενές τιµές Dept WITH OPTIONS SCOPE BusinessUnit ); --H στήλη Dept (στήλη τύπου REF (BusinessUnit)) αναφέρεται σε --αντικείµενα ΜΟΝΟ του πίνακα BusinessUnit INSERT INTO Employee (Oid, Name, Age, SerialNum, Salary, Dept) VALUES (Employee_t('d'), 'Dennis', 26, 105, 30000, BusinessUnit_t(1)); 3. Να κατασκευαστούν οι επτά πίνακες : YPALLILOS --ΥΠΕΡΤΥΠΟΣ ODIGOS --υποτύπος υπαλλήλου SΥNODOS --υποτύπος υπαλλήλου PLIROMA POLI LEOFOREIO DROMOLOGIO 4
Τyped Πίνακες Β ΜΕΡΟΣ BusinessUnit typed table: CREATE TABLE BusinessUnit OF BusinessUnit_t (REF IS Oid USER GENERATED); Person table hierarchy: CREATE TABLE Person OF Person_t (REF IS Oid USER GENERATED); CREATE TABLE Employee OF Employee_t UNDER Person INHERIT SELECT PRIVILEGES (SerialNum WITH OPTIONS NOT NULL, Dept WITH OPTIONS SCOPE BusinessUnit ); --το Dept µε scoped reference CREATE TABLE Student OF Student_t UNDER Person INHERIT SELECT PRIVILEGES; CREATE TABLE Manager OF Manager_t UNDER Employee INHERIT SELECT PRIVILEGES; CREATE TABLE Architect OF Architect_t UNDER Employee INHERIT SELECT PRIVILEGES; IΕΡΑΡΧΙΑ του Person typed table που είναι τύπου Person_t. Subtables of the Person table: Employee and Student. Subtables of the Employee: Manager and Architect. Ενας υποπίνακας πρέπει να βρίσκεται στο ίδιο σχήµα µε τον υπερπίνακά του. Όπως ένας υποτύπος κληρονοµεί από ένα υπερτύπο έτσι και ένας υποπίνακας κληρονοµεί από ένα υπερπίνακα τις κολόνες του αλλά και το ΟΙD του. Οι στήλες του υποπίνακα Employee είναι 7: Oid, Name, Age, Address, SerialNum, Salary, and Dept. Ενα SELECT, UPDATE, or DELETE εντολή σε ένα ΥΠΕΡπίνακα εξ ορισµού επηρεάζει όλους τους ΥΠΟπίνακες π.χ., µια εντολή UPDATE στον Employee επηρεάζει τους Υποπίνακες Manager, and Architect - µια UPDATE στον πίνακα Manager επηρεάζει γραµµές µόνο στον Manager. Αν θέλετε να περιορίσετε τις ενέργειες των εντολών SELECT, INSERT, ή DELETE σε ένα συγκεκριµένο πίνακα χρησιµοποιείται η επιλογή ONLY option (Γ ΜΕΡΟΣ). 5
Τyped Πίνακες Β ΜΕΡΟΣ INHERIT SELECT PRIVILEGES Ο υποχρεωτικός όρος ΙNHERIT SELECT PRIVILEGES στην εντολή CREATE TABLE ορίζει ότι αυτός ο ΥΠΟΠΙΝΑΚΑΣ π.χ.employee, είναι αρχικά προσπελάσιµος από τους ίδιους τους χρήστες και οµάδες όπως και ο supertable, δηλ.όπως ο Person. WITH OPTIONS Ο όρος αυτός επιτρέπει να καθοριστούν επιλογές ΣΕ ΜΙΑ ΜΕΜΟΝΩΜΕΝΗ ΣΤΗΛΗ του typed table π.χ. SerialNum WITH OPTIONS NOT NULL WITH OPTIONS SCOPE ορισµός του scope µιας στήλης Reference Ο όρος SCOPE εφαρµόζεται ΜΟΝΟ ΣΕ ΣΤΗΛΕΣ ΤΥΠΟΥ REF. Μια επί πλέον χρήση του WITH OPTIONS είναι ο καθορισµός του πεδίου δράσης (scope) µιας στήλης π.χ. στον πίνακα Employee - που έχει και την στήλη Dept REF (BusinessUnit_t) το Dept WITH OPTIONS SCOPE BusinessUnit δηλώνει ότι η στήλη Dept του πίνακα αλλά και των υποπινάκων του έχει πεδίο δράσης/θέα µέσα στο Πίνακα BusinessUnit, δηλαδή οι τιµές αναφοράς σε αυτήν τη στήλη του Employee table αναφέρονται µόνο σε αντικείµενα του πίνακα BusinessUnit. EIΣΑΓΩΓΗ ΕΓΓΡΑΦΩΝ Για την εισαγωγή µιας εγγραφής Person, βάζουµε: INSERT INTO Person (Oid, Name, Age) VALUES(Person_t('a'), 'Andrew', 29); --Το OID είναι varchar INSERT INTO Employee (Oid, Name, Age, SerialNum, Salary) VALUES (Employee_t('s'), 'Susan', 39, 24001, 37000.48) Ο πίνακας Person περιέχει και Person και Employee instances Oid Name Age Address a Andrew 30 NULL s Susan 39 NULL Αλλά και INSERT INTO BusinessUnit (Oid, Name, Headcount) VALUES (BusinessUnit_t (1), 'Toy', 15); --Το OID είναι ακέραιος INSERT INTO Employee (Oid, Name, Age, SerialNum, Salary, Dept) VALUES (Employee_t('d'), 'Dennis', 26, 105, 30000, BusinessUnit_t(1) ); --Το πεδίο Dept είναι µε scoped reference 6