Продължение на тема от раздел PHP

vinsbg

Registered
Понеже темата приключи там искам да коментираме тук. Става въпрос за тази тема:
http://web-tourist.net/forum/viewtopic.php?t=128105&start=0&postdays=0&postorder=asc&highlight=

Системата не е готова. Аз си я пиша по-малко и по колкото мога. Да предположим, че в таблицата със снимки имам 100 000 снимки и само на на 10 000 от тях има някакви вотове.
Когато таблицата е отделно ако искам да манипулирам после тези данни (коя снимка е с най-висок вот, най-нисък и т.н.) няма ли да е по-добре от гледна точка на перформанс да прерови таблица с 10к снимки отколкото 100к?
 
vinsbg каза:
Понеже темата приключи там искам да коментираме тук. Става въпрос за тази тема:
http://web-tourist.net/forum/viewtopic.php?t=128105&start=0&postdays=0&postorder=asc&highlight=

Системата не е готова. Аз си я пиша по-малко и по колкото мога. Да предположим, че в таблицата със снимки имам 100 000 снимки и само на на 10 000 от тях има някакви вотове.
Когато таблицата е отделно ако искам да манипулирам после тези данни (коя снимка е с най-висок вот, най-нисък и т.н.) няма ли да е по-добре от гледна точка на перформанс да прерови таблица с 10к снимки отколкото 100к?
Е логично е да е по-добре. Рекурсията в обработката ще е по-малка.
https://bg.wikipedia.org/wiki/%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F
 
Само заради тази гледна точка реших да е така.
Понеже очевидно не съм толкова напреднал като вас моля да ме поправите и как според вас ще бъде по-правилно и коректно да се направи.
 
От релационна гледна точка е най-добре да имаш pages и votes, pages е ясно, a във votes държиш page_id, ip, и vote_type - +1 или -1. След това всяка снимка извеждаш така:

[sql]select image, sum(vote_type) from pages left join votes on votes.page_id = pages.id group by pages.id;[/sql]

При гласуване проверяваш за ip-то и ако е свободно, добавяш ред. Иначе - "вече гласувахте"

Но понеже видях, че не правиш отделяне на гласуванията, ти казах да ги събереш таблиците в една, просто защото втората беше излишна :)

П.п. сега видях че съм написал пълна глупост в sql-a, оправих го :)
 
vinsbg каза:
Само заради тази гледна точка реших да е така.
Понеже очевидно не съм толкова напреднал като вас моля да ме поправите и как според вас ще бъде по-правилно и коректно да се направи.
Когато имаш 100 000 снимки примерно в базата създаваш нова таблица в която запаметяваш всяка снимка какъв вот има. Примерно както си казъл 10 000 снимки имат някакъв вот останалите 90 000 по дефаут са с 0. Навързваш таблицата за вот с тази на снимките и вадиш когато снимките имат вот. Така намаляваш рекрусията и сравненията вътрешно в MySQL. Представи си една таблица която има 50 снимки и 20 снимки от нея са запаметени в друга таблица с някакъв вот. Ти искаш да изведеш снимките които имат някакъв вот за класация. Изваждаш само таблицата с 20-те снимки и създаваш класацията, като реално можеш да си сортираш спокойно по поле за брой и така нататък. Спестяваш си минимум 30 интерации при изваждането от другата таблица на всички снимки и още поне 30 вътре в самият език за обработване и вадене на информацията. За 30 записа които не са с вот от общо 50-те в другата таблица ти спестяваш поне 60 интерации. Затова вадиш таблицата където имаш само някакъв вот за да намалиш интерациите обработвани в подадената SQL заявка и интерациите, които ти трябва да правиш за да обходиш полученият масив. :)
 
anonimen каза:
Но понеже видях, че не правиш отделяне на гласуванията, ти казах да ги събереш таблиците в една, просто защото втората беше излишна :)
В смисъл? Аз съм ги отделил ...
таблица за снимки и втората таблица за вота. Просто не запазвам 1, -1 а добавям 1 или махам 1 от записа.
Реално получавам
page_id = 1
positive = 244
negative = 13

А за IP адреса реших да не го добавям и рестриквам така по обясними причини, а да запазвам в кукита. Не че потребителя не може да ги изтрие, но все пак...
 
