Vinnaren i pepparkakshustävlingen!
2011-08-05, 13:41
  #1
Medlem
Tjännare,

Funderar lite på hur man lättast löser det här. Jag använder PHP men det kanske enbart är en SQL query som behövs för lösningen, men jag är ute efter teorin mestadels för min PHP-sida.

Jag tänkte alltså ha en del videos länkade i databasen. På dessa skall man kunna rösta mellan 1-5 (eller 1-2 det är inte helbestämt). Nu funderar jag lite på hur man löser detta.

Lösning?: Varje röst får ett unikt index i databasen. Där sparas även användar-id och/eller ip-nummer för att undvika dubbla röster. Varje röst får även ett fält för unixdate. När man sedan skall ranka de populäraste för t ex senaste veckan så har man i querien med att bara räkna med unixdate som är mindre än en vecka gammal.

Nackdel?:
I teorin när man ska ranka kanske populäraste någonsin och sajten har några år på nacken och hundratusentals röster, blir inte detta oerhört krävande?

Finns det alternativa lösningar som drar mindre?
Citera
2011-08-06, 11:11
  #2
Medlem
ojns avatar
Japp, databasfråga (i alla fall än så länge). Flyttar från PHP.
/Moderator
Citera
2011-08-06, 11:18
  #3
Medlem
kh31d4rs avatar
Citat:
Ursprungligen postat av Ettglasintetre
Tjännare,

Funderar lite på hur man lättast löser det här. Jag använder PHP men det kanske enbart är en SQL query som behövs för lösningen, men jag är ute efter teorin mestadels för min PHP-sida.

Jag tänkte alltså ha en del videos länkade i databasen. På dessa skall man kunna rösta mellan 1-5 (eller 1-2 det är inte helbestämt). Nu funderar jag lite på hur man löser detta.

Lösning?: Varje röst får ett unikt index i databasen. Där sparas även användar-id och/eller ip-nummer för att undvika dubbla röster. Varje röst får även ett fält för unixdate. När man sedan skall ranka de populäraste för t ex senaste veckan så har man i querien med att bara räkna med unixdate som är mindre än en vecka gammal.

Nackdel?:
I teorin när man ska ranka kanske populäraste någonsin och sajten har några år på nacken och hundratusentals röster, blir inte detta oerhört krävande?

Finns det alternativa lösningar som drar mindre?

ett alternativ kan vara att ha lite redundans i databasen. behåll tabellerna för röster osv som de är, men lägg till en tabell där du håller reda på hur många röster/poäng varje video har. denna kan du hålla uppdaterad med till exempel en trigger på röst-tabellen.
Citera
2011-08-08, 17:55
  #4
Medlem
Citat:
Ursprungligen postat av kh31d4r
ett alternativ kan vara att ha lite redundans i databasen. behåll tabellerna för röster osv som de är, men lägg till en tabell där du håller reda på hur många röster/poäng varje video har. denna kan du hålla uppdaterad med till exempel en trigger på röst-tabellen.

Är inte helt säker på hur andra löser detta, men jag ser nästintill bara ett problem med detta. Ett klipp som las upp för kanske ett år se är då låst att aldrig kunna visas som populär under senaste veckan då. Kanske är detta bra, kanske inte, jag vet inte riktigt ännu. Men teoretiskt så kan ju ett 1 år gammalt klipp varit populärast under veckan som gått, men då uppladdningsdatumet är för gammalt så kan det ju inte visas under den kategorin.
Citera
2011-08-10, 00:16
  #5
Medlem
Citat:
Ursprungligen postat av Ettglasintetre
Nackdel?:
I teorin när man ska ranka kanske populäraste någonsin och sajten har några år på nacken och hundratusentals röster, blir inte detta oerhört krävande?
Nä egentligen inte - iaf inte sålänge du bara pratar hundratusentals röster.

Annars kommer redundans att spara lite tid vad gäller att hitta dessa men öka komplexiteten vid insättning av nya röster. Såtillvida du inte uppdaterar topplistan varje natt exemplevis (exempelvis imdb)...
Citera
2011-08-10, 06:36
  #6
Medlem
kh31d4rs avatar
Citat:
Ursprungligen postat av Ettglasintetre
Är inte helt säker på hur andra löser detta, men jag ser nästintill bara ett problem med detta. Ett klipp som las upp för kanske ett år se är då låst att aldrig kunna visas som populär under senaste veckan då. Kanske är detta bra, kanske inte, jag vet inte riktigt ännu. Men teoretiskt så kan ju ett 1 år gammalt klipp varit populärast under veckan som gått, men då uppladdningsdatumet är för gammalt så kan det ju inte visas under den kategorin.

va? vad har det med mitt förslag att göra? vill du inte ha med gamla klipp får du väl helt enkelt lägga till ett villkor som filtrerar bort allt du inte vill ha med. om du gör detta när du lägger till rösten eller när du hämtat ut topplistan spelar väl ingen större roll, men jag skulle nog göra det senare ur performancesynpunkt.
Citera
2011-08-11, 16:51
  #7
Medlem
Citat:
Ursprungligen postat av kh31d4r
va? vad har det med mitt förslag att göra? vill du inte ha med gamla klipp får du väl helt enkelt lägga till ett villkor som filtrerar bort allt du inte vill ha med. om du gör detta när du lägger till rösten eller när du hämtat ut topplistan spelar väl ingen större roll, men jag skulle nog göra det senare ur performancesynpunkt.

