ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΠΡΟΧΩΡΗΜΕΝΑ ΘΕΜΑΤΑ ΒΑΣΕΩΝ Ε ΟΜΕΝΩΝ ΦΘΙΝΟΠΩΡΟ 2007 Λύση ΑΣΚΗΣΗΣ #3 Τ. Σελλής ΕΡΩΤΗΜΑ 1: ΑΠΟΘΗΚΕΣ Ε ΟΜΕΝΩΝ Έστω το σύστηµα διαχείρισης παραγγελιών εισιτηρίων του γηπέδου Καραϊσκάκη. Το σύστηµα διαχειρίζεται δεδοµένα που έχουν να κάνουν µε την τιµή µίας παραγγελίας εισιτηρίου, την έκπτωση, τον τρόπο πληρωµής, και µε σχόλια σχετικά µε την παραγγελία εισιτηρίου. Επίσης, διαχειρίζεται δεδοµένα σχετικά µε την ηµέρα, το µήνα και το χρόνο της παραγγελίας, µε το όνοµα, τη διεύθυνση, το τηλέφωνο, την κατηγορία του πελάτη και σχόλια για τον πελάτη. Όσον αφορά το παιχνίδι για το οποίο γίνεται η παραγγελία εισιτηρίου, διαχειρίζεται πληροφορίες για τη διοργάνωση στην οποία ανήκει το παιχνίδι, τον αντίπαλο, τη µέρα, το µήνα και τη χρονιά του παιχνιδιού και σχόλια για το παιχνίδι. Τέλος, διαχειρίζεται πληροφορίες σχετικές µε τη θέση στην οποία αντιστοιχεί το εισιτήριο, όπως αριθµός θέσης, σειρά θέσης, θύρα θέσης και κατηγορία θέσης. Όλα τα παραπάνω συνοψίζονται στον ακόλουθο πίνακα:: Ticket_Order(Ticket_order_ID, Customer_Name, Customer_Address, Customer_Phone, Customer_Category, Customer_Comment, Order_Day, Order_Month,, Position_Seat_Category, Position_Seat_Number, Position_Row_Number, Position_Gate_Number, Game_Opponent, Game_Championship, Game_Day, Game_Month, Game_Year, Game_Comment, Ticket_Cost, Discount, Way_of_Payment, Comment). (α) Σχεδιάστε το σχήµα αστέρα (star schema) της παραπάνω αποθήκης δεδοµένων, δείχνοντας τα εξωτερικά κλειδιά στους πίνακες, και εντοπίστε τον πίνακα συµβάντων (fact table), τους πίνακες διάστασης (dimension tables) και τα µέτρα, όπως προκύπτουν από το σχήµα.. (β) Για κάθε διάσταση που προκύπτει από το σχήµα αστέρα, εντοπίστε (σε περίπτωση που υπάρχει) την ιεραρχία των επιπέδων της. Στη συνέχεια, για όσες από τις διαστάσεις δεν εντοπίσατε κάποια ιεραρχία επιπέδων, ορίστε κάποια επιπλέον πεδία στον πίνακά τους, έτσι ώστε να σχηµατίζεται µία ιεραρχία επιπέδων. (γ) Σχεδιάστε το αντίστοιχο σχήµα χιονονιφάδας (snowflake schema) που προκύπτει µετά και την προσθήκη των επιπλέον πεδίων στο ερώτηµα (β). Λύση (α) Από τον τρόπο που ορίζεται το πρόβληµα ο πίνακας συµβάντων για το σχήµα αστέρα της αποθήκης δεδοµένων θα είναι ο πίνακας παραγγελιών εισιτηρίων. Πίνακες διαστάσεων θα είναι ο πίνακας πελάτη, ο πίνακας χρόνου παραγγελίας εισιτηρίου, ο πίνακας θέσης του εισιτηρίου στο γήπεδο και ο πίνακας παιχνιδιού για το οποίο γίνεται η παραγγελία εισιτηρίου. Το σχήµα δίνεται παρακάτω: 1
Order_Time Customer Order_Time_ID Customer_ID Order_Day Customer_Name Order_Month Customer_Address Customer_Phone Customer_Category Ticket_Order Customer_Comment Ticket_order_ID Time_ID Customer_ID Game_ID Position_ID Ticket_Cost Discount Position Way_of_Paymen t Game Position_ID Comment Game_ID Position_Seat_Number Game_Opponent Position_Row_Number Game_Championshi p Position_Gate_Number Game_Day Position_Seat_Categor y Game_Month Game_Year Game_Comment Τα µέτρα προκύπτουν από τον πίνακα συµβάντων και είναι τα: o Ticket_Cost o Discount (β) Οι ιεραρχίες που προκύπτουν για την κάθε διάσταση είναι οι εξής: i) ιάσταση Order_Time: Order_Month Order_Day ii) ιάσταση Position: Position_Gate_Number Position_Row_Number Position_Seat_Number 2
iii) ιάσταση Game: Game_Year Game_Month Game_Day iv) ιάσταση Customer: Για αυτή τη διάσταση δεν εµφανίζεται κάποια ιεραρχία. Αν θελήσουµε να ορίσουµε κάποια νέα πεδία, ώστε να προκύψει ιεραρχία επιπέδων, τότε βλέπουµε ότι το πεδίο Customer_Address είναι κατάλληλο. Έτσι, µπορούµε, για παράδειγµα, να ορίσουµε τα επιπλέον πεδία Customer_City και Customer_Region. Τότε, θα προέκυπτε η ιεραρχία: Customer_Region Customer_City Customer_Address (γ) To σχήµα χιονονιφάδας που προκύπτει δίνεται παρακάτω: Order_Day Game_Day Order_Day_ID Customer_Address_ID Order_Day_Name Customer_Address Order_Time Customer Order_Month Order_Time_ID Customer_ID Order_Month Order_Month_ID Order_Day_ID Customer_Name Customer_City_ID Order_Month_Name Order_Month_ID Customer_Address_ID Customer_City _ID Customer_City_ID Customer_Region_ID _ID Ticket_Order Customer_Phone Customer_ Region _ID _Name Ticket_order_ID Customer_Category Customer_ Region Time_ID Customer_Comment Customer_ID Game_ID Position_ID Position_Seat Ticket_Cost Game_Day Position_Seat_ID Discount Game_Day_ID Position_Seat Position Way_of_Payment Game Game_Day_Name Position_ID Comment Game_ID Position_Row Position_Seat_ID Game_Opponent Order_Month Position_Row_ID Position_Row_ID Game_Championship Game_Month_ID Position_Row Position_Gate_ID Game_Day_ID Game_Month_Name Position_Seat_Category Game_Month_ID Position_Gate Game_Year_ID Position_Gate_ID Game_Comment Game_Year_ID Position_Gate Game_Year_Name 3
ΕΡΩΤΗΜΑ 2: SQL99 (α) Για το ακόλουθο παράδειγµα, ορίστε τις κλάσεις σε SQL99 και σχεδιάστε την ιεραρχία των κλάσεων: Μία Company χαρακτηρίζεται από την επωνυµία, την έδρα, τον αριθµό των εργαζοµένων και τα κέρδη. Μία NewsPaper είναι µία Company µε επιπλέον γνωρίσµατα: την τιµή, την κυκλοφορία και την πολιτική. Ένα Channel είναι µία Company µε επιπλέον γνωρίσµατα: τη συχνότητα, την τηλεθέαση και την πολιτική. Ένα Person χαρακτηρίζεται από τον αριθµό ταυτότητας, το όνοµα, το φύλο, την ηµεροµηνία γέννησης, τη διεύθυνση. Ένας Employee είναι ένα Person µε επιπλέον γνωρίσµατα: το µισθό, τα χρόνια προϋπηρεσίας, και µία αναφορά στην κύρια Company για την οποία εργάζεται Ένας Employer είναι ένα Person µε επιπλέον γνωρίσµατα: τα έσοδα, και ένα σύνολο(set) από αναφορές στις Company οι οποίες του ανήκουν. Ένας Politician είναι ένα Person µε επιπλέον γνωρίσµατα: το κόµµα, την ιδεολογία και ένα σύνολο(set) από αναφορές στις NewsPaper µε τις οποίες συνεργάζεται. Ένας Reporter είναι ένας Employee µε επιπλέον γνωρίσµατα: την κατηγορία ρεπορτάζ,, ένα σύνολο(set) από αναφορές στις Company µε τις οποίες συνεργάζεται και ένα σύνολο(set) από αναφορές στους Politician τους οποίους έχει για πηγές. (β) Γράψτε σε SQL99 τις παρακάτω ερωτήσεις: i) Επιστρέψτε το όνοµα και το µισθό όλων των δηµοσιογράφων που έχουν ως πηγές περισσότερους από τρεις πολιτικούς. ii) Επιστρέψτε το µέσο µισθό των δηµοσιογράφων, των οποίων η κύρια εταιρία που εργάζονται έχει έδρα την Αθήνα. iii) Επιλέξτε το όνοµα των δηµοσιογράφων και το όνοµα της κύριας εταιρίας στην οποία δουλεύουν, για όσους δηµοσιογράφους δεν δουλεύουν σε κανάλι τηλεόρασης. iv) Επιστρέψτε σε ένα πίνακα όλα τα ονόµατα των εταιριών µε τις οποίες συνεργάζονται οι δηµοσιογράφοι που έχουν µισθό µεγαλύτερο από 1500 ευρώ. Λύση (α) CREATE ROW TYPE CompanyObj { name Varchar(40), base Varchar(40), no_of_employees Integer, profits Real }; CREATE TABLE Company OF ROW TYPE CompanyObj; CREATE ROW TYPE NewsPaperObj { price Real, circulation Integer, policy Varchar(40) } UNDER CompanyObj; 4
CREATE TABLE NewsPaper OF ROW TYPE NewsPaperObj UNDER Company; CREATE ROW TYPE ChannelObj { frequency Real, ratings Real, policy Varchar(40) } UNDER CompanyObj; CREATE TABLE Channel OF ROW TYPE ChannelObj UNDER Company; CREATE ROW TYPE PersonObj { id Varchar(7), name Varchar(40), sex Varchar(10), birthdate Date, address Varchar(40) }; CREATE TABLE Person OF ROW TYPE PersonObj; CREATE ROW TYPE EmployeeObj { salary Real, years_of_previous_work Integer, works_for Ref(Company) } UNDER PersonObj; CREATE TABLE Employee OF ROW TYPE EmployeeObj UNDER Person; CREATE ROW TYPE EmployerObj { profits Real, owns Set(Ref(Company)) } UNDER PersonObj; CREATE TABLE Employer OF ROW TYPE EmployerObj UNDER Person; CREATE ROW TYPE PoliticianObj { party Varchar(40), ideology Varchar(40), associate_with Set(Ref(Company)) } UNDER PersonObj; CREATE TABLE Politician OF ROW TYPE PoliticianObj UNDER Person; CREATE ROW TYPE ReporterObj { reportage_category Varchar(40), associate_with Set(Ref(Company)), has_sources Set(Ref(Politician)) } UNDER EmployeeObj; CREATE TABLE Reporter OF ROW TYPE ReporterObj UNDER Employee; 5
Η ιεραρχία των κλάσεων είναι η εξής: Person Company Employee Employer Politician NewsPaper Channel Reporter (β) i) SELECT e.name, e.salary WHERE 3 < (SELECT count(*) FROM TABLE (e.has_sources) d) ii) SELECT avg (e.salary) WHERE e.works_for base= Athens iii) SELECT e.name, e. works_for name WHERE e. works_for name NOT IN (SELECT d.name FROM Channel d) iv) TABLE (SELECT e.associate_with name WHERE e. salary > 1500) 6