Справедливо. Теперь мне мой вариант тоже не нравится =)
Всё же, прокомментирую некоторые моменты:
1. У варианта по расписанию - всё же латентность, а не инерция. Под инерцией имелось ввиду потеря актуальности старых данных после изменения правил на новые. Т.е. с таким алгоритмом данные будут неизбежно устаревать. Обычно это плохо, но не сейчас. Всё же, не дело отбирать старые медальки, если новые правила их не подразумевают - будет слишком болезненно, особенно если ачивка получена за год активного постинга. Если так важно брать неактуальные медальки, лучше уж руками чистить. Меньше будет самоубийств...
2. Латентность - да, есть, но это не проблема, т.к. уже есть задача по расписанию - пересчет кармы пользователя - и никто не ворчит, привыкли. Самый главный плюс - нет необходимости встраивать этот расчет (который может быть довольно сложным в итоге) - в каждое событие создания поста/голосования за пост. По идее, процесс формирования страницы должен быть максимально облегчен, а вся логика отдана на откуп фоновым заданиям. Думаю, сейчас именно так - и это очень хорошо. MVC, все дела...
По твоим пунктам:
2. Зачетные посты требуют отдельного списка. У нас же один ко многим - один пост в зачет сразу нескольких ачивок (postid, achievementid).
3. То же и со счетчиками. Опять отдельная табличка - (userid, achievementid, matches). На случай возможных глюков (где-то не прибавилось, где-то наоборот, зачлось два раза) можно её каждую ночь приводить в порядок согласно данным из п.2
И еще - имхо, любой статический счетчик - это потенциальный источник ошибок. Ничего плохого, если всё работает, но если можно без них - лучше без них.
С остальным согласен, беру свои слова насчет "слишком сложного" назад и спасибо за развернутый ответ.
В твоем варианте "на месте" надо
1. каждый раз для каждого поста выбирать список всех допустимых тегов ачивок (причем, условие выполняется часто).
2. Хранить где-то список постов, идущих в зачет.
3. Хранить где-то счетчики идущих в зачет постов.
4. Делать это каждый раз, когда изменяется любой из параметров формулы. В частности, каждый раз, когда пользователь голосует за пост.
Причем, твой вариант имеет большую инерцию. В случае ошибки алгоритма или любых изменений правил выдачи ачивок, все эти списки и счетчики придется вычищать/пересчитывать.
Если же делать по простому, то не нужно никаких доп.таблиц, достаточно запускать по расписанию пересчет медалек для всех профилей, имеющих не-личные, не-удаленные посты, которые имеют минимальный для любой медали рейтинг - и готово. Причем пересчитывать можно как для всех пользователей, так и только для тех, кто запостил новые посты с момента последнего пересчета. Тогда это будет шустро и сложность не будет ильно расти с ростом количества постов, а доля постов каждого пользователя всё равно небольшая в общей массе.
Плюсы - меньшая инертность, простота, сам алгоритм автономный, хорошо поддается распараллеливанию.
Минусы - всё равно придется выбирать все посты пользователя, значит если это будет топовый пользователь с большим общим количеством постов, время выполнения может начать расти.
Как-то сложно.
Надо просто выбрать и посчитать количество
из всех постов автора и всех тегов этих постов,
где тег совпадает с тегом ачивки и рейтинг поста больше или равен мин.рейтингу ачивки
из них выбрать ачивки,
имеющие количество найденных записей не менее, чем мин.количество постов ачивки.
Так для всех ачивок. Что останется - будет списком достижений юзера.
Вполне. Легче понять в контексте сказанного выше - прочитай пост в начале треда про реактор и игры.
ЗЫ С другой стороны, проблемы в реализации, а значит нет смысла настаивать на идее "равного старта". Если ачивки будут проще в реализации, больше шансов довести идею до конца.
>напрягать начинает Хех. Как быстро ты напрягся, первый пост с щекотливым вопросом, а ты уже хочешь всё бросить.
>Я хз, как начать считать все достижения с нуля Ясно, что это всё будет гораздо легче внедрить, если ачивки будут подобраны простыми в реализации и однозначно полезными для фэндома. Такие ачивки и быстро реализовать, и приживется легче, и глючить меньше будет, и поддерживать потом тоже легче. Так что если технически реализовать сложно, то и обсуждать нечего.
Тогда какой интерес? Никакого оревновательного духа не останется, если большинство постоянных постеров сразу получит почти полный комплект медалей.
Разве не интереснее, если старт гонки будет взят именно с момента их появления. Кто получит первые медали? Кто будет буксовать на старте? Кто самое слабое звено?
А самое главное - ведь медали вроде вводятся для ДАЛЬНЕЙШЕГО улучшения и РАЗВИТИЯ фэндома. Тогда логично вводить поощрение за будущие посты, активистам, а не по инерции. Чтобы был интерес постить именно здесь и сейчас, даже тем, у кого под 2к рейтига и выше. Не говоря уж о том, что гонка будет гораздо интереснее и веселее, если все стартуют с одной стартовой линии, без форы.
Правда, тут больше вопрос, готовы ли старожилы на такой эксперимент. Если нет, то тогда и смысла нет. Ведь уход любого из постоянных постеров из-за обиды на недополученные медальки - это будет гораздо хуже, чем все медальки вместе взятые,
Прям какая-то медаль Гэндальфа. Так и представляю, очередной Матросов врывается в тред, видит срач, рвет на груди тельняшку, попутно доставая посох: - Бегите, глупцы!, - он оперативно оттесняет наивных пользователей в безопасное место. Да, теперь все в безопасности. Настало время разобраться с причиной беспорядков, с древним злом, восставшим из самых глубин ада!
Он поворачивается к пылающему источнику срача. Лицо тут же обдает жаром, поле боя заполняет удушающий запах серы, но глаза полны решительности. Он не дрогнет. Теперь это только его бой. Теперь зло будет непременно повержено и срач прекращен! Теперь ты не пройдешь! Фторос.
срачИгра в снежки уровня /b/Всё же, прокомментирую некоторые моменты:
1. У варианта по расписанию - всё же латентность, а не инерция. Под инерцией имелось ввиду потеря актуальности старых данных после изменения правил на новые. Т.е. с таким алгоритмом данные будут неизбежно устаревать. Обычно это плохо, но не сейчас. Всё же, не дело отбирать старые медальки, если новые правила их не подразумевают - будет слишком болезненно, особенно если ачивка получена за год активного постинга. Если так важно брать неактуальные медальки, лучше уж руками чистить. Меньше будет самоубийств...
2. Латентность - да, есть, но это не проблема, т.к. уже есть задача по расписанию - пересчет кармы пользователя - и никто не ворчит, привыкли. Самый главный плюс - нет необходимости встраивать этот расчет (который может быть довольно сложным в итоге) - в каждое событие создания поста/голосования за пост. По идее, процесс формирования страницы должен быть максимально облегчен, а вся логика отдана на откуп фоновым заданиям. Думаю, сейчас именно так - и это очень хорошо. MVC, все дела...
По твоим пунктам:
2. Зачетные посты требуют отдельного списка. У нас же один ко многим - один пост в зачет сразу нескольких ачивок (postid, achievementid).
3. То же и со счетчиками. Опять отдельная табличка - (userid, achievementid, matches). На случай возможных глюков (где-то не прибавилось, где-то наоборот, зачлось два раза) можно её каждую ночь приводить в порядок согласно данным из п.2
И еще - имхо, любой статический счетчик - это потенциальный источник ошибок. Ничего плохого, если всё работает, но если можно без них - лучше без них.
С остальным согласен, беру свои слова насчет "слишком сложного" назад и спасибо за развернутый ответ.
1. каждый раз для каждого поста выбирать список всех допустимых тегов ачивок (причем, условие выполняется часто).
2. Хранить где-то список постов, идущих в зачет.
3. Хранить где-то счетчики идущих в зачет постов.
4. Делать это каждый раз, когда изменяется любой из параметров формулы. В частности, каждый раз, когда пользователь голосует за пост.
Причем, твой вариант имеет большую инерцию. В случае ошибки алгоритма или любых изменений правил выдачи ачивок, все эти списки и счетчики придется вычищать/пересчитывать.
Если же делать по простому, то не нужно никаких доп.таблиц, достаточно запускать по расписанию пересчет медалек для всех профилей, имеющих не-личные, не-удаленные посты, которые имеют минимальный для любой медали рейтинг - и готово. Причем пересчитывать можно как для всех пользователей, так и только для тех, кто запостил новые посты с момента последнего пересчета. Тогда это будет шустро и сложность не будет ильно расти с ростом количества постов, а доля постов каждого пользователя всё равно небольшая в общей массе.
Плюсы - меньшая инертность, простота, сам алгоритм автономный, хорошо поддается распараллеливанию.
Минусы - всё равно придется выбирать все посты пользователя, значит если это будет топовый пользователь с большим общим количеством постов, время выполнения может начать расти.
Надо просто выбрать и посчитать количество
из всех постов автора и всех тегов этих постов,
где тег совпадает с тегом ачивки и рейтинг поста больше или равен мин.рейтингу ачивки
из них выбрать ачивки,
имеющие количество найденных записей не менее, чем мин.количество постов ачивки.
Так для всех ачивок. Что останется - будет списком достижений юзера.
Вполне. Легче понять в контексте сказанного выше - прочитай пост в начале треда про реактор и игры.
ЗЫ С другой стороны, проблемы в реализации, а значит нет смысла настаивать на идее "равного старта". Если ачивки будут проще в реализации, больше шансов довести идею до конца.
Хех. Как быстро ты напрягся, первый пост с щекотливым вопросом, а ты уже хочешь всё бросить.
>Я хз, как начать считать все достижения с нуля
Ясно, что это всё будет гораздо легче внедрить, если ачивки будут подобраны простыми в реализации и однозначно полезными для фэндома. Такие ачивки и быстро реализовать, и приживется легче, и глючить меньше будет, и поддерживать потом тоже легче.
Так что если технически реализовать сложно, то и обсуждать нечего.
Разве не интереснее, если старт гонки будет взят именно с момента их появления. Кто получит первые медали? Кто будет буксовать на старте? Кто самое слабое звено?
А самое главное - ведь медали вроде вводятся для ДАЛЬНЕЙШЕГО улучшения и РАЗВИТИЯ фэндома. Тогда логично вводить поощрение за будущие посты, активистам, а не по инерции. Чтобы был интерес постить именно здесь и сейчас, даже тем, у кого под 2к рейтига и выше. Не говоря уж о том, что гонка будет гораздо интереснее и веселее, если все стартуют с одной стартовой линии, без форы.
Правда, тут больше вопрос, готовы ли старожилы на такой эксперимент. Если нет, то тогда и смысла нет. Ведь уход любого из постоянных постеров из-за обиды на недополученные медальки - это будет гораздо хуже, чем все медальки вместе взятые,
- Бегите, глупцы!, - он оперативно оттесняет наивных пользователей в безопасное место. Да, теперь все в безопасности. Настало время разобраться с причиной беспорядков, с древним злом, восставшим из самых глубин ада!
Он поворачивается к пылающему источнику срача. Лицо тут же обдает жаром, поле боя заполняет удушающий запах серы, но глаза полны решительности. Он не дрогнет. Теперь это только его бой. Теперь зло будет непременно повержено и срач прекращен!
Теперь ты не пройдешь!
Фторос.