Show 150 posts per page |
.dsy:it. (http://www.dsy.it/forum/)
- Basi di dati ~ informatica triennale (http://www.dsy.it/forum/forumdisplay.php?forumid=211)
-- calcolo affinità (http://www.dsy.it/forum/showthread.php?threadid=41299)
calcolo affinità
Sto penando per realizzare appropriatamente la funzione di calcolo dell'affinità ma ho paura di fare una roba pesantissima e malfatta.
Ho realizzato una funzione che calcola correttamente l'affinità tra 2 utenti, ma mi sembra scontato che iterarla su tutto il database e sortare selezionando i primi 100, è una cazzata.
Quindi vorrei sapere voi in linea generale come avete impostato, oppure se avete trovato qualche testo che spieghi i fondamenti per realizzare in maniera ottimale questo tipo di funzioni.
anche io ho questo problema, nel senso che non capisco quale dovrebbe essere il livello di affinità utile per comparire nella lista.
Se hai usato l'indicizzazione allora la selezione e/o l'iterazione vengono eseguite abbastanza velocemente. Se magari scrivete i requisite e cosa deve fare questa funzione magari vi vengono in aiuto anche utenti che non sono immersi nel vostro progetto...
__________________
.. ±·ø·±-`` MuSiC iS My LanGuAGe ´´-±·ø·± ..
ciao, io ho scritto una cosa del genere, ma mi sembra abbastanza complessa e non mi stampa proprio ciò che desidero:
<?php
function similare($login, $connection)
{
//QUI DOVREI INSERIRE UN CONTROLLO CHE SE GLI UTENTI SONO < 100 ALLORA LI STAMPO TUTTI
// SIMILARITà SUI GIOCHI POSSEDUTI
$query=" SELECT login FROM utente WHERE login<> '$login' "; //seleziono gli utenti diversi da quello che considero
$resource=pg_query ($connection, $query);
$key=0;
while($row=pg_fetch_row($resource, $i))
{
$count=0;
$que=" SELECT gioco FROM lista_posseduti WHERE utente='$row[0]' "; // seleziono i giochi posseduti dall'utente risultato della pg_fetch_row
$res=pg_query ($connection, $que);
while($ro=pg_fetch_row($res, $w))
{
if(empty($ro[0])) { break; }
else
{
$q=" SELECT count(*) FROM lista_posseduti WHERE gioco='$ro[0]' AND utente='$login' "; // conto se se il gioco puntato dal secondo pg_fetch_row è posseduto anche dall'utente che considero
$rs=pg_query ($connection, $q);
$r=pg_fetch_row($rs, $z);
if ($r[0]!=0) { $count++; }
}
$key=$count;
if (empty($simile[$key])) { $simile[$key]=$row[0]; } // in questa parte aggiorno un array che alla fine dovrà contentere i primi 100 utenti + simili
else { for($key_tmp=$key+1; key_tmp <=100; $key_tmp++)
{ if (empty($simile[$key_tmp])) { $simile[$key_tmp]=$row[0]; break; }}}
}
}
print_r ($simile);
}
?>
e comunque la richiesta sarebbe questa:
"applicazione segnala a ogni utente la lista dei primi 100
utenti a lui piu simili. La similarita fra utenti e misurata da un valore numerico proporzionale
al numero di giochi posseduti e desiderati in comune e al giudizio espresso su tali giochi." grazie
posto lo script di prima corretto, perchè c'erano delle cose errate:
<?php
function similare($login, $connection)
{
//QUI DOVREI INSERIRE UN CONTROLLO CHE SE GLI UTENTI SONO < 100 ALLORA LI STAMPO TUTTI
// SIMILARITà SUI GIOCHI POSSEDUTI
$query=" SELECT login FROM utente WHERE login<> '$login' "; //seleziono gli utenti diversi da quello che considero
$resource=pg_query ($connection, $query);
$key=0;
while($row=pg_fetch_row($resource, $i))
{
$count=0;
$que=" SELECT gioco FROM lista_posseduti WHERE utente='$row[0]' "; // seleziono i giochi posseduti dall'utente risultato della pg_fetch_row
$res=pg_query ($connection, $que);
while($ro=pg_fetch_row($res, $w))
{
if(empty($ro[0])) { break; }
else {
$q=" SELECT count(*) FROM lista_posseduti WHERE gioco='$ro[0]' AND utente='$login' "; // conto se il gioco puntato dal secondo pg_fetch_row è posseduto anche dall'utente che considero
$rs=pg_query ($connection, $q);
$r=pg_fetch_row($rs, $z);
if ($r[0]!=0) { $count++; }}
}
if($count!=0)
{
$key=$count;
if (empty($simile[$key])) { $simile[$key]=$row[0]; } // in questa parte aggiorno un array che alla fine dovrà contentere i primi 100 utenti + simili
else { for($key_tmp=$key+1; key_tmp <=100; $key_tmp++)
{ if (empty($simile[$key_tmp])) { $simile[$key_tmp]=$row[0]; break; }}}
}
}
for($scr=0; $scr<count($simile)+1; $scr++) {
echo "$simile[$scr]"; echo"<br>"; }
}
?>
Allora - in teoria - la soluzione migliore sarebbe di creare una funzione in PL/pgSQL. La funzione dovrebbe semplicemente selezionare tutti gli utenti, fare un join con i giochi e restituire una lista contenente nome e numero(tramite count()) di giochi tutto con un sort sul numero. Per concludere in php non vi resta che leggere l'output della funzione con un ciclo for da 0 a 99...
Usare le funzioni su postgres vi fa risparmiare tempo sui calcoli dato che un DBMS cerca sempre la via migliore senza che ci pensiate voi all'ottimizzazione.
__________________
.. ±·ø·±-`` MuSiC iS My LanGuAGe ´´-±·ø·± ..
Sì e sopratutto ti permette di avere un voto decente, perchè se ste cose le fai in PHP, ti fucilano alla discussione.
Originally posted by Chobeat
Sì e sopratutto ti permette di avere un voto decente, perchè se ste cose le fai in PHP, ti fucilano alla discussione.
__________________
.. ±·ø·±-`` MuSiC iS My LanGuAGe ´´-±·ø·± ..
grazie per il consiglio ... proverò a vedere se riesco a combinare qualcosa d + accettabile...al max vi scrivo
Mi sembra però che CowBoy tu la faccia un pò troppo facile.... nella tua breve spiegazione non trovo la verifica di somiglianza tra l'utente scelto e gli altri utenti !!
Il progetto di DB l'ho già superato. Stavo semplicemente condividendo la mia opinione riguardo il problema, in linea teorica... ovviamente nella realtà tutto dipende dai requisiti e dal modello creato.
__________________
.. ±·ø·±-`` MuSiC iS My LanGuAGe ´´-±·ø·± ..
All times are GMT. The time now is 18:28. | Show all 12 posts from this thread on one page |
Powered by: vBulletin Version 2.3.1
Copyright © Jelsoft Enterprises Limited 2000 - 2002.