dakata__92 каза:
именно така си го обяснявам и аз и затова са ми в 2 таблици, за да селектвам от втората таблица, където са запазени id-тата на снимките, които имат някакъв вот..
 
vinsbg каза:
anonimen каза:
Но понеже видях, че не правиш отделяне на гласуванията, ти казах да ги събереш таблиците в една, просто защото втората беше излишна :)
В смисъл? Аз съм ги отделил ...
таблица за снимки и втората таблица за вота. Просто не запазвам 1, -1 а добавям 1 или махам 1 от записа.
Реално получавам
page_id = 1
positive = 244
negative = 13

А за IP адреса реших да не го добавям и рестриквам така по обясними причини, а да запазвам в кукита. Не че потребителя не може да ги изтрие, но все пак...
Под "отделяне" имам предвид че не правиш разлика между гласуванията - записваш просто броя, без самото гласуване.

Иначе, даката - напълно съм съгласен, но аз лично не бих го направил нито по единия, нито по другия начин. А с отделна таблица с всяко ip и поле +1 и -1 :?:

Просто ако някой цъкне 100 пъти +1 ще запише 100, което аз определено не искам в моето приложение :)
 
Да, да освен ако не е регистриран абонат и има система за едно кликване то с IP е най-лесното решение.
 
anonimen каза:
vinsbg каза:
anonimen каза:
Но понеже видях, че не правиш отделяне на гласуванията, ти казах да ги събереш таблиците в една, просто защото втората беше излишна :)
В смисъл? Аз съм ги отделил ...
таблица за снимки и втората таблица за вота. Просто не запазвам 1, -1 а добавям 1 или махам 1 от записа.
Реално получавам
page_id = 1
positive = 244
negative = 13

А за IP адреса реших да не го добавям и рестриквам така по обясними причини, а да запазвам в кукита. Не че потребителя не може да ги изтрие, но все пак...
Под "отделяне" имам предвид че не правиш разлика между гласуванията - записваш просто броя, без самото гласуване.

Иначе, даката - напълно съм съгласен, но аз лично не бих го направил нито по единия, нито по другия начин. С отделна таблица с всяко ip и поле +1 и -1 :?:
Поради каква причина, не е хубаво да записвам директно броя гласове?
И друго се сещам ако примерно е ip,+1,-1 .. .това не е ли подобно на първия пример 100к снимки, но само част от тях имат вот.

Тоест една снимка ако има 10 000 гласувания това са страшно много записи +1 и -1 за нея. А ако имам 10 000 снимки по 10 000 гласувания става огромна таблицата и пак доста време ще е нужно, за да я обходи.

Или се бъркам?
 
dakata__92 каза:
Да, да освен ако не е регистриран абонат и има система за едно кликване то с IP е най-лесното решение.
То е най-лесното, но така рискувам да отрежа цели мрежи примерно...
 
Трябва да избираш - в единия случай някой хакер като сложи един бот за цъкване на бутон ще навъртиш огромни числа за нула време, в другя ще имаш по-реални гласове, но - както казва даката - по-бавно ще върви.
Защо не направиш един тест? (за втория пример с таблицата с ip-тата)

PHP:
$prepare = "insert into votes set page=1 and vote=?";

for($i=0;$i < 90_000; $i++)
    $prepare->execute('1');

for($I=0; $i < 10_000; $i++)
    $prepare->execute('-1');

И вече ще имаш една таблица върху която да пробваш за колко време изпълнява...
 
vinsbg каза:
anonimen каза:
vinsbg каза:
В смисъл? Аз съм ги отделил ...
таблица за снимки и втората таблица за вота. Просто не запазвам 1, -1 а добавям 1 или махам 1 от записа.
Реално получавам
page_id = 1
positive = 244
negative = 13

А за IP адреса реших да не го добавям и рестриквам така по обясними причини, а да запазвам в кукита. Не че потребителя не може да ги изтрие, но все пак...
Под "отделяне" имам предвид че не правиш разлика между гласуванията - записваш просто броя, без самото гласуване.

