идея для движка форума:
+ позволяет обеспечить удобочитаемость и превентивное отсеивание мудаков и спамеров для постоянных пользователей.
Смысл в том, что ты проставляешь оценки постам, этими оценками пользуешься не только ты, но и твои друзья, для фильтрации сообщений с низким рейтингом.
1) каждому посту можно ставить оценки, скажем от -3 до +3.
2) пользователей можно добавлять в друзья и неприятели
для каждого пользователя рейтинг другого пользователя = [сумма оценок друзей] - [сумма оценок неприятелей] / [количество оценок среди друзей и неприятелей].
Ну можно то-же самое с рейтингом поста. Т.е. если у этого поста есть оценки среди друзей, то использовать оценки для конкретного поста, а не для автора.
Таким образом сообщения типа "Вася козёл" будет отсеиваться в 90% случаев, а сообщения, скажем, невменяемых сталинистов будут спокойно отсеиваться теми противниками сталинистов, которые не хотят читать их бред. Главное правильных людей включить в друзья.
Точно так-же сталинисты могут делать, выставляя оценки сторонникам либералов, которых они считают невменяемыми.
посчитаем:
для каждого пользователя - таблицы
author_ [author]
author_
[post_id] [author] [mark_owner] [value]
для каждого автора поста считаем рейтинг :
select sum(value) count(value) from author_ where (author_.[author] == .[mark_owner])
select sum(value) count(value) from author_ where (author_.[author] == .[mark_owner])
(fr.value - foe.value) / (fr.count + foe.count)
для каждого поста считаем рейтинг :
select sum(value) count(value) from author_ where (author_.[author] == .[mark_owner]) and (.[post_id] == #this_post_id#)
select sum(value) count(value) from author_ where (author_.[author] == .[mark_owner]) and (.[post_id] == #this_post_id#)
if( (post_marks_fr.count + post_marks_foe.count) = 0 ) then
используем рейтинг автора
else используем рейтинг поста + (рейтинг автора) * коэффициент.
самая большая таблица - с оценками.
на каждый потенциально-отображаемый пост два селекта из неё.
400 постов - на страничке - 800 селектов на пользователя.
100 000 пользователей, обновляются раз в 5 минут = 800*100тыс / 300 = 266 тыс селектов в секунду.
Это будет минимум 333 запроса в секунду. На каждый запрос по 3мс...
Т.е. 800 селектов в 3 мс.
Если я что-то понимаю в БД, то не пойдёт, слишком медленно. :(
Даже если сократить до 25 постов на страничку, то получится в 16 раз лучше, но всё-равно плохо.
Кроме того рейтинги нужно считать и для тех, кого не показываешь...
Немного можно улучшить ситуацию, если иметь кэш оценок
<пользователь> <-> <пользователь>.
на каждого залогиненного пользователя такой кэш из 100 элементов будет занимать 10байт * 100 = килобайт. Килобайт * 100тыс пользователей = 100мегабайт на всех. Не так уж и много и большая вероятность, попадания. Это позволит использовать селекты по маленькой(?) табличке и уж тем более, не выполнять селекты для сообщений одного и того-же пользователя...
Вот
форум Яблока*сообщений: 124839
*Зарегистрировано пользователей: 4106
*Рекорд посещаемости форума - 1577 = 60*60*24 = заход раз в 54 секунды. Ну пусть больше, ну один заход в секунду.
Для такого форума поиск среди 125тыс записей.
Общая табличка "каждый с каждым" пользователей займёт 16млн строк.
Легче сделать по табличке на каждого пользователя и туда помещать все оценки всех друзей.
... тогда полуается до фига update-ов.. :(