| af Martin Elsman og Niels Hallenberg | sidst rettet 15. februar, 2002 |
Du må selv bestemme det emne som skal klassificeres, dvs. det behøver ikke at være restauranter.
Hovedsiden for servicen som ønskes konstrueret skal give et overblik over restauranter, sorteret efter brugeres vurderinger af kvaliteten. Indgangsbilledet kan eksempelvis se således ud:
En bruger har mulighed for
Ved et klik på linket med restaurantens navn ses de kommentarer som brugere af servicen har skrevet om restauranten:
Restauranterne klassificeres løbende efter hvordan brugere af systemet vurderer restauranterne. Der er ingen brugerkontrol, og dermed heller ikke kontrol med om en bruger rater den samme restaurant flere gange. Fra hovedsiden skal der således være links til en side til indtastning af kommentar og rating for en restaurant. Der skal også være en mulighed for at rate, dvs. oprette, en ny restaurant.
I systemet som du konstruerer vælger du selv hvilket emne som skal klassificeres - det kan altså være andet end restauranter der klassificeres! Øvelsen er opdelt i de fire sædvanlige opgaver:
sequence.) Der skal som minimum gemmes et navn på
hver restaurant.Den anden tabel skal knytte brugerindtastede kommentarer og ratings til restauranterne. Der skal som minimum være mulighed for at gemme en kommentartekst, navn, email og rating.
En datamodel, helt uden detaljer, kan f.eks. se således ud:
Du skal huske at overveje
Restaurant men
ikke nødvendigvis i tabellen svarende til Rating.
varchar(...) og integer. Det er
f.eks. nærliggende at have et felt rating af type integer
som angiver antal stjerner restauranten får. Du kan f.eks. indsætte et
check på at rating altid er et tal mellem 0 og 10:
create table rating ( ... rating integer, check(rating >= 0 and rating <= 10) );
not null.
unique
references.
drop table skal din rækkefølge være
korrekt. Antag f.eks., at du anvender to tabeller tab1 og
tab2, hvor tab2 refererer til
tab1, dvs. databasen checker at der til alle rækker i
tab2 findes referede rækker i tab1. Så skal
du slette tab2 før du sletter tab1,
idet rækkerne i tab2 jo henviser til rækker i
tab1.
Gem din datamodel i filen /web/login/www/oevelse9/rating.sql
på hug.it.edu
sammen med sql-kode for indsættelse af to restauranter med tilhørende
klassificeringer i tabellerne.
Endelig skal du starte SQL*Plus på hug.it.edu ved brug af ssh og udføre sql-kommandoerne:
SQL> @/web/login/www/oevelse9/rating.sql ... SQL> commit;SQL*Plus kommandoen
commit sikrer at dine
tabel-indsættelser bliver synlige for andre SQL*Plus vinduer og for
din web-server.
insert into rating (restaurant_id, text, email, fullname, rating) values (1, 'It is a great place for a snack!', 'nh@it.edu', 'Niels Hallenberg', 9);
select restaurant.restaurant_id, name,
avg(rating) as average, count(*) as ratings
from restaurant, rating
where restaurant.restaurant_id = rating.restaurant_id
group by restaurant.restaurant_id, name
order by average desc;
Tilpas ovenstående transaktioner til din datamodel og opskriv
eksempler på SQL-kommandoer for følgende transaktioner:
select)
Det kan anbefales at du nu sikrer dig--ved brug af SQL*Plus--at de
ovenstående transaktioner virker på din datamodel. Specielt er det
vigtigt at select kommandoen, som benytter sig af
group by funktionaliteten, virker efter hensigten; se
eventuelt SQL
for Web Nerds, kapitel 4 for information omkring group
by funktionaliteten.
Gem SQL-kommandoerne i en fil
/web/login/www/oevelse9/transaktioner.sql på hug.it.edu.
Indgangssiden til klassificering af restauranter er vist som en kasse øverst i diagrammet, som skal implementeres som en Tcl-fil, idet restauranter hentes fra databasen. De resterende kasser (tilstande) i diagrammet skal også implementeres som Tcl-filer, da disse kasser repræsenterer dynamiske sider (d.v.s., hvad brugeren ser i sin browser afhænger af indholdet i databasen og af eventuelle form-argumenter).
Det er din opgave at gøre tegningen ovenfor færdig. Der er to pile,
hvor Tcl-programmet rating_add kaldes. Du skal angive de
form-variable der mangler. Derudover er der en pil, hvor der slet ikke
er angivet noget program.
I den vejledende løsning indgår 4 filer:
rating.tcl, som viser alle restauranter i databasen
restaurant_add.tcl, som tilføjer en restaurant til
databasen, hvis den ikke findes i forvejen. I den vejledende løsning,
checkes først for, om der findes en form-variabel
restaurant_id i hvilket tilfælde, at navnet på
restauranten hentes fra databasen. Hvis restaurant_id
ikke findes, da checkes for om form-variablen name
findes. Hvis name findes, betyder det at en bruger vil
oprette en ny restaurant. Hvis den "nye" restaurant findes i forvejen,
så hentes navn og restaurant_id ud fra databasen. Hvis
den "nye" restaurant ikke findes i forvejen, så indsættes den i
databasen. Under alle omstændigheder, så returneres en form til
brugeren, hvor brugeren indtaster sin rating af restauranten. Formen
indeholder i alle tilfælde restaurant_id som skjult
variabel.
rating_add.tcl, som tilføjer en rating til en given
restaurant.
restaurant_show.tcl, som viser alle kommentarer og
ratings til en given restaurant.
Det anbefales, at du laver en tegning svarende til den ovenfor. På alle pile skal der være annoteret en Tcl-fil samt de form-variable, som overføres til Tcl-filen.
Til denne opgave skal du aflevere
/web/login/www/oevelse9/struktur.txt, eller som
en tegning svarende til den ovenfor, hvor der på alle pile er noteret
både Tcl-program og de form-variable som overføres. Hvis du vælger at
aflevere en tegning, så kan du evt. scanne en tegning skrevet i
hånden, og overføre filen til hug.it.edu
som /web/login/www/oevelse9/struktur.gif.
Det er en god ide at begrænse ratings til tal mellem 0 og 10. Til rapportering af ratings kan følgende tcl-procedure bruges:
proc genstars { n } {
if { $n == 0 } {
return ""
} else {
return "*[genstars [expr $n - 1]]"
}
}
Ved at kalde proceduren genstars med tallet
5 som argument, returneres en streng bestående af 5
stjerner. Rigtige stjerner såsom
må meget
gerne benyttes.
Vink: I filen rating.tcl har du brug for at
afrunde et kommatal til et heltal. Dette kan du gøre med
Tcl-kommandoen format. Du anvender en
select-kommando til at beregne snittet af alle ratings
pr. restaurant. Dette gennemsnit skal omformes til et heltal for at
kunne anvende procedureren genstars. Antag, at
kommatallet er i variablen average:
set average_int [format "%.0f" $average]