Иначе, даката - напълно съм съгласен, но аз лично не бих го направил нито по единия, нито по другия начин. С отделна таблица с всяко ip и поле +1 и -1 :?:
Поради каква причина, не е хубаво да записвам директно броя гласове?
И друго се сещам ако примерно е ip,+1,-1 .. .това не е ли подобно на първия пример 100к снимки, но само част от тях имат вот.

Тоест една снимка ако има 10 000 гласувания това са страшно много записи +1 и -1 за нея. А ако имам 10 000 снимки по 10 000 гласувания става огромна таблицата и пак доста време ще е нужно, за да я обходи.

Или се бъркам?

Принципно това което си обясняваш е правилно, но анонимен също има много доводи от гледна точка на защитата да ти обяснява, че това е решението. Ако само регистрирани абонати имат право да гласуват то тогава ти е в пъъъъти ама пъти по-лесно решението. добавяш просто едно допълнително поле usersIdVote в което записваш 1,6,100,20 които са гласували и правиш една проверка if(in_array(5,explode(',',$row['usersIdVote']))){не запаметяваш}else{запаметяваш} и си спестяваш милион главоболия.
 
Хрумна ми един вариант, който обаче не знам доколко ще ти допадне - да обединиш и двете решения :D - просто защото всяко има твърде много предимства, за да избереш другото :)

Идеята е, че при гласуване записваш в голямата таблица с ip-та, а в същото време държиш кешната стойност в таблицата със страниците. И ще имаш един cron който да обновява кешнатата стойност - така хем ще имаш ip-ограничение, хем ще имаш производителността на най-първия вариант.

Единствения проблем ще е, че няма да са ти непрекъснато актуални вотовете :)
 
Не знам дали ви разбирам правилно, но ако записва ip на потребител не е много добре, защото аз ако влизам от вкъщи, от службата, от летището :D, ще съм всеки път с различно ip. Да не говорим че някой може да ползва разни проксита.
 
Аз примерите с 10к .. 100к снимки са само хипотетично, за да обясня по-добре какво искам да кажа.
Анонимен ти по този начин се пазиш от автоматизиран вот? А какво правиш, когато засечеш някоя снимка, че вчера е била с 20 харесвания, а днес е с 1000? Селектваш ID-то на снимката, после виждаш IP-to, което е гласува и ги триеш?

@dakata, така е ако имах user-и мога директно по ID да ги огранича, но аз нямам :)
 
teroristd каза:
Не знам дали ви разбирам правилно, но ако записва ip на потребител не е много добре, защото аз ако влизам от вкъщи, от службата, от летището :D, ще съм всеки път с различно ip. Да не говорим че някой може да ползва разни проксита.
Тогава ще трябва да забрани публичното гласуване и да ползва система за потребители :)
 
teroristd каза:
Не знам дали ви разбирам правилно, но ако записва ip на потребител не е много добре, защото аз ако влизам от вкъщи, от службата, от летището :D, ще съм всеки път с различно ip. Да не говорим че някой може да ползва разни проксита.

Или ако запазвам IP-то може да забраня без да искам мрежа от много хора примерно, които са зад рутер примерно и тогава пак проблем.
 
anonimen каза:
Хрумна ми един вариант, който обаче не знам доколко ще ти допадне - да обединиш и двете решения :D - просто защото всяко има твърде много предимства, за да избереш другото :)

Идеята е, че при гласуване записваш в голямата таблица с ip-та, а в същото време държиш кешната стойност в таблицата със страниците. И ще имаш един cron който да обновява кешнатата стойност - така хем ще имаш ip-ограничение, хем ще имаш производителността на най-първия вариант.

Единствения проблем ще е, че няма да са ти непрекъснато актуални вотовете :)
Да, но така става дълга и широка иначе е добра идеята. Ако само потребителите са му с тази достъпност то моето решение му е най-бързият и лесен начин да поправи тази дупка в системата за която алармираш. Ако всеки потребител има правото то вместо да записва userID е по-добре в полето да записва ip-тата на вички абонати да ползва explode и да проверява дали моментното ip отговаря на някое записано и така, както съм описъл вече. :)
 
По-добре да проверяваш по мейл. Не че не може някой да направи 10 мейла и да гласува но ще му е много по трудоемко, отколкото просто да влезне през прокси.
 

Back
Горе