Первый раз занимаюсь написанием веб-приложения и возникают вопросы как правильнее было-бы поступить.
Вот например на хабре за топик можно проглосовать только один раз. Как это правильнее реализовать? Хранить с каждым топиком список проголосовавших пользователей? А если же объектов очень много, например комментарии?
Если нужны универсальные рейтинги, то нужно ещё хранить тип объекта. Например, в Django есть модель ContentType, в которой хранятся все возможные типы и тогда модель для рейтингов выглядит так:
ид_юзера, ид_типа_объекта, ид_объекта
Хмм, спасибо. Сейчас как раз посмотрел исходники одного движка, там также отдельная таблица, и под каждый голос создается запись.
Кстати как раз под эти дела мучаю джангу, и, видимо, нужно читать про проектирование бд, я думал что это всё как-то проще будет.
вести syslog, в который писать все события голосования (а может быть заодно и другие, типа создания сообщений/комментариев)
решит проблему и одноразового голосования, и голосования типа «раз в день»
просто пишете в логе кто, когда и за что проголосовал или ещё что сделал.
{ timestamp, who, action, what, how }
timestamp = когда
who = ссылка на юзера
action = «проголосовал» | «написал» | «насралвкарму» | итд
what = ссылка на объект реципиент действия
how = закодированные, например, в строку параметры действия, если надо (ну типа сколько голосов отдано, итп)
если проиндексировать по who и what всегда можно найти кто и за что уже голосовал.
кроме того, такой лог даст дополнительную инфу о происходящем в системе.
ну и да. проблема тут может возникнуть с сохранением ссылки на объект.
реляционки поддерживают foreing key только на одну таблицу (в gae можно хранить любые ключи).
для реляционки в качестве what нужно будет хранить какой-нить id объекта + название класса/модели/таблицы.