PDA

View Full Version : [SQL] pagine web e query


Big Bamboo
11-08-2008, 19:31
Vi espongo subito il mio dubbio di natura teorica e poi una domandina più pratica.
Per hobby mi diletto nella programmazione web (attualmente .net), ma in tutti i corsi, tutorial sul web, libri ecc ecc non si fa mai accenno e non si discute il carico sul server prodotto dal rendering di una pagina web. Sapete dirmi se c'è qualche modo per sapere dopo aver realizzato una pagina quali parametri guardare per capire se risulta pesante la sua costruzione. Ad esempio al massimo quante query possono esserci all'interno di una pagina?

Passiamo alla pratica:
Gestisco un sito con annesso forum, vorrei dare la possibilità agli utenti registrati di votare le foto caricate sul sito dai loro colleghi. Ho già abbozzato la struttura dell' "entità" foto (comprensiva della valutazione), mi rimane il dubbio di come memorizzare i voti degli utenti perchè l'obiettivo è quello di non far votare più volte la stessa foto. (praticamente il servizio dovrà essere uguale a quello di youtube per i video)
Dato che non so rispondere alla prima domanda mi sto facendo tante di quelle pippe mentali che non immaginate nemmeno, per ridurre al minimo il numero di query e la quantità di dati letti.
Per dare un'idea dei numeri in gioco:
- circa 1000 utenti attivi
- sulle 200 foto per ora, ma prevedo un aumento in futuro

Ho anche abbozzato una possibile soluzione, ma prima di presentarvela aspetto qualche vostro suggerimento (giusto per non influenzare le vostre idee)

Grazie a tutti per l'attenzione

magix2003
11-08-2008, 19:43
Per la tua seconda domanda io farei una cosa del genere:

User(userid, nome, ecc)

Foto(fotoid, tuttigliattributichevuoi)

Votazione(userid, fotoid, voto)
FK: Votazione(userid) references User(userid)
Votazione(fotoid) references Foto(fotoid)

Big Bamboo
13-08-2008, 17:06
La struttura per la memorizzazione dei voti è come quella che avevo pensato io.
Inoltre per evitare ogni volta che la foto viene visualizzata calcolare il voto medio e le relative "stelline", nella tabella "foto" memorizzo il numero totale dei voti, il numero di votanti e le stelline attuali come intero (alla fine saranno 5 stelline con i mezzi voti). In questo modo uso i calcoli in virgola mobile solo nel momento in cui un utente vota una foto.

Visto che visualizzo 6 foto per volta, mi sorge il dubbio su come riconoscere quelle già votate dall'utente X. Faccio una query sulla tabella "voti" nella quale cerco solo quelli dell'utente X e poi scorro tra i risultati se è presente una foto di quelle visualizzate o inserisco direttamente nel WHERE gli id e faccio fare il lavoro di selezione al dbms?

Nessuno sa rispondere alla prima domanda?

Big Bamboo
03-09-2008, 23:55
Up

Magari qualcuno è tornato dalle vacanze e ha le risposte ai miei quesiti :)

cionci
04-09-2008, 10:59
Spiegati meglio: vuoi visualizzare le prossime 6 foto che non sono state dall'utente ?

Big Bamboo
04-09-2008, 13:16
Spiegati meglio: vuoi visualizzare le prossime 6 foto che non sono state dall'utente ?
Allora ogni utente ha la sua pagina con in media 6 foto. Il generico utente X sfoglia le varie pagine degli utenti, dei quali può già aver votato alcune foto.
Mi piacerebbe trovare un modo efficiente (minimizzare il numero di query) per capire quali foto sono già state votate da X e quindi abilitare il voto solo per le rimanenti. Adesso se rileggi il mio post precedente magari ti risulta il tutto più chiaro ;)

Mi piacerebbe più di tutto ricevere una risposta alla prima domanda del primo post

Sapete dirmi se c'è qualche modo per sapere dopo aver realizzato una pagina quali parametri guardare per capire se risulta pesante la sua costruzione. Ad esempio al massimo quante query possono esserci all'interno di una pagina?

cionci
04-09-2008, 14:37
Non è possibile rispondere a questa domanda perché varia troppo in funzione delle prestazioni del server.
Metti comunque un timer all'inizio e alla fine della pagina e dopo lo visualizzi. Così puoi valutare.

Per l'SQL:

SELECT fotoid.*, temp.userid AS votato
FROM Foto LEFT JOIN (SELECT * FROM Votazione WHERE userid = userid_che_sta_visitando_il_sito) AS temp ON Foto.fotoid = temp.fotoid
WHERE Foto.userid = userid_di_cui_si_stanno_visualizzando_le_foto;

Se votato è uguale all'userid allora significa che l'utente ha già votato per quella foto. Se è uguale a NULL allora non ha votato.

Big Bamboo
05-09-2008, 13:01
Proverò questa soluzione, grazie mille.