Jag kanske inte förklarade så bra, försöker igen.

Jag vill ju att även gamla klipp ska kunna visas under veckans populäraste, även om klippet i sig är ett år gammalt. Men om det under de 7 senaste dagarna blivit oerhört populärt igen så vore det ju skönt att på något sätt kunna visa enbart betygen för just de 7 senaste dagarna, och då filtrera bort alla röster som är äldre än 7 dagar.

Men jag kanske bara krånglar till det i onödan nu, och kanske ska skita i att visa ett 3 år gammalt klipp under veckans populäraste, och istället bara har denna kategori för nyare videoklipp. I så fall fungerar ju din lösning hur bra som helst.
Citera
2011-08-11, 17:09
  #8
Medlem
Alltså det låter ju som du vill ha koll på vilket klipp som fått mest "views" och inte någon röstningsfunktion, men vad vet jag?

Det simplaste är väl att spara en rating (från röster) i databasen för varje videoklipp och räkna ut därifrån hur "populärt" ett klipp är med hjälp av antal views (skapa upp en variable).
dvs du får ett decimal värde för varje klipp istället för att spara varje röst

Alltså ju mer jag tänker på detta desto fler sätt kommer jag på.

Jag hade INTE sparat IP nummer i min databas då jag ser det som något som inte funkar som ett unikt Id i dagens "IT-samhälle"...
Citera
2011-08-11, 17:22
  #9
Medlem
kh31d4rs avatar
Citat:
Ursprungligen postat av Ettglasintetre
Jag kanske inte förklarade så bra, försöker igen.

Jag vill ju att även gamla klipp ska kunna visas under veckans populäraste, även om klippet i sig är ett år gammalt. Men om det under de 7 senaste dagarna blivit oerhört populärt igen så vore det ju skönt att på något sätt kunna visa enbart betygen för just de 7 senaste dagarna, och då filtrera bort alla röster som är äldre än 7 dagar.

Men jag kanske bara krånglar till det i onödan nu, och kanske ska skita i att visa ett 3 år gammalt klipp under veckans populäraste, och istället bara har denna kategori för nyare videoklipp. I så fall fungerar ju din lösning hur bra som helst.

tre år gamla klipp kommer att visas om du gör som jag beskrev, såvida du inte filtrerar bort dem.
Citera
2011-08-12, 14:29
  #10
Medlem
Citat:
Ursprungligen postat av torst3n
Alltså det låter ju som du vill ha koll på vilket klipp som fått mest "views" och inte någon röstningsfunktion, men vad vet jag?

Det simplaste är väl att spara en rating (från röster) i databasen för varje videoklipp och räkna ut därifrån hur "populärt" ett klipp är med hjälp av antal views (skapa upp en variable).
dvs du får ett decimal värde för varje klipp istället för att spara varje röst

Alltså ju mer jag tänker på detta desto fler sätt kommer jag på.

Jag hade INTE sparat IP nummer i min databas då jag ser det som något som inte funkar som ett unikt Id i dagens "IT-samhälle"...

Röstningsfunktionen är väl nästintill samma sak som en views-funktion, fast man visar ett medelvärde istället för ett totalvärde?

Angående IP nummer så kan en erfaren IT-människa lätt komma förbi det, men för att generalisera en genomsnittsanvändare så tycker jag att det kan vara vettigt att förhindra dem att försöka "fuska". HTTP-protokollet har väl inget stöd för Mac ID eller liknande antar jag?

Citat:
Ursprungligen postat av kh31d4r
tre år gamla klipp kommer att visas om du gör som jag beskrev, såvida du inte filtrerar bort dem.

Hmm tror jag missförstod dig lite först då. Jag gör ett nytt försök så får vi se om jag greppat det.

Man sparar varje röst separat i databasen. Med hjälp av en trigger (eller ett cron job t ex) så går man igenom denna otroligt stora mängd data och kan få fram veckans populäraste (även om videon i sig är 1 år gammal, men man räknar bara rösterna på dess id som är under en vecka gammal).

Har jag förstått det nu? Hehe.

Edit:

Om man enbart ska ha veckans, månadens och genom tidernas populäraste röster så kan man ju egentligen ta bort alla röster som är äldre en månad då de aldrig kommer att behöva räknas igen om man sparat totalvärdet/medelvärdet i den andra tabellen. Det borde väl lätta en del på trycket?
__________________
Senast redigerad av Ettglasintetre 2011-08-12 kl. 14:31.
Citera
2011-08-12, 19:50
  #11
Medlem
Citat:
Ursprungligen postat av Ettglasintetre
Röstningsfunktionen är väl nästintill samma sak som en views-funktion, fast man visar ett medelvärde istället för ett totalvärde?

Angående IP nummer så kan en erfaren IT-människa lätt komma förbi det, men för att generalisera en genomsnittsanvändare så tycker jag att det kan vara vettigt att förhindra dem att försöka "fuska". HTTP-protokollet har väl inget stöd för Mac ID eller liknande antar jag?

Hur ska du göra med VPN/PROXY?

jaja lycka till jag tycker det börjar glida offtopic så jag ska inte lägga mig i mer..
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback