Opgavesæt 10: Online klassificeringssystem

for Databasestøttet Webpublicering

Fra opgavesæt af Martin Elsman og Niels Hallenberg sidst rettet 5. nov, 2002


I denne øvelse skal du konstruere et online klassificeringssystem. I opgaveteksten vil vi som eksempel beskrive et system til klassificering af restauranter. Brugerne opretter selv de restauranter, som de ønsker at evaluere.

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

  1. at rate en allerede oprettet restaurant med linket "rate it" til højre for restauranten.
  2. at oprette en ny restaurant, som derefter kan rates. Dette gøres ved at skrive navnet på den restaurant som skal rates i tekstfeltet nederst.
  3. at se alle kommentarer til en given restaurant ved at klikke på navnet på restauranten, dvs. den første kolonne "Restaurant".

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.

Øvelsen er opdelt i de fire sædvanlige opgaver:

  1. konstruktion af datamodel
  2. opstilling af legale transaktioner
  3. tilknytning af transaktioner til web-forms (HTML-sider)
  4. konstruktion af kode til at processere ovenstående web-forms (PHP-filer)

Opgave A (30 procent) - Datamodel

Som det første led i konstruktionen af et klassificeringssystem skal du konstruere en datamodel for systemet i form af to tabeller. Den første tabel skal definere de enkelte restauranter og knytte et unikt tal til hver restaurant. 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

  1. hvilke felter skal hver tabel indeholde.
  2. hvilke felter skal være primær-nøgle i hver tabel. Du bør have en primær-nøgle i den tabel der svarer til Restaurant men ikke nødvendigvis i tabellen svarende til Rating.
  3. hvilken type hvert felt skal have, f.eks. varchar(...) og integer. Det er f.eks. nærliggende at have et felt rating af type integer som angiver antal stjerner restauranten får.
  4. er der nogle felter, som du synes skal udfyldes, dvs. være not null.
  5. er der nogle felter, som du synes skal være unikke udover primær-nøglerne, dvs unique

Gem din datamodel i filen oevelse10/rating.sql sammen med sql-kode for indsættelse af to restauranter med tilhørende klassificeringer i tabellerne.

Endelig skal du udføre sql-kommandoerne

Opgave B (20 procent) - Legale transaktioner

I denne opgave skal du opskrive en række legale transaktioner for klassificeringsservicen. Her er to eksempler på legale transaktioner:

Tilknytning af en kommentar og en rating til en restaurant

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);   

Visning af restauranter, sorteret efter gennemsnitlig rating

SELECT
	restaurant.res_id,
	restaurant.name,
	avg(rating)
AS
	average,
	count(*)
AS
	ratings
FROM restaurant

LEFT JOIN
	rating
ON
	restaurant.res_id = rating.res_id 
GROUP BY
	restaurant.res_id,
	restaurant.name
ORDER BY
	average DESC
Tilpas ovenstående transaktioner til din datamodel og opskriv eksempler på SQL-kommandoer for følgende transaktioner:
  1. oprettelse af en ny restaurant i databasen -- uden tilknyttede kommentarer
  2. visning af kommentarer og ratings for en given restaurant (select)

Det kan anbefales at du nu sikrer dig - ved brug af MyAdmin - 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 www.mysql.com for information omkring group by funktionaliteten.

Gem SQL-kommandoerne i en fil oevelse10/transaktioner.sql

Opgave C (10 procent) - Webstrukturen

Du skal nu planlægge webstrukturen for klassificeringssystemet. Her er en skitse af hvordan systemet kan tænkes opbygget:

Kasserne repræsenterer HTML-kode, som brugeren ser.
Pilene repræsenterer PHP-programmer som f.eks opdaterer databasen og genererer friske HTML-sider til brugeren

 

Kasserne i diagrammet repræsenterer det webbaserede rating-systems tilstande for hvilke HTML-kode vises i en brugers browser. Pilene repræsenterer links til en ny tilstand. På hver pil skriver vi navnet på det PHP-program, som vi kalder samt de form-variabler der overføres. Nogle pile repræsenterer transaktioner for hvilke databasen opdateres (se opgave B) og brugeren ser en ændring i sin browser.

Indgangssiden til klassificering af restauranter er vist som en kasse øverst i diagrammet, som skal implementeres som en PHP-fil, idet restauranter hentes fra databasen. De resterende kasser (tilstande) i diagrammet skal også implementeres som PHP-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 PHP-programmet rating_add kaldes. Du skal angive de form-variabler der mangler. Derudover er der en pil, hvor der slet ikke er angivet noget program.

I den vejledende løsning indgår 4 filer:

Det anbefales, at du laver en tegning svarende til den ovenfor. På alle pile skal der være annoteret en php-fil samt de form-variable, som overføres til php-filen.

Til denne opgave skal du aflevere

  1. en beskrivelse af din web-struktur, som indeholder navne på de php-programmer ratingsystemet anvender samt, for hver php-fil de form-variable som filen forventer. Dette kan enten afleveres i en tekstfil oevelse10/struktur.txt, eller som en tegning svarende til den ovenfor, hvor der på alle pile er noteret både PHP-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 som oevelse10/struktur.gif.
Formålet med opgave C er ikke at du skal konstruere php-filerne for servicen, men at du planlægger navngivningen af filerne som indgår og planlægger hvilke formvariabler der skal overføres fra en side til en anden.

Opgave D (40 procent) - Konstruktion

I denne opgave skal du konstruere PHP-filerne for de dynamiske sider og for database-transaktionerne. Start med at konstruere de dynamiske sider for kasserne i diagrammet.

Det er en god ide at begrænse ratings til tal mellem 0 og 10. Til rapportering af ratings kan følgende php-funktion bruges:

function genstars(n) {
  if($n==0) { 
    echo "" 
  } else {
    echo "*".genstars($n - 1)
  }   
}
Ved at kalde funktionen 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.php har du brug for at afrunde et kommatal til et heltal. Dette kan du gøre med php-kommandoen round. 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 funktionen genstars. Antag at kommatallet er i variablen $average:

$iAverage = round($average *100),0) 

mejner@it-c.dk