2013-03-10 11 views
8

Jestem zainteresowany wykorzystaniem tego ranking class, opartego na artykule od Evan Miller, aby ustawić tabelę, która ma upvotes i downvotes. Mam system bardzo podobny do systemu głosowania w górę/w dół Stack Overflow dla strony z wydarzeniami, nad którą pracuję, i używając tej klasy rankingowej mam wrażenie, że wyniki będą dokładniejsze. Moje pytanie brzmi: jak zamawiać przez funkcję "hotness"?Rankingi pozycji, kolejność według ufności za pomocą algorytmu Reddit Ranking

private function _hotness($upvotes = 0, $downvotes = 0, $posted = 0) { 
    $s = $this->_score($upvotes, $downvotes); 
    $order = log(max(abs($s), 1), 10); 

    if($s > 0) { 
     $sign = 1; 
    } elseif($s < 0) { 
     $sign = -1; 
    } else { 
     $sign = 0; 
    } 

    $seconds = $posted - 1134028003; 

    return round($order + (($sign * $seconds)/45000), 7); 
} 

Przypuszczam każdym razem, gdy użytkownik mógł głosów Mam kolumnę w moim stole, który ma dane Hotness przeliczane na nowe głosowanie, i aby przez ten kolumnie na stronie głównej. Ale jestem zainteresowany, aby zrobić to bardziej "w locie", wykorzystując powyższą funkcję, i nie jestem pewien, czy to możliwe.

Od Evan Miller, używa:

SELECT widget_id, ((positive + 1.9208)/(positive + negative) - 
        1.96 * SQRT((positive * negative)/(positive + negative) + 0.9604)/
          (positive + negative))/(1 + 3.8416/(positive + negative)) 
     AS ci_lower_bound FROM widgets WHERE positive + negative > 0 
     ORDER BY ci_lower_bound DESC; 

Ale ja raczej nie robić tego obliczenia w sql jak czuję, że to jest bałagan i trudno zmienić w dół linię gdybym wykorzystać ten kod na wielu stronach. itp.

+0

Spójrz na to, może ci to pomóc. http://blog.glocal.com/2012/12/tuning-your-own-reddit-style-ranking.html – Grigor

Odpowiedz

1

masz rację, zapytanie jak to jest raczej niechlujny i drogie, jak dobrze.

Mieszany PHP/MySQL w locie to zły pomysł, ponieważ trzeba będzie wybrać wartości dla wszystkich postów i obliczyć temperaturę, a następnie wybrać listę najcieplejszych. Bardzo drogie.

Należy rozważyć zapisanie przynajmniej części obliczeń w bazie danych. Zdecydowanie zamówienie powinno iść do bazy danych. Zawsze lepiej jest obliczyć coś i zapisać tylko raz przy każdym zapisaniu/aktualizacji, zamiast obliczać za każdym razem, gdy będzie wyświetlany. Spróbuj wykonać test porównawczy, ile czasu zaoszczędzisz, obliczając zamówienie przy zapisie/aktualizacji zamiast za każdym razem, gdy obliczasz temperaturę. Dobrze, że zamówienie nigdy się nie zmienia, chyba że ktoś awansuje/obniża notowania, które i tak zapisujesz na koncie, tak samo jak na znak.

Nawet jeśli zapiszesz znak w bazie danych, nie będziesz w stanie uniknąć obliczania w locie z powodu opublikowanego parametru znacznika czasowego.

Chciałbym zobaczyć, co robi różnica i gdzie robi różnicę i obliczyć gorliwość za pomocą skryptu CLI co x ilość czasu tylko dla tych skryptów, gdzie jest to kluczowe, co y czas, w którym robi się mniej różnica.

Przyjmując takie podejście, będziesz ponownie obliczał wzrost temperatury tylko wtedy, gdy będzie to konieczne. Dzięki temu twoja aplikacja będzie bardziej wydajna.

3

Uzyskiwanie dostępu do odpowiedniej tabeli "Wpisy" w przypadku dowolnej rzeczy (czytanie, pisanie, sortowanie, porównywanie itp.) Jest niezwykle szybkie, a zatem korzystanie z bazy danych jest najbardziej alternatywną alternatywą dla tymczasowe przechowywanie danych (pamięć/sesje są jeszcze szybsze, ale, logicznie, nie można ich użyć do przechowywania tych informacji).

Powinieneś być bardziej zaniepokojony budowaniem dobrego algorytmu rankingu dostarczającego pożądane wyniki (proponujesz dwa różne systemy, dostarczając różne wyniki) i pracujesz nad maksymalizacją efektywności całego kodu i komunikacji z bazą danych.

Co do zasady małe kody z kolejnymi, prostymi zamówieniami to najszybsze i najbardziej niezawodne rozwiązanie w tego rodzaju sytuacjach. Przykład:

  1. funkcja rankingowa (jak pierwszy proponujesz lub drugim wybudowanym na rangi zasad chcesz) nazywa każdym razem oceniany jest dany. Zapisuje do odpowiedniej kolumny w tabeli "Posty" (im prostsze zapytanie, tym lepiej: możesz utworzyć system rankingowy tak złożony, jak chcesz, ale spróbuj polegać na PHP zamiast na zapytaniach) .

  2. każdym razem wymagana jest porównanie między słupkami, tabela „Wiadomości” jest odczytywany za pomocą prostego SELECT uporządkowania zapisów przez Ranking (można mieć różne „Oceniając kolumny” (na przykład w górę głosów DOWN nie głosów, dalsze rozważania), ale lepiej mieć jedną z ostatecznym rankingiem ).

0

Nie jestem pewien, czy jest to możliwe z DB i schematu, czy jednak rozważyć napisanie UDF do niestandardowego sortowania?

post od stackoverflow rozmów o tym, jak to zrobić here.

Powiązane problemy