Tietokantojen perusteet 4.4.2011 Jokainen osakysymys 1-6 arvostellaan erikseen ja kurssisuoritus vaatii jokaisen osan hyväksyttyä osaamista. Osa on voitu suorittaa kurssin aikana tai se voidaan suorittaa tentissä. Kaikki osat pitää olla suoritettu syyskuuhun 2011 loppuun mennessä, muuten osasuoritukset kuoleutuvat. Laitoksen opetuksen kehittämistyöryhmän päätöksen vuoksi ei kesätenttiä järjestetä ja tämän tentin jälkeen on vielä yksi tentti syksyllä. Jos siis saat tästä tentistä hylätyn, olet silti voinut olla hyväksytysti suorittanut esimerkiksi osat 1 ja 3. Tällöin sinun riittää yrittää seuraavassa tentissä vain osia 2,4,5 ja 6. Englanninkielisen ja suomenkielisen tentin kysymykset ovat erit. Vastaa vain toiseen tenttiin. Merkitse opiskelijanumerosi tenttipaperiin - ei henkilötunnusta. Basics of databases 4.4.2011 The course has six parts. Parts will be evaluated separately and you must pass every part. You must pass every part before October. After evaluation of this exam you will be informed, if you pass any single part (assuming that you have enrolled to the exam in Oodi). English and Finnish exams differ. English questions in the end.
OSA 1. CUSTOMER CID NAME STREETADDRESS ZIP P_OFFICE DESCRIPTION EMPLOYEE EID NAME STREETADDRESS ZIP P_OFFICE PROVISION ORDER ORDERNUMBER CUSTOMERID EMPLOYEEID DATE CUSTOMERID viittaa -> CUSTOMER(CID) EMPLOYEEID viittaa-> EMPLOYEE(EID) PRODUCT NAME PRICE PID DESC ORDER_ROW ORDERNUMBER ROWNUMBER PRODUCT QUANTITY ORDERNUMBER viittaa -> ORDER(ORDERNUMBER) PRODUCT viittaa -> PRODUCT(PID) Laadi seuraavat tietokantakyselyt relaatioalgebralla yo. kantaan. EI SAA KÄYTTÄÄ SQLkieltä! a). Luettele niiden asiakkaiden nimi ja osoite, jotka eivät ole kuusamolaisia eikä porilaisia. b) Luettele niiden työntekijöiden nimet, jotka eivät ole koskaan myyneet mitään. c) Luettele niiden työntekijöiden numerot, jotka ovat myyneet joskus kumin (rubber). d) Luette niiden asiakkaiden nimet, jotka ovat tehneet ainakin kaksi eri tilausta.
OSA 2. Englanninkielisten kysymysten lopussa on EER-kaavio. Revi se pois, kirjoita siihen nimesi ja palauta se vastauskonseptisi välissä. Tee siihen seuraavat korjaukset ja lisäykset. a) Sama henkilö ei voi olla sekä asunnonomistaja että asunnon vuokraaja. b) Samalla asunnolla voi olla useita vuokraajia. c) Tiedämme päivämäärän, milloin vuokralaisesta on viimeksi tarkistettu mahdolliset luottohäiriömerkinnät. d) Tiedämme, milloin kukin asunnon omistaja on kunkin asunnon ostanut, ja milloin omistaja on asunnosta luopunut. e) Me muistamme myös aikaisemmat omistajat. f) Vuokrattavana on sekä omakotitaloja (joista kiinnostaa: huoneiden lukumäärä, saunan olemassaolo, onko tontti oma ja osoite) sekä osakkeita (joista kiinnostaa huoneiden lukumäärä, saunan olemassaolo, osoite ja kiinteistöyhtiö). Yleistä tarpeellisilta osin. g) Kiinteistöyhtiöistä kiinnostaa nimi (tunniste), osoite ja puhelinnumero. h) Omakotitaloja vuokrataan vain pariskunnille. (Meillä pitää olla tieto avioliitoista) OSA 3. Taulu LASKU(numero, asiakasnumero, asiakasnimi, asiakasosoite, tuotenumero, tuoteovhhinta, tuotteenmäärätilauksessa, myyjänumero, loppusumma, alvsumma, tilauspvm, laskupvm) Yhteen tilaukseen kuuluu useita tuotteita. a) Määritä täydelliset funktionaaliset riippuvuudet b) Normalisoi c) Todista, että relaatio, jossa on tasan kaksi attribuuttia, on aina BCNF (ei vähemmän eikä enemmän)
OSA 4. Ohessa kolme samaa pankkitiliä vähentävää transaktiota samassa ajoitusjärjestyksessä. Aika kulkee ylhäältä alas. a) Huonostihan tuossa käy. Todista asia osoittamalla, että ajoitusjärjestys ei ole sarjallistuva. b) Missä tapahtuu likainen luku/lukuja (dirty read) c) Miten käy kun lukitaan vasta kun on pakko? (Yhteinen johdanto kysymyksille d ja e) : Käytetään konservatiivista kaksivaiheista lukitusta (transaktio ei käynnisty ilman kaikkia lukkoja) Transaktiot yrittävät käynnistyä ensimmäisen oman operaationsa kohdalla. Jos transaktio ei pääse käyntiin, se yrittää jokaisen muiden transaktioiden suoritettujen komentojen jälkeen uudelleen. Jos usea transaktio yrittää käynnistyä yhtäaikaa, niin T1 yrittää aina ensin, T2 sitten ja T3 viimeisenä. d) Paljonko tililtä nostetaan silloin kaiken kaikkiaan? e) Mikä on lopullinen ajoitusjärjestys (eli missä järjestyksessä yo. luku- ja kirjoitusoperaatiot tosiasiallisesti suoritetaan.)
OSA 5 Muokkaa / lisää allaolevaa java-koodia siten, että se lukee tol-nimisestä kannasta Työläisettaulusta (TYOLAISET(NIMI, NUMERO, SUKUPUOLI, OSOITE, PUHELIN)) kaikkien sellaisten työläisten tiedot, jotka ovat miehiä ja joilla on puhelin. Ohjelman tulee tulostaa nämä tiedot näytölle, ja sen lisäksi lisätä ko. tiedot test-kannassa olevaan pomot-nimiseen tauluun, jonka rakenne on muutoin samanlainen kuin tol-kannan työläiset-taulun, mutta sarakkeet ovat käänteisessä järjestyksessä. Kantana on mysql, ohjelmointikielenä java, ja ajurien asennukset, taulurakenteiden luonnit sekä palvelinyhteyden salauksen voi olettaa tehdyiksi ohjelman ajoympäristössä. import java.sql.*; public class ExamFlip { public static void main (String args[]) { try { Class.forName("org.gjt.mm.mysql.Driver").newInstance(); catch (Exception E) { System.err.println("Unable to load driver."); E.printStackTrace(); try { String url = "jdbc:mysql://localhost:3306/tol?user=testuser&password=testuser"; Connection MySQLcon = DriverManager.getConnection (url); Statement stmt = MySQLcon.createStatement (); OSA 6 catch (SQLException e) { e.printstacktrace(); Koskien EER-kaaviota Picture 1 (modifioitu Silberschatz et al). a) Kirjoita SQL-lauseet, joilla voit toteuttaa kaavion relaatiotauluina. b) Tee laatimiin tauluihn SQL-kysely, joka palauttaa kaikkien 12.12.1976 syntyneiden tiedot.
PICTURE 1
ENGLISH QUESTIONS PART 1. CUSTOMER CID NAME STREETADDRESS ZIP P_OFFICE DESCRIPTION EMPLOYEE EID NAME STREETADDRESS ZIP P_OFFICE PROVISION ORDER ORDERNUMBER CUSTOMERID EMPLOYEEID DATE CUSTOMERID references -> CUSTOMER(CID) EMPLOYEEID references -> EMPLOYEE(EID) PRODUCT NAME PRICE PID DESC ORDER_ROW ORDERNUMBER ROWNUMBER PRODUCT QUANTITY ORDERNUMBER references -> ORDER(ORDERNUMBER) PRODUCT references -> PRODUCT(PID) Define following queries by relational algebra to database above. DO NOT USE SQL. a). List names and adresses of the customers who are not from Kuusamo nor Pori. b) List the names of the employees who has never sold anything. c) List the numbers of the employees who has sold a rubber. d) List the names of the customers who has done at least two separate orders.
PART 2. In the end there is an EER-picture. Take it off, write your name on it and return inside your answer paper. Make following modifications to that EER-picture: a) The same person must not be both a tenant and a landlord. b) Group of persons can rent an appartment. c) We know the date when we have last checked credit rating of a tenant. d) We know the date when the landlord has bought the appartment and when he has sold it. e) We remember previous landlords of the appartment f) We rent both houses and condominiums. (Houses) number of rooms, area and address. (Condominiums) number of rooms, address and property company. g) Property company we know name (unique), and contact person s name and phone h) Only married couples can rent houses. (We must know marriages) PART 3. Consider the relation R, which has attributes that hold schedules of courses and sections at a university; R = {CourseNo, SecNo, OfferingDept, CreditHours, CourseLevel, InstructorSSN, Semester, Year, Days_Hours, RoomNo, NoOfStudents. Suppose that the following functional dependencies hold on R: {CourseNo -> {OfferingDept, CreditHours, CourseLevel {CourseNo, SecNo, Semester, Year -> {Days_Hours, RoomNo, NoOfStudents, InstructorSSN {RoomNo, Days_Hours, Semester, Year -> {InstructorSSN, CourseNo, SecNo Try to determine which sets of attributes form keys of R. How would you normalize this relation? ( Elmasri & Navathe)
PART 4. Following there is a schedule with three transactions that are all handling the same bank account item. Time goes down. T1 (tries to withdraw 800 ) Read (gets "1000") Write "200" (ie withdraw 800) T1, T2 and T3 commit here T2 (tries to withdraw100) Read (gets "1000") Write "900" T3 (tries to withdraw 800) Read (gets "200") Write nothing (the transaction cannot withdraw) a) That is not a good schedule. Prove that it is not serializable. b) Show dirty read/ dirty reads c) What happens if we are using optimistic 2PL? (Optimistic: we lock as late as possible) What about if... We use conservative 2PL so a transaction does not start at all if it does not get all locks. A transaction tries to start first time when there is the first of its operation. If it cannot start, it will try again after every operation of the schedule. If many transaction tries to start at the same time, T1 comes first and T3 last. d) After all, what will be a balance? e) What will be a true schedule (= order of operations in practice)
PART 5 Edit / insert the java code below so that it reads from a database named tol all information about workers who are male and who has a phone. (table WORKER(NAME, NUMBER, SEX, ADDRESS, PHONE). The program must print out these information to the screen, and in addition to that add the query information in question into a table named bosses in a database named test. The structure of the table bosses is similar to the table workers, except that the columns are in a reverse order. The database server in question is mysql, programming language to be used is Java, and all driver installations, table structure creations and server connection encryptions can be assumed to be taken care of in the execution environment of the program. import java.sql.*; public class ExamFlip { public static void main (String args[]) { try { Class.forName("org.gjt.mm.mysql.Driver").newInstance(); catch (Exception E) { System.err.println("Unable to load driver."); E.printStackTrace(); try { String url = "jdbc:mysql://localhost:3306/tol?user=testuser&password=testuser"; Connection MySQLcon = DriverManager.getConnection (url); Statement stmt = MySQLcon.createStatement (); PART 6 catch (SQLException e) { e.printstacktrace(); Check Picture 1. (Between Finnish and English questions) (modified from Silberschatz et al). a) Give SQL-commands to create proper tables. b) To created tables, give an SQL-query to find data of all people born 12.12.1976