Структура нормальная. Говорю как человек, который использует такую же более чем на 10 миллионах строк с голосами.
Единственное, я бы делал запрос на выборку голосов не select * , а select user,val ведь id его голоса нам не нужен, а item у всех строк одинаковый. Ну, и пересчитывал бы рейтинг мероприятия всё таки при каждом голосовании, а не при просмотре результатов (хотя это зависит от того, что будет происходить чаще).
И чтобы проверять, гословал ли данный юзер за данное мероприятие, не помешает еще составной индекс по (user,item).