ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΠΡΟΧΩΡΗΜΕΝΑ ΘΕΜΑΤΑ ΒΑΣΕΩΝ ΔΕΔΟΜΕΝΩΝ ΦΘΙΝΟΠΩΡΟ 2008 Λύση ΑΣΚΗΣΗΣ #3 Τ. Σελλής Θεωρούμε το ακόλουθο σενάριο: Το τμήμα διαχείρισης δεδομένων μίας εταιρίας έχει σχεδιάσει ένα μοντέλο οντοτήτων-συσχετίσεων για τη βάση δεδομένων της. Η βάση περιέχει προϊόντα (Products) και κατηγορίες προϊόντων (Categories). Οι αγορές από τους προμηθευτές (Suppliers) προσδιορίζονται από παραγγελίες αγοράς (PurchaseOrders). Μία παραγγελία αγοράς αφορά ένα ή περισσότερα προϊόντα προς αγορά. Η παραγγελία συνδέεται επίσης με τον υπάλληλο (Employees) που την πραγματοποιεί και με τον τρόπο αποστολής (ShippingMethods). Το διάγραμμα οντοτήτων συσχετίσεων για τη βάση δεδομένων φαίνεται παρακάτω: α) Δώστε το σχήμα της παραπάνω βάσης σε ODL και σε SQL:1999. Για το δεύτερο να δημιουργηθούν τα σχήματα με βάση ορισμούς ROW TYPES. β) Γράψτε σε SQL:1999 χωρίς τη χρήση συνδέσεων (joins) τις παρακάτω ερωτήσεις: i) Βρείτε τα ονόματα όλων των υπαλλήλων που έκαναν μία παραγγελία με προμηθευτή είτε Smith ή Jones. ii) Βρείτε τα ονόματα όλων των υπαλλήλων που έκαναν παραγγελία με προμηθευτή Smith και παραγγελία με προμηθευτή Jones. iii) Βρείτε τα ονόματα των υπαλλήλων που έχουν τουλάχιστον μία παραγγελία προϊόντος κατηγορίας A. 1
Λύση α) ODL: interface Supplier (extent Suppliers key SupplierID) attribute string SupplierID; attribute string SupplierName; relationship set <PurchaseOrder> Supplies inverse PurchaseOrder::Supplier; interface Employee (extent Employees key EmpID) attribute integer EmpID; attribute string EmpName; relationship set <PurchaseOrder> MadePO inverse PurchaseOrder::POfrom; interface ShippingMethod (extent ShippingMethods key ShippingMethodID) attribute string ShippingMethodID; attribute string ShippingMethodName; relationship set <PurchaseOrder> POsShipped inverse PurchaseOrder::HowShipped; interface PurchaseOrder (extent PurchaseOrders key PurchaseOrderID) attribute integer PurchaseOrderID; attribute date OrderDate; relationship Supplier Supplied inverse Supplier::Supplies; relationship Employee POfrom inverse Employee::MadePO; relationship ShippingMethod HowShipped inverse ShippingMethod::POsByShipped; relationship set <InventoryPurchase> Items inverse InventoryPurchase::FromPO; interface Category (extent Categories key CategoryID) attribute integer CategoryID; attribute string CategoryName; relationship set <Products> ProductsOfCategory inverse Products::HasCategory; interface Product (extent Products key ProductID) 2
attribute integer ProductID; attribute string ProductName; attribute integer UnitPrice; relationship Category HasCategory inverse Category::ProductsOfCategory; relationship set <InventoryPurchase> Purchases inverse InventoryPurchase::ForProduct; interface InventoryPurchase (extent InventoryPurchases) attribute integer UnitsOrdered; relationship Product ForProduct inverse Product::Purchases; relationship PurchaseOrder FromPO inverse PurchaseOrder::ForProduct; SQL:1999: CREATE ROW TYPE SupplierObj SupplierID Varchar(40), SupplierName Varchar(40), Supplies Set(Ref(PurchaseOrder)) CREATE TABLE Supplier OF ROW TYPE SupplierObj; CREATE ROW TYPE EmployeeObj EmpID Integer, EmpName Varchar(40), MadePO Set(Ref(PurchaseOrder)) CREATE TABLE Employee OF ROW TYPE EmployeeObj; CREATE ROW TYPE ShippingMethodObj ShippingMethodID Varchar(40), ShippingMethodName Varchar(40), POsShipped Set(Ref(PurchaseOrder)) CREATE TABLE ShippingMethod OF ROW TYPE ShippingMethodObj; CREATE ROW TYPE PurchaseOrderObj PurchaseOrderID Integer, OrderDate Date, Supplied Ref(Supplier), 3
POfrom Ref(Employee), HowShipped Ref(ShippingMethod), Items Set(Ref(InventoryPurchase)) CREATE TABLE PurchaseOrder OF ROW TYPE PurchaseOrderObj; CREATE ROW TYPE CategoryObj CategoryID Integer, CategoryName Varchar(40), ProductsOfCategory Set(Ref(Products)) CREATE TABLE Category OF ROW TYPE CategoryObj; CREATE ROW TYPE ProductObj ProductID Integer, ProductName Varchar(40), UnitPrice Integer, HasCategory Ref(Category), Purchases Set(Ref(InventoryPurchase)) CREATE TABLE Product OF ROW TYPE ProductObj; CREATE ROW TYPE InventoryPurchaseObj UnitsOrdered Integer, ForProduct Ref(Product), FromPO Ref(PurchaseOrder) CREATE TABLE InventoryPurchase OF ROW TYPE InventoryPurchaseObj; β) i) SELECT DISTINCT e.empname WHERE p.supplied SupplierName = Smith OR p.supplied SupplierName = Jones ) 4
ii) SELECT DISTINCT e.empname WHERE p.supplied SupplierName = Smith ) AND 1<= (SELECT COUNT(*) WHERE p.supplied SupplierName = Jones ) iii) SELECT DISTINCT e.empname o FROM TABLE (po.items) inv WHERE inv.forproduct HasCategory CategoryName = A )) Σημειώνουμε ότι οι λύσεις είναι ενδεικτικές και πιθανόν να υπάρχουν και διαφορετικοί τρόποι λύσης